Как выбрать дополнительные свойства номенклатуры в запросе в виде отдельных колонок

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

При работе с номенклатурой в 1С часто возникает задача вывода дополнительных свойств (реквизитов) в виде плоской таблицы. По умолчанию свойства хранятся в «вертикальном» виде (в регистре сведений или табличной части), где каждому свойству соответствует отдельная строка. Однако для выгрузки данных во внешние системы, например, в Excel или весовое оборудование, требуется формат: Номенклатура — Свойство 1 — Свойство 2 — Свойство 3. Рассмотрим, как решить эту задачу различными способами, начиная от простых запросов и заканчивая продвинутыми механизмами Системы компоновки данных (СКД).

Способ 1. Использование множественных левых соединений в запросе

Это классический метод, который идеально подходит, когда количество нужных свойств заранее известно и статично (например, «Ширина», «Толщина», «Вид»). Мы берем основную таблицу номенклатуры и последовательно присоединяем к ней таблицу свойств столько раз, сколько колонок нам нужно получить. Проанализируем пример кода для конфигураций типа КА 1.1 или УПП 1.3, где свойства хранятся в регистре сведений ЗначенияСвойствОбъектов.

Разберем логику построения такого запроса по шагам:


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

В данном примере мы используем ЛЕВОЕ СОЕДИНЕНИЕ, чтобы в результат попала вся номенклатура, даже если у какого-то элемента не заполнено одно из свойств. В условии соединения (после ключевого слова ПО) крайне важно указывать конкретное свойство через параметр (например, &СвойствоТолщина). Если этого не сделать, запрос вернет дубли строк для каждого свойства.

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

Если вы разрабатываете отчет на базе Системы компоновки данных (СКД), то наиболее профессиональным решением будет использование механизма характеристик. Этот метод позволяет системе «видеть» дополнительные свойства как обычные реквизиты объекта, доступные через точку. Рассмотрим подробнее, как это настроить.

Выясним последовательность действий в конструкторе схемы компоновки данных:

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

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

Способ 3. Создание «шахматки» через таблицу в СКД

Проанализируем ситуацию, когда свойств очень много или их список постоянно меняется. В этом случае фиксировать колонки в запросе неудобно. Мы можем использовать структуру типа Таблица в настройках СКД. Это позволит динамически развернуть свойства в колонки.

Рассмотрим по шагам, как это реализовать:

  1. В запросе выберем данные в «вертикальном» виде: Номенклатура, Свойство, Значение.
  2. На закладке Ресурсы добавим поле Значение с выражением Максимум(Значение). Поскольку для одной номенклатуры и одного типа свойства значение обычно единственное, Максимум просто вернет его.
  3. В настройках отчета создадим структуру типа Таблица.
  4. В Строки таблицы добавим поле Номенклатура.
  5. В Колонки таблицы добавим поле Свойство.
  6. В Выбранные поля всей таблицы добавим ресурс Значение.

В результате мы получим классическую кросс-таблицу, где количество колонок будет равно количеству различных свойств, найденных в базе. Это самый гибкий способ, не требующий изменения кода при добавлении новых видов свойств.

Способ 4. Связи наборов данных (ресурсный метод)

Существует еще один интересный прием, который часто обсуждается разработчиками: разделение данных на два набора (основной и дополнительные реквизиты) с последующей связью. Посмотрим на пример настройки:

Создадим два набора данных — запроса:

  1. НаборДанных1: Выбирает основную информацию о номенклатуре (Ссылка, Артикул).
  2. НаборДанных2: Выбирает данные из регистра свойств (Объект, Свойство, Значение).

На закладке Связи наборов данных укажем связь по полю Ссылка = Объект. Важным нюансом здесь является вывод: если мы выведем Значение как ресурс, СКД позволит нам «схлопнуть» данные в одну строку. Как заметили опытные участники обсуждения, такой метод иногда работает даже быстрее, чем сложные соединения в одном огромном запросе, так как SQL-серверу проще обрабатывать небольшие выборки отдельно.

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

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

Выясним, какой метод выбрать. Если вам нужно быстро подготовить данные для разовой выгрузки — используйте Способ 1 (Запрос с соединениями). Если вы строите универсальный отчет для пользователей — выбирайте Способ 2 (Характеристики в СКД). Для динамических отчетов-матриц лучше всего подходит Способ 3 (Кросс-таблица).

← На главную