Как в запросе 1С получить значение дополнительного свойства номенклатуры?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

В типовых конфигурациях 1С (таких как Комплексная автоматизация 1.1, Управление производственным предприятием 1.3 или Управление торговлей 10.3) многие реквизиты номенклатуры, включая производителя, страну происхождения или артикул поставщика, нередко хранятся не в реквизитах самого справочника Номенклатура, а в виде дополнительных свойств. Разберем, как устроена эта структура данных и как правильно извлечь значение свойства с помощью запроса или механизма СКД.

Механизм дополнительных реквизитов и свойств в классических конфигурациях базируется на двух ключевых объектах:

  1. План видов характеристик СвойстваОбъектов — содержит перечень самих свойств (например, «Производитель», «Цвет», «Размер»).
  2. Регистр сведений ЗначенияСвойствОбъектов — хранит связку между конкретным объектом базы (поле Объект), назначенным свойством (поле Свойство) и выбранным значением (поле Значение).

Способ 1. Получение свойства через прямое левое соединение в запросе

Разберем классический вариант построения запроса. Чтобы получить список номенклатуры и привязать к каждой позиции значение конкретного свойства, выполним левое соединение справочника Номенклатура с регистром сведений ЗначенияСвойствОбъектов.

Обратим внимание на условие соединения: фильтр по нужному свойству следует указывать непосредственно в секции ПО, а не во вложенном подзапросе или секции ГДЕ. Это позволяет СУБД оптимально задействовать индекс регистра по полям Объект и Свойство, а также сохранить в выборке товары, у которых свойство еще не заполнено.

Посмотрим на пример текста запроса:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.Наименование КАК Наименование,
    ЗначенияСвойств.Значение КАК Производитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
        ПО Номенклатура.Ссылка = ЗначенияСвойств.Объект
        И ЗначенияСвойств.Свойство = &СвойствоПроизводитель
ГДЕ
    НЕ Номенклатура.ЭтоГруппа

В программном коде передадим ссылку на искомое свойство в параметры запроса:


Запрос = Новый Запрос;
Запрос.Текст = "..."; // Текст запроса выше

СвойствоПроизводитель = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Производитель");
Запрос.УстановитьПараметр("СвойствоПроизводитель", СвойствоПроизводитель);

Результат = Запрос.Выполнить();

Способ 2. Использование встроенного механизма характеристик в СКД

Если отчет разрабатывается в Системе компоновки данных (СКД), соединять регистр вручную в тексте запроса вовсе не обязательно. Платформа 1С предоставляет штатный механизм работы с характеристиками.

Разберем по шагам настройку схемы компоновки данных:

  1. В тексте запроса набора данных выбираем только необходимые поля номенклатуры (например, Номенклатура.Ссылка).
  2. Переходим на вкладку Характеристики в конструкторе схемы компоновки.
  3. Добавляем новую строку со следующими параметрами:
    1. Тип объекта: СправочникСсылка.Номенклатура
    2. Таблица свойств: ПланыВидовХарактеристик.СвойстваОбъектов (Поле ключа — Ссылка, Поле имени — Наименование)
    3. Таблица значений: РегистрыСведений.ЗначенияСвойствОбъектов (Поле объекта — Объект, Поле свойства — Свойство, Поле значения — Значение)

После этой настройки в доступных полях отчета у объекта Номенклатура автоматически появится дочерняя ветка со всеми существующими свойствами, включая Номенклатура.Производитель. Поле можно выводить в колонки, использовать в группировках, сортировках и отборах без усложнения текста запроса.

Важные нюансы и оптимизация

Проанализируем технические детали, которые уберегут от распространенных ошибок и снижения производительности:

  1. Приведение составного типа через ВЫРАЗИТЬ: Поле Значение в регистре сведений имеет составной тип данных. Если в дальнейшем запросе требуется обращаться к реквизитам полученного значения (например, к коду или наименованию производителя), обязательно применяем оператор явного приведения типа: ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК Справочник.ЗначенияСвойствОбъектов) Это исключит избыточные неявные соединения со всеми таблицами, входящими в составной тип характеристики.
  2. Опасность отбора по коду или наименованию в коде запроса: Условия вида ГДЕ ЗначенияСвойств.Свойство.Наименование = "Производитель" или проверка по коду (Код = "03") создают скрытые соединения через точку и являются ненадежными (наименование свойства может быть переименовано пользователем, а коды в разных базах могут отличаться). Всегда безопаснее передавать ссылку на свойство через параметр запроса либо использовать настройки характеристик СКД.
  3. Свойства, назначенные группам номенклатуры: Если в конфигурации свойство заполнено не в самой карточке товара, а на уровне папки (группы), прямое левое соединение вернет пустое значение (NULL). В таком случае потребуется проверять наличие значения свойства последовательно у элемента и его родителей (Номенклатура.Родитель) с помощью функции ЕСТЬNULL, либо использовать типовые функции общего модуля конфигурации для работы со свойствами объектов.
← На главную