При настройке макетов печатных форм, этикеток или ценников в конфигурации «1С:Управление торговлей 11» часто требуется вывести значение пользовательского реквизита (например, «Дата производства»), созданного через механизм дополнительных реквизитов и сведений. Разберем подробно, где хранятся эти данные и какими способами их можно получить в коде 1С.
Проанализируем структуру хранения данных в типовых конфигурациях на базе Библиотеки Стандартных Подсистем (БСП). В 1С:УТ 11 дополнительные реквизиты хранятся непосредственно в табличной части объекта-владельца:
Справочник.Номенклатура существует табличная часть ДополнительныеРеквизиты.ДополнительныеРеквизиты справочника Справочник.ХарактеристикиНоменклатуры.Табличная часть содержит две ключевые колонки: Свойство (ссылка на элемент плана видов характеристик ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения) и Значение (конкретное значение реквизита).
Обратите внимание: не следует путать дополнительные реквизиты с дополнительными сведениями. Дополнительные сведения хранятся отдельно во внешнем регистре сведений РегистрСведений.ДополнительныеСведения, в то время как реквизиты находятся в табличной части самого объекта.
Рассмотрим вариант извлечения значения реквизита прямо из табличной части номенклатуры при формировании печатной формы:
// 1. Находим нужное свойство в Плане видов характеристик
ДопРеквизит_ДатаПроизводства = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата производства");
Если ЗначениеЗаполнено(ДопРеквизит_ДатаПроизводства) Тогда
// 2. Ищем строку с этим свойством в табличной части "ДополнительныеРеквизиты"
СтрокаРеквизита = СтрокаТабЧасти.Номенклатура.ДополнительныеРеквизиты.Найти(ДопРеквизит_ДатаПроизводства, "Свойство");
Если СтрокаРеквизита <> Неопределено Тогда
// 3. Заполняем параметр области макета
ОбластьНоменклатура.Параметры.ДатаПроизводства = СтрокаРеквизита.Значение;
КонецЕсли;
КонецЕсли;
Рассмотрим более универсальный подход с использованием штатного модуля БСП УправлениеСвойствами. Функция ЗначениеСвойства автоматически определяет тип свойства (реквизит или сведение) и возвращает соответствующее значение:
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата производства");
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, Свойство);
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
ОбластьНоменклатура.Параметры.ДатаПроизводства = ЗначениеСвойства;
КонецЕсли;
Если требуется вывести данные для массива позиций номенклатуры или сформировать сложные данные для макета, оптимальным решением является запрос с левым соединением к табличной части:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ДопРеквизиты.Значение КАК ДатаПроизводства
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
| ПО ДопРеквизиты.Ссылка = Номенклатура.Ссылка
| И ДопРеквизиты.Свойство = &СвойствоДатаПроизводства
|ГДЕ
| Номенклатура.Ссылка = &СсылкаНаНоменклатуру";
Запрос.УстановитьПараметр("СсылкаНаНоменклатуру", ВыбраннаяНоменклатура);
Запрос.УстановитьПараметр("СвойствоДатаПроизводства", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата производства"));
РезультатЗапроса = Запрос.Выполнить();
СтрокаТабЧасти.Характеристика.ДополнительныеРеквизиты.НайтиПоНаименованию чувствителен к изменению названия реквизита пользователями. Для повышения надежности рекомендуется искать свойство по уникальному имени с помощью НайтиПоРеквизиту("Имя", ...) или фиксировать ссылку.Формат(Значение, "ДФ=dd.MM.yyyy").