Получить реквизит элемента справочника по ссылке |
Я |
28.05.14 — 18:09
Тестовая конфигурация с нуля. Справочник «Номенклатура» содержит реквизит Цена (Число 15,2). Есть документ «Ввод остатков». В табличной части все банально, Номенклатура, Цена, Количество, Сумма. Пытаюсь в табличную часть документа подставить цену из реквизита Цена, не могу добраться до нее. В модуле формы документа использую событие ОбработкаВыбора(). Вот код
&НаКлиенте
Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;
ТекущиеДанныеТовары.Цена = ВыбранноеЗначение.Цена;
КонецПроцедуры
ВыбранноеЗначение.Цена = недопустимый реквизит, хотя ВыбранноеЗначение Тип СправочникСсылк.Номенклатура и значение есть в «Вычислить выражение»
1 — 28.05.14 — 18:15
получай цену на сервере
2 — 28.05.14 — 18:21
чтобы получить цену надо слазить в базу, а базы на клиенте нет
3 — 28.05.14 — 18:22
клиент про реквизиты реквизитов не в курсе…
4 — 28.05.14 — 18:23
(2) не дает создать обработчик на сервере (только без контекста)
Сделал так
&НаКлиенте
Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;
ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение)
Возврат ВыбранноеЗначение.Цена;
КонецФункции
Заработало ))
Спасибо!
5 — 28.05.14 — 18:23
(3),(4) я уловил уже. Спасибо!
6 — 28.05.14 — 18:24
Или есть способ оптимальнеекрасивее? В одну процедуруфункцию?
7 — 28.05.14 — 18:27
>ВыбранноеЗначение.Цена;
весь объект то читать зачем?
8 — 28.05.14 — 18:29
(7) Какой? Цена? Цена это реквизит числовой
9 — 28.05.14 — 18:30
(8) и ради одной цифры ты еретично читаешь весь объект…
10 — 28.05.14 — 18:32
(9) а как мне еще цифру получить как не через ссылку на объект?
11 — 28.05.14 — 18:33
богоподобным запросом
12 — 28.05.14 — 18:33
тфу, богоугодным
13 — 28.05.14 — 18:34
Запрос для того чтобы прочитать одну цифру оптимальнее?! О_о
14 — 28.05.14 — 18:37
(13) Как думаешь, что делает система, когда просишь её получить цену в ВыбранноеЗначение.Цена?
15 — 28.05.14 — 18:38
(12) А вот правда, чем лучше. Запрос (внутри) создастся и так и так, отбор будет одинаковый, на равенство ссылке.
На клиент уйдет все равно только одна цифра. Дельта получается на объем передачи лишних реквизитов между СУБД и сервером. Там должны быть такие копейки, что меньше ошибки измерения.
16 — 28.05.14 — 18:38
(13) В общем случае — да. При обращении через точку идет тот же самый запрос, только на все поля объекта, а не на одно. Зато выполняется кэширование объекта. При повторном обращении через точку к этому же объекту запроса уже не будет.
17 — 28.05.14 — 18:38
(14) наверное не В а ИЗ ВыбранноеЗначение.Цена
Хочешь сказать запрос и делает? Только по всему объекту?
18 — 28.05.14 — 18:39
>Как думаешь, что делает система
она убьет очередного котенка
19 — 28.05.14 — 18:40
(0) Посмотри, как в типовых обрабатывается изменение цены/количества/товара в ТЧ документа. Со всякими кэшированиями, чтобы по каждому чиху в базу не лазить, как в (4).
20 — 28.05.14 — 18:40
(16) ок, я примерно понял
21 — 28.05.14 — 18:40
(15) Далеко не всегда копейки. Объект может быть «тяжелым» — с большими табличными частями и хранилищами значений. А тянуться он будет весь, хотя нужен только один реквизит.
22 — 28.05.14 — 18:41
>При повторном обращении через точку к этому же объекту запроса уже не будет
скуль тоже данные кэшировать умеет
23 — 28.05.14 — 18:42
(19) нету типовой у меня…. Тем более подозреваю там цены вообще по нормальному — регистр сведений
24 — 28.05.14 — 18:43
Попробую переделать на запрос. Спасибо всем за направление вектора моих мыслей в правильную сторону ))
25 — 28.05.14 — 18:43
(16) О, точно. Правильно запросом, потому, что кэширование жрет ресурсов. Главное ведь проверял же недавно. (правда в толстом клиенте, и получение всего объекта. Идет в 5-10 раз быстрее, чем чтение одного поля через точку)
26 — 28.05.14 — 18:46
(25) так получается же кеширование жрет ресурсы а кешируется после Запроса?
27 — 28.05.14 — 18:49
(26) результат запроса в кеш не складывается, просто кладется в память. А получение реквизита ссылки через точку приводит к помещению данных объекта в хитросделанный кеш.
28 — 28.05.14 — 18:51
Ок
29 — 28.05.14 — 18:52
(23) ну.. типовую найти при желании — не проблема, было бы это желание.
А вопрос в подходе. В типовой данные из ТЧ кэшируются в переменную, при изменении, например, количества, кратность упаковки берется не из объекта через точку, а из таблицы кэшированных значений. И только если там нет — лезем на сервер.
Ну а так — дело ваше, конечно..
30 — 28.05.14 — 18:55
Ну, непосредственно по сабжевому моменту (выбор новой номенклатуры из списка), механизм кэширования значений в типовых ничем не поможет. И к этому механизму, если честно, у меня серьезные претензии. Какого хрена весь клиентский кэш постоянно гоняется на сервер??
31 — 28.05.14 — 18:56
По сабжу можно хитрее извратиться, через альтернативную форму выбора. Цену получать еще в динамическом списке формы, и возвращать её в документ при выборе вместе с номенклатурой.
32 — 28.05.14 — 18:59
Переделал
&НаКлиенте
Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные;
ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Ссылка», ВыбранноеЗначение);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Возврат ВыборкаДетальныеЗаписи.Цена;
КонецФункции
Так?
33 — 28.05.14 — 18:59
(31) я не очень силен в 8ке. Вот разбираюсь
34 — 28.05.14 — 19:00
(29) понял. Спасибо!
35 — 28.05.14 — 19:04
(29) в типовую я полезу когда буду делать «по правильному» с нормальными ценами (в регистре) и тп. Сейчас простой вопрос, зачем городить огород. Два ответа и все стало понятно.
36 — 28.05.14 — 19:04
Запрос то правильно сделал? (работает, но мало ли)
neetro
37 — 28.05.14 — 19:18
(31) понял идею, интересно.
Получение дополнительных реквизитов справочника
Автор bony_ann, 08 авг 2018, 12:50
0 Пользователей и 1 гость просматривают эту тему.
В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с.
Цитата: bony_ann от 08 авг 2018, 12:50
В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с.
Дополнительные реквизиты — это табличная часть справочника Номенклатура?
Сделайте цикл по строкам этой табличной части.
Примерно так можно получить:
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита", Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение КАК Реквизит
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
| И НоменклатураДополнительныеРеквизиты.Свойство = &Свойство";
Цитата: ДмитрийФ от 08 авг 2018, 13:29
Примерно так можно получить:
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИмяРеквизита", Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение КАК Реквизит
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
| И НоменклатураДополнительныеРеквизиты.Свойство = &Свойство";
Спасибо, но запрос вывел таблицу значений по каждой номенклатуре, а как получить отдельные значения в столбцах?
Надо не таблицу выбирать из Справочник.Номенклатура, а сразу запрос делать к Справочник.Номенклатура.ДополнительныеРеквизиты.
При этом можно сделать разные свойства в разных колонках, если знать заранее все свойства, через ВЫБОР получится.
Но если нужно автоматически, то через СКД в виде таблицы выводить.
Теги:
- Форум 1С
-
►
Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4 -
►
Конфигурирование, программирование в 1С Предприятие 8 -
►
Получение дополнительных реквизитов справочника
Похожие темы (5)
Поиск
Тема: Получение значения реквизита элемента из справочника в документ
-
17.05.2019, 09:54
#1
Гость форума
Получение значения реквизита элемента из справочника в документ
Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.
-
17.05.2019, 10:38
#2
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
Какая конфигурация? на какой платформе?
-
17.05.2019, 10:54
#3
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от MasterLoma
Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.Цена — это реквизит справочника «Номенклатура»?
Тогда можно обращаться без функции: Цена=Номенклатура.Цена;
Это должно быть прописано в процедуре «ПриВыбореНоменклатуры», которая назначается колонке «Номенклатура»вашей табличной части
-
17.05.2019, 11:07
#4
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
на клиенте он заполняет табличную часть….. не обратиться он объектно!
-
17.05.2019, 11:10
#5
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункции
-
Пользователь сказал cпасибо:
-
17.05.2019, 11:20
#6
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункциичасть
-
17.05.2019, 12:23
#7
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункцииМожно так:
&НаКлиенте
Процедура ТабличнаяЧасть1Номенклату� �аПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТабличнаяЧасть1.Т� �кущиеДанные;
УИ=ТекущиеДанные.Номенклат ура.УникальныйИдентификат� �р();
ТекущиеДанные.Цена=НайтиЦе ну(УИ);
КонецПроцедуры
&Насервере
Функция НайтиЦену(Реквизит)
ТекН=Справочники.Номенклат ура.ПолучитьСсылку(Реквизи т);
Возврат ТекН.Цена;КонецФункции
-
Пользователь сказал cпасибо:
-
17.05.2019, 14:03
#8
Гость форума
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
Какая конфигурация? на какой платформе?
1С:Предприятие 8.3, учебная версия (8.3.6.2014)
-
17.05.2019, 14:04
#9
Гость форума
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункцииСпасибо попозже попробую таким образом сделать.
Похожие темы
-
Ответов: 16
Последнее сообщение: 24.03.2017, 10:41
-
Ответов: 0
Последнее сообщение: 14.01.2014, 12:53
-
Ответов: 1
Последнее сообщение: 24.04.2012, 13:36
-
Ответов: 0
Последнее сообщение: 28.01.2012, 12:20
-
Ответов: 4
Последнее сообщение: 11.11.2011, 08:35
Социальные закладки
Социальные закладки
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
- BB коды Вкл.
- Смайлы Вкл.
- [IMG] код Вкл.
- [VIDEO] код Вкл.
- HTML код Выкл.
Правила форума
- Как создать элемент (группу) справочника?
- Как найти элемент справочника?
- Как удалить элемент справочника?
- Как перебрать элементы справочника?
- Как выбрать все элементы из определенной группы?
- Как перебрать элементы подчиненного справочника с помощью запроса?
- Как перебрать элементы подчиненного справочника с помощью выборки справочника?
- Как открыть форму списка (элемента) справочника?
- Как добавить запись в табличную часть элемента справочника?
- Как удалить строки из табличной части справочника?
- Как перебрать строки табличной части справочника?
- Как создать элемент в нужной группе?
- Как узнать, есть ли у текущего элемента подчиненные?
- Как узнать количество подчиненных элементов у выбранного элемента справочника?
- Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников нексолько?
- Как получить всех родителей выбранного элемента справочника?
- Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
- Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
- Как найти все элементы справочника, в которых не заполнен строковый реквизит?
- Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
- Как организовать программный выбор элемента справочника?
- Как сохранить фотографию сотрудника в справочнике «Сотрудники»?
Как создать элемент (группу) справочника?
НовыйЭлемент = Справочники.ДокументыУдостоверяющиеЛичность.СоздатьЭлемент(); НовыйЭлемент.Наименование = "военный билет"; // Установить другие реквизиты. // ..... НовыйЭлемент.Записать(); НовыйЭлемент = Справочники.Банки.СоздатьЭлемент(); // Получить ссылку на группу, в которой будет находиться новый элемент Родитель = Справочники.Банки.НайтиПоКоду("000000001"); НовыйЭлемент.Наименование = "АКБ"; НовыйЭлемент.Код = "000000011"; НовыйЭлемент.Родитель = Родитель; // Установить другие реквизиты // ..... НовыйЭлемент.Записать(); НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу(); // Получить ссылку на группу, в которой должна находиться создаваемая группа Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Обувь", Истина); НоваяГруппа.Наименование = "Модельная обувь"; НоваяГруппа.Родитель = Родитель; // Установить другие реквизиты // ..... НоваяГруппа.Записать(); // Создать новый элемент в корне справочника НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); НовыйЭлемент.Наименование = "IT отдел"; НовыйЭлемент.Записать(); // Получить ссылку на родителя для добавляемых элементов Родитель = НовыйЭлемент.Ссылка; // Создать дочерний элемент. НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Группа разработки"; НовыйЭлемент.Родитель = Родитель; НовыйЭлемент.Записать();
Как найти элемент справочника?
// Поиск по коду РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030"); Если РезультатПоиска.Пустая() Тогда // Выполнить действия, предусмотренные в случае, когда элемент не найден. КонецЕсли; // Поиск по наименованию РезультатПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Кроссовки"); // Поиск по реквизиту РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "К-120002");
Как удалить элемент справочника?
// Найти ссылки на удаляемый элемент. МассивСсылок = Новый Массив; МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); НайденныеСсылки = НайтиПоСсылкам(МассивСсылок); Если НайденныеСсылки.Количество() > 0 Тогда Сообщить("Нельзя удалять элемент, на него имеются ссылки"); Иначе УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(); УдаляемыйЭлемент.Удалить(); КонецЕсли; УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);
Как перебрать элементы справочника?
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; // Обращение к другим данным справочника // ..... КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |АВТОУПОРЯДОЧИВАНИЕ" ); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла;
Как выбрать все элементы из определенной группы?
Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |ГДЕ | Родитель = &Родитель |АВТОУПОРЯДОЧИВАНИЕ" ); Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла; Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |ГДЕ | Родитель В ИЕРАРХИИ(&Родитель) |АВТОУПОРЯДОЧИВАНИЕ" ); Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла;
Как перебрать элементы подчиненного справочника с помощью запроса?
Процедура ПереборПодчиненыхЭлементов(Контрагент) Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | КонтактныеЛица.Ссылка |ИЗ | Справочник.КонтактныеЛица КАК КонтактныеЛица |ГДЕ | КонтактныеЛица.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Контрагент); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл ОчереднойПодчиненый = Выборка.Ссылка; КонецЦикла; КонецПроцедуры
Как перебрать элементы подчиненного справочника с помощью выборки справочника?
Процедура ПереборПодчиненыхЭлементов(Контрагент) // Получить выборку по указанному контрагенту Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); Пока Выборка.Следующий() Цикл ОчереднойПодчиненый = Выборка.Ссылка; КонецЦикла; КонецПроцедуры
Как открыть форму списка (элемента) справочника?
Форма = Справочники.Номенклатура.ПолучитьФормуСписка(); Форма.Открыть(); Элемент = Справочники.Номенклатура.НайтиПоКоду("00070"); Форма = Элемент.ПолучитьФорму(); Форма.Открыть();
Как добавить запись в табличную часть элемента справочника?
ЭлементОбъект = СсылкаКонтрагент.ПолучитьОбъект(); НоваяСтрока = ЭлементОбъект.ВидыДеятельности.Добавить(); // Заполнить реквизиты НоваяСтрока.ВидДеятельности = ПолеВводаВидДеятельности; // ..... ЭлементОбъект.Записать();
Как удалить строки из табличной части справочника?
ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект(); ОбъектСправочника.ВидыДеятельности.Очистить(); ОбъектСправочника.Записать(); ОбъектСправочника = ВыбранныйЭлемент.ПолучитьОбъект(); // Создать структуру для отбора удаляемых строк СтруктураОтбора = Новый Структура("ВидДеятельности", ВыбранныйВидДеятельности); // Получить массив удаляемых строк ПодходящиеСтроки = ОбъектСправочника.ВидыДеятельности.НайтиСтроки(СтруктураОтбора); // Удалить строки Для Каждого ОчереднаяСтрока Из ПодходящиеСтроки Цикл ОбъектСправочника.ВидыДеятельности.Удалить(ОчереднаяСтрока); КонецЦикла; ОбъектСправочника.Записать();
Как перебрать строки табличной части справочника?
ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВидыДеятельности Цикл Сообщить(ТекущаяСтрока.ВидДеятельности); КонецЦикла;
Как создать элемент в нужной группе?
КодГруппы = "330100"; ПоискПоПолномуКоду = Ложь; // значение по умолчанию Группа = Справочники.Номенклатура.НайтиПоКоду(КодГруппы, ПоискПоПолномуКоду); Если Группа.Пустая() Тогда Группа = Справочники.Номенклатура.СоздатьГруппу(); Группа.Код = КодГруппы; Группа.Наименование = "Загруженные"; Группа.Записать(); ИначеЕсли НЕ Группа.ЭтоГруппа Тогда Сообщить("Найден элемент справочника с указанным кодом!"); // Предусмотреть прерывание алгоритма... КонецЕсли; Спр = Справочники.Номенклатура.СоздатьЭлемент(); Спр.Наименование = "Программно созданный"; // Реквизиты заполняются в соответствии с задачей // ..... Спр.Родитель = Группа.Ссылка; Спр.Записать(); Группа = Справочники.Номенклатура.Загруженные; КодЭлемента = "330100"; ПоискПоПолномуКоду = Ложь; // Значение по умолчанию Родитель = Справочники.Номенклатура.НайтиПоКоду(КодЭлемента, ПоискПоПолномуКоду); Если Родитель.Пустая() Тогда Родитель = Справочники.Номенклатура.СоздатьЭлемент(); Родитель.Код = КодЭлемента; Родитель.Наименование = "Загруженные"; Родитель.Записать(); КонецЕсли; Спр = Справочники.Номенклатура.СоздатьЭлемент(); Спр.Наименование = "Программно созданный"; // Реквизиты заполняются в соответствии с задачей // ..... Спр.Родитель = Родитель.Ссылка; Спр.Записать();
Как узнать, есть ли у текущего элемента подчиненные?
Выборка = Справочники.Номенклатура.Выбрать( , Владелец); Если Выборка.Следующий() = Истина Тогда // Есть подчиненные элементы. КонецЕсли; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ЕдиницыИзмерения.Ссылка |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдиницыИзмерения.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Владелец); Если НЕ Запрос.Выполнить().Пустой() Тогда // Есть подчиненные элементы! КонецЕсли;
Как узнать количество подчиненных элементов у выбранного элемента справочника?
Выборка = Справочники.ЕдиницыИзмерения.Выбрать( , Владелец); КоличествоЭлементов = 0; Пока Выборка.Следующий() Цикл КоличествоЭлементов = КоличествоЭлементов + 1; КонецЦикла; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК КоличествоЗаписей |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдиницыИзмерения.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Владелец); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда КоличествоЗаписей = Выборка.КоличествоЗаписей; КонецЕсли;
Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?
ВЫБРАТЬ СУММА(КоличествоПодчиненных) КАК КоличествоПодчиненныхЭлементов ИЗ (ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоПодчиненных ИЗ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения ГДЕ ЕдиницыИзмерения.Владелец = &Владелец ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.СерииНоменклатуры КАК СерииНоменклатуры ГДЕ СерииНоменклатуры.Владелец = &Владелец ) КАК ВложенныйЗапрос
Как получить всех родителей выбранного элемента справочника?
МассивРодителей = Новый Массив; Родитель = СсылкаНаЭлемент.Родитель; Пока НЕ Родитель.Пустая() Цикл МассивРодителей.Добавить(Родитель); Родитель = Родитель.Родитель; КонецЦикла; Для Каждого ТекущийРодитель Из МассивРодителей Цикл // Работа с текущим родителем КонецЦикла;
ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка = &Ссылка ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ
ТекущийЭлементНоменклатуры = ЭлементНоменклатура; Запрос = Новый Запрос( "ВЫБРАТЬ | Номенклатура.Родитель, | Номенклатура.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; Пока Истина Цикл Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Прервать; КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; Иначе Сообщить(ТекущийЭлементНоменклатуры); КонецЕсли; КонецЦикла; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; КонецЕсли; КонецЦикла;
Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
ВЫБРАТЬ Контрагенты.Ссылка, ВЫБОР КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код КОГДА (Контрагенты.Родитель.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Родитель.Код + "/" + Контрагенты.Код ИНАЧЕ Контрагенты.Родитель.Родитель.Код + "/" + Контрагенты.Родитель.Код + "/" + Контрагенты.Код КОНЕЦ КАК ПолныйКод ИЗ Справочник.Контрагенты КАК Контрагенты
Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
Запрос = Новый Запрос( "ВЫБРАТЬ | Контрагенты.Ссылка КАК Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | (Контрагенты.Наименование ПОДОБНО &ЧастьНаименования) И (НЕ Контрагенты.ЭтоГруппа) |ИТОГИ ПО | Ссылка ТОЛЬКО ИЕРАРХИЯ" ); Запрос.УстановитьПараметр("ЧастьНаименования", "%" + ПолеВводаПодстрока + "%");
Как найти все элементы справочника, в которых не заполнен строковый реквизит?
ВЫБРАТЬ ФизическиеЛица.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ГДЕ (ФизическиеЛица.ИНН = "") ВЫБРАТЬ ФизическиеЛица.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ГДЕ (ФизическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховойНомерПФР = " - -")
Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Родитель = &СтарыйРодитель"; Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Контрагент = Выборка.Ссылка.ПолучитьОбъект(); Контрагент.Родитель = НовыйРодитель; Контрагент.Записать(); КонецЦикла;
Как организовать программный выбор элемента справочника?
// Получить форму выбора справочника как подчиненную форме документа ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); // Открыть полученную форму ФормаВыбора.Открыть(); Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) ПолученноеЗначение = ЗначениеВыбора; // Дальнейшая обработка значения... КонецПроцедуры ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); Выбрано = ФормаВыбора.ОткрытьМодально(); Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка) // Запретить стандартную обработку. СтандартнаяОбработка = Ложь; // Получить форму выбора справочника как подчиненную полю ввода ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , Элемент); // Открыть полученную форму ФормаВыбора.Открыть(); КонецПроцедуры Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Отключить стандартную обработку (при необходимости) СтандартнаяОбработка = Ложь; ПолученноеЗначение = ВыбранноеЗначение; // Дальнейшая обработка значения... КонецПроцедуры
Как сохранить фотографию сотрудника в справочнике «Сотрудники»?
Процедура ЗагрузитьФотографию(Элемент) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = "Текст (*,*)|*.*"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = "Выберите картинку"; Если ДиалогОткрытияФайла.Выбрать() Тогда ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла); ЭлементХранилища = Новый ХранилищеЗначения(ВыбраннаяКартинка); Фотография = ЭлементХранилища; КонецЕсли; КонецПроцедуры ВыбФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла); элХранилища = Новый ХранилищеЗначения(ВыбФайл); Фотография = элХранилища;
На чтение 6 мин Просмотров 11.2к. Опубликовано 26.04.2017
Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.
- Создание элемента справочника
- Поиск элементов справочника
- Изменение элементов справочника
- Удаление элементов справочника
- Обход элементов справочника
- Выбор элементов справочника запросом
- Открытие форм справочника
Содержание
- Создание элемента справочника
- Поиск элементов справочника
- Изменение элементов справочника
- Удаление элементов справочника
- Обход элементов справочника
- Выбор элементов справочника запросом
- Открытие форм справочника
Создание элемента справочника
Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:
- Создание элемента или группы;
- Заполнение владельца (если справочник подчиненный);
- Заполнение родителя (если справочник иерархический);
- Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
- Заполнение табличных частей;
- Запись элемента.
Создание новой группы:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу(); // Создание группы
НоваяГруппа.Наименование = "Покупатели"; // Заполнение наименования
НоваяГруппа.Записать(); // Запись группы
Создание нового элемента:
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент(); // Создание элемента
НовыйЭлемент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Заполнение родителя
НовыйЭлемент.Наименование = "Ромашка ООО"; // Заполнение наименования
НовыйЭлемент.ИНН = "123456789"; // Заполнение реквизита
// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = "Адрес";
НоваяСтрока.Представление = "Москва";
НовыйЭлемент.Записать(); // Запись элемента
Поиск элементов справочника
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
- НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
- НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
- НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>, <Родитель>, <Владелец>)
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); // Поиск контрагента с кодом "123"
НайденныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("1", , , НайденныйКонтрагент); // Поиск подчиненного найденному контрагенту договора с номером "1"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Поиск элемента с наименованием "Покупатели"
НайденныйКонтрагент1 = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО", , НайденныйКонтрагент); // Поиск элемента с наименованием "Ромашка ООО" в группе "Покупатели"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "123456789"); // Поиск контрагента с ИНН "123456789"
Изменение элементов справочника
Для изменения реквизитов справочника необходимо выполнить следующие действия:
- Получить объект элемента справочника (метод ПолучитьОбъект(), возвращает тип СправочникОбъект.<Имя справочника>);
- Присвоить новые значения реквизитам объекта;
- Записать объект элемента справочника.
Программное изменение справочника возможно только на стороне сервера.
Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Наименование = "Новое наименование";
НоменклатураОбъект.Записать();
Удаление элементов справочника
Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.
Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления. В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.
Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.УстановитьПометкуУдаления(Истина);
// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.ПометкаУдаления = Истина;
КонтрагентОбъект.Записать();
Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.Удалить();
Обход элементов справочника
Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:
- Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
- ВыбратьИерархически(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.
Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты
Выборка = Справочники.Контрагенты.Выбрать(); // Получение выборки всех элементов справочника
Пока Выборка.Следующий() Цикл
//действия с очередным элементом
Сообщить(Выборка.Наименование);
КонецЦикла;
// Обход контрагентов из группы "Покупатели"
ГруппаПокупатели = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
Выборка = Справочники.Контрагенты.Выбрать(ГруппаПокупатели);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
// Обход договоров контрагента "Ромашка ООО"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО");
Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, НайденныйКонтрагент);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
// Обход контрагентов с пустым ИНН
// Реквизит ИНН должен быть проиндексирован!
Отбор = Новый Структура("ИНН", ""); // Структура может содержать только один элемент
Выборка = Справочники.Контрагенты.Выбрать(, , Отбор);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Выбор элементов справочника запросом
Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически(), на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.
Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Открытие форм справочника
Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение(<ОписаниеОповещенияОЗавершении>, <Значение>)
Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.
Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");
// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение(, Контрагент);
// Еще один способ открытия формы элемента
ПараметрыОткрытия = Новый Структура("Ключ", Контрагент);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыОткрытия);
// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение(, ГруппаКонтрагентов);
// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура("Ключ", ГруппаКонтрагентов);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаГруппы", ПараметрыОткрытия);
Внимание!
Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.
&НаСервере Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере() /// Как создать новый элемент справочника в 1с 8.3, 8.2 // создадим новый элемент справочника Города // с именем Владивосток Владивосток = Справочники.Города.СоздатьЭлемент(); Владивосток.Наименование = "Владивосток"; Владивосток.Записать(); /// Как создать новую группу справочника в 1с 8.3, 8.2 // создадим новую группу справочника Города ГородаУМоря = Справочники.Города.СоздатьГруппу(); ГородаУМоря.Наименование = "Города у моря"; ГородаУМоря.Записать(); /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2 // перенесём созданный Владивосток в группу "Города у моря" Владивосток.Родитель = ГородаУМоря.Ссылка; Владивосток.Записать(); /// Как внести изменения в элемент справочника по ссылке /// в 1с 8.3, 8.2 // найдём город Калькутта КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта"); Если Не КалькуттаСсылка.Пустая() Тогда // изменим и запишем численность жителей в городе Калькутта = КалькуттаСсылка.ПолучитьОбъект(); Калькутта.Численность = 1000000; Калькутта.Записать(); КонецЕсли; /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2 ПустаяСсылка = Справочники.Города.ПустаяСсылка(); Если ПустаяСсылка.Пустая() Тогда Сообщить("Ссылка действительно пустая."); КонецЕсли; /// Как узнать принадлежность элемента справочника группе /// с учетом уровней иерархии в 1с 8.3, 8.2 ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь"); РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия"); // проверим принадлежит ли город Пермь группе Россия Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда Сообщить("Элемент Пермь находится в группе Россия."); КонецЕсли; /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2 // скопируем элемент Пермь КопияПерми = ПермьСсылка.Скопировать(); КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ"; КопияПерми.УстановитьНовыйКод(); КопияПерми.Записать(); /// Как выяснить уровень вложенности элемента справочника /// в 1с 8.3, 8.2 Сообщить(КопияПерми.Уровень()); // 1 /// Как заблокировать элемент справочника перед изменениями /// в 1с 8.3, 8.2 // выполним блокировку элемента справочника // от изменения другими режимами или пользователями Пермь = ПермьСсылка.ПолучитьОбъект(); Если Не Пермь.Заблокирован() Тогда Пермь.Заблокировать(); // тут идёт какой-то долгий алгоритм // в результате которого мы меняем // заблокированный элемент Пермь.Численность = 5000; Пермь.Записать(); // и только потом освобождаем его // для других режимов и пользователей Пермь.Разблокировать(); КонецЕсли; /// Как заполнить новый элемент справочника на основании /// в 1с 8.3, 8.2 // в модуле справочника Города я определил процедуру // ОбработкаЗаполнения, которая обрабатывает ситуации // когда мы заполняем один элемент на основании // данных другого (см. в базе для скачивания) Хабаровск = Справочники.Города.СоздатьЭлемент(); Хабаровск.Заполнить( Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро") ); Хабаровск.Наименование = "Хабаровск"; Хабаровск.Записать(); /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2 // пометим на удаление только что созданный Хабаровск Хабаровск.УстановитьПометкуУдаления( Истина, // пометка удаления Ложь // включая подчиненные (если речь о группе справочника) ); // метод Записать вызывать не нужно КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьКлиентаПоИмени(Имя) Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя); КонецФункции /// Как открыть форму существующего элемента справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда) СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент); ОткрытьФорму( "Справочник.Клиенты.ФормаОбъекта", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму существующей группы справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда) СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу); ОткрытьФорму( "Справочник.Клиенты.ФормаГруппы", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму выбора элемента справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Был выбран элемент " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму выбора группы справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Была выбрана группа " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму списка справочника и /// установить отбор по реквизиту в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда) // откроем список клиентов, оставив // только мужчин ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской()); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора); ОткрытьФорму( "Справочник.Клиенты.ФормаСписка", ПараметрыФормы ); КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьПеречислениеМужской() Возврат Перечисления.Пол.Мужской; КонецФункции /// Как открыть форму списка справочника с нужным отображением /// в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда) // откроем список клиентов с отображением "Список" ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка"); ФормаСписка.Открыть(); ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список; КонецПроцедуры /// Как открыть форму только что созданного, но ещё /// не записанного элемента справочника в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда) // получаем форму нового справочника ФормаНовогоСправочника = ПолучитьФорму( "Справочник.Еда.ФормаОбъекта",,, Истина); // делаем копию её данных (так как напрямую их менять // нельзя) КопияДанныхФормы = ФормаНовогоСправочника.Объект; // заполняем эти данные на сервере ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы); // копируем заполненные данные в исходную форму КопироватьДанныеФормы(КопияДанныхФормы, ФормаНовогоСправочника.Объект); // показываем форму нового заполненного // элемента справочника пользователю ФормаНовогоСправочника.Открыть(); КонецПроцедуры &НаСервере Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы) // преобразуем данные формы в документ Еда = ДанныеФормыВЗначение(ДанныеФормы, Тип("СправочникОбъект.Еда")); Еда.Наименование = "Груша"; Еда.Калорийность = 500; // преобразуем документа обратно в данные формы ЗначениеВДанныеФормы(Еда, ДанныеФормы); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
1
2
Показывать по
10
20
40
сообщений
Новая тема
Ответить
ЗаЕц
Дата регистрации: 09.02.2009
Сообщений: 560
Печатная форма из документа (например реализация) в ней хочу получить реквизит товара, которого нет в документе, но есть в справочнике номенклатура<br>через документ много возни, придется прописывать реквизит и в документ, где-то было на форуме не могу найти, подскажите для тех кто в танке.<br>На прямую обратится к справочнику Номенклатура не выходит:<br> Справочник.Номенклатура.НужныйРеквизит<br>пишет, что «Номенклатура» не найдена.
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
«В 7.7:<br>ЗначениеНужногоРеквизита=»»»»;<br>Спр=СоздатьОбъект(«Справочник.Номенклатура»);<br>Если Спр.НайтиПоНаименованию(«Гайка»)=1 Тогда<br> ЗначениеНужногоРеквизита=Спр.НужныйРеквизит;<br>КонецЕсли;<br><br>Но чтобы каждый раз по наименованию (или по коду) не искать и каждый раз имеем дело с одним и тем же элементом справочника номенклатуры, надо его в какую нибудь константу поместить и потом делать так:<br><br>ЗначениеНужногоРеквизита=Константа.КакойТоИдентификатор.НужныйРеквизит;»
BelikovS
Дата регистрации: 05.03.2007
Сообщений: 1701
Я, наверно, не понял вопроса: например Реализация.Номенклатура.НужныйРеквизит
ЗаЕц
Дата регистрации: 09.02.2009
Сообщений: 560
Еще раз ))<br>в документе подцепляю печ.форму. В ней выводим таблицу: выбранный товар (из таблицы документа) — первый столбец и №Сертификата — второй столбец.<br><br>№Сертификата в доке нет, а заполняется он только в справочнике номенклатура для каждого товара.<br>Чтобы не добавлять №Сертификата в док.реализация, а напрямую обратится из ячейки печатной формы дока к реквизиту справочника<br> <br>Если ставить как предложил BelikovS, то опять же ошибка:<br><br>Реализация<<?>>.Номенклатура.НомСерт.Получить(ДатаДок)<br>Переменная не определена (Реализация)<br><br><br>…так еще попробовала Докум.Номенклатура.НомСерт.Получить(ДатаДок), но теперь другая ошибка<br>Докум.Номенклатура.НомСерт.Получить(ДатаДок<<?>>)<br>Переменная не определена (ДатаДок)<br><br>у меня №Сертификата — периодический<br>делаю в Торговля и склад 954
zak555 (398843952)
Дата регистрации: 27.03.2008
Сообщений: 4656
> Печатная форма из документа (например реализация) в ней хочу получить реквизит товара, которого нет в документе, но есть в справочнике номенклатура<br>> через документ много возни, придется прописывать реквизит и в документ, где-то было на форуме не могу найти, подскажите для тех кто в танке.<br>> На прямую обратится к справочнику Номенклатура не выходит:<br>> Справочник.Номенклатура.НужныйРеквизит<br>> пишет, что «Номенклатура» не найдена.<br><br>что за бред? наименование конфигурации??
ЗаЕц
Дата регистрации: 09.02.2009
Сообщений: 560
читайте выше<br>объясняю третий раз: торговля 954<br>в справочник «номенклатура» добавила новый периодический реквизит «№Сертификата»<br>добавила колонку в печ форму «реализации», теперь хочу напрямую из спр-ка в ячейку получить №Сертификата для каждого товара выбранного в реализации!<br>
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
«Ну и пишите:<br>Номенклатура.НомерСертификата.Получить(ДатаДок);»
ЗаЕц
Дата регистрации: 09.02.2009
Сообщений: 560
«> Ну и пишите:<br>> Номенклатура.НомерСертификата.Получить(ДатаДок);<br>ошибка:<br>Номенклатура<<?>>.НомСерт.Получить(ДатаДок)<br>Переменная не определена (Номенклатура)<br><br>»
zak555 (398843952)
Дата регистрации: 27.03.2008
Сообщений: 4656
«> читайте выше<br>> объясняю третий раз: торговля 954<br>> в справочник «номенклатура» добавила новый периодический реквизит «№Сертификата»<br>> добавила колонку в печ форму «реализации», теперь хочу напрямую из спр-ка в ячейку получить №Сертификата для каждого товара выбранного в реализации!<br>> <br><br>НеНужныйПериодРеквизит = Номенклатура.НомСерт.Получить(ДатаДок);<br><br><br>1. в справочнике номенклатуры добавлен реквизит НомСерт ?<br>2. в документ что-нибудь добавлялось?<br>p.s. до стандартный или самописный док и как он называется?»
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
Ну не Номенклатура, а Товар, я не помню как именован реквизит в ТиС в табличной части