В типовых конфигурациях 1С (таких как Комплексная автоматизация 1.1, Управление производственным предприятием 1.3 или Управление торговлей 10.3) многие реквизиты номенклатуры, включая производителя, страну происхождения или артикул поставщика, нередко хранятся не в реквизитах самого справочника Номенклатура, а в виде дополнительных свойств. Разберем, как устроена эта структура данных и как правильно извлечь значение свойства с помощью запроса или механизма СКД.
Механизм дополнительных реквизитов и свойств в классических конфигурациях базируется на двух ключевых объектах:
СвойстваОбъектов — содержит перечень самих свойств (например, «Производитель», «Цвет», «Размер»).ЗначенияСвойствОбъектов — хранит связку между конкретным объектом базы (поле Объект), назначенным свойством (поле Свойство) и выбранным значением (поле Значение).Разберем классический вариант построения запроса. Чтобы получить список номенклатуры и привязать к каждой позиции значение конкретного свойства, выполним левое соединение справочника Номенклатура с регистром сведений ЗначенияСвойствОбъектов.
Обратим внимание на условие соединения: фильтр по нужному свойству следует указывать непосредственно в секции ПО, а не во вложенном подзапросе или секции ГДЕ. Это позволяет СУБД оптимально задействовать индекс регистра по полям Объект и Свойство, а также сохранить в выборке товары, у которых свойство еще не заполнено.
Посмотрим на пример текста запроса:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Наименование КАК Наименование,
ЗначенияСвойств.Значение КАК Производитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
ПО Номенклатура.Ссылка = ЗначенияСвойств.Объект
И ЗначенияСвойств.Свойство = &СвойствоПроизводитель
ГДЕ
НЕ Номенклатура.ЭтоГруппа
В программном коде передадим ссылку на искомое свойство в параметры запроса:
Запрос = Новый Запрос;
Запрос.Текст = "..."; // Текст запроса выше
СвойствоПроизводитель = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Производитель");
Запрос.УстановитьПараметр("СвойствоПроизводитель", СвойствоПроизводитель);
Результат = Запрос.Выполнить();
Если отчет разрабатывается в Системе компоновки данных (СКД), соединять регистр вручную в тексте запроса вовсе не обязательно. Платформа 1С предоставляет штатный механизм работы с характеристиками.
Разберем по шагам настройку схемы компоновки данных:
Номенклатура.Ссылка).СправочникСсылка.НоменклатураПланыВидовХарактеристик.СвойстваОбъектов (Поле ключа — Ссылка, Поле имени — Наименование)РегистрыСведений.ЗначенияСвойствОбъектов (Поле объекта — Объект, Поле свойства — Свойство, Поле значения — Значение)После этой настройки в доступных полях отчета у объекта Номенклатура автоматически появится дочерняя ветка со всеми существующими свойствами, включая Номенклатура.Производитель. Поле можно выводить в колонки, использовать в группировках, сортировках и отборах без усложнения текста запроса.
Проанализируем технические детали, которые уберегут от распространенных ошибок и снижения производительности:
ВЫРАЗИТЬ: Поле Значение в регистре сведений имеет составной тип данных. Если в дальнейшем запросе требуется обращаться к реквизитам полученного значения (например, к коду или наименованию производителя), обязательно применяем оператор явного приведения типа:
ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК Справочник.ЗначенияСвойствОбъектов)
Это исключит избыточные неявные соединения со всеми таблицами, входящими в составной тип характеристики.ГДЕ ЗначенияСвойств.Свойство.Наименование = "Производитель" или проверка по коду (Код = "03") создают скрытые соединения через точку и являются ненадежными (наименование свойства может быть переименовано пользователем, а коды в разных базах могут отличаться). Всегда безопаснее передавать ссылку на свойство через параметр запроса либо использовать настройки характеристик СКД.NULL). В таком случае потребуется проверять наличие значения свойства последовательно у элемента и его родителей (Номенклатура.Родитель) с помощью функции ЕСТЬNULL, либо использовать типовые функции общего модуля конфигурации для работы со свойствами объектов.