Как в отчете СКД вывести номенклатуру по иерархии её дополнительных свойств?

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

В практике разработки на платформе 1С часто возникает задача построения отчетов, где данные должны группироваться не по папкам справочника Номенклатура, а по иерархии её дополнительных свойств. Например, у нас есть свойство "Категория", значения которого (справочник ЗначенияСвойствОбъектов) выстроены в дерево: "Жирная" -> "Большая" -> "Красная". Нам нужно, чтобы отчет выводил эти уровни иерархии, а внутри них — соответствующую номенклатуру. Рассмотрим, как правильно реализовать этот механизм в Системе компоновки данных (СКД).

Разберем структуру данных

В конфигурациях, подобных УПП 1.3 или УТ 10.3, дополнительные свойства хранятся в регистре сведений ЗначенияСвойствОбъектов. Сами значения этих свойств выбираются из одноименного справочника ЗначенияСвойствОбъектов. Этот справочник является иерархическим (иерархия элементов), что и позволяет нам строить дерево категорий.

Важный нюанс: Не путайте "Свойства" с "Категориями объектов". В старых конфигурациях КатегорииОбъектов — это простейшие флаги (булево), у которых нет иерархии. Для нашей задачи нам нужны именно Свойства.

Шаг 1. Подготовка запроса в СКД

Первая сложность, с которой мы можем столкнуться — это "потеря" типа данных при соединении таблиц. Чтобы СКД позволила построить иерархическую группировку, она должна точно знать, что поле является ссылкой на иерархический справочник. Проанализируем пример запроса, который выбирает данные из табличной части документа и присоединяет значение свойства:


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

Почему это важно:

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

Шаг 2. Настройка иерархической группировки

После того как набор данных настроен, перейдем на вкладку "Настройки" схемы компоновки данных. Выполним следующие действия:

  1. Создадим новую группировку по полю КатегорияПродукции.
  2. В поле "Тип группировки" выберем значение Иерархия. Это заставит СКД автоматически выстроить цепочку родительских элементов из справочника ЗначенияСвойствОбъектов.
  3. Внутрь этой группировки добавим подчиненную группировку по полю Номенклатура.

В результате мы получим структуру:

- Жирная (уровень 1)
-- Большая (уровень 2)
--- Красная (уровень 3)
---- Свинья (детальная запись номенклатуры)

Выясним причину возможных проблем

Проанализируем ситуацию, если отчет "зависает" или выводит пустые группы. Рассмотрим основные причины:

1. Полное соединение в запросе. Если вы просто добавили две таблицы (документ и регистр) на вкладку "Наборы данных" и не указали условия связи на вкладке "Связи наборов данных" или в тексте запроса, система попытается перемножить все записи. Всегда проверяйте наличие связи по полю Объект и фильтра по полю Свойство.

2. Пустые значения категорий. Если у номенклатуры не заполнено свойство, она попадет в пустую группу. Чтобы этого избежать, можно настроить отбор в СКД или использовать функцию ЕСТЬNULL в запросе, чтобы подставить значение "Без категории".

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

Рекомендации по оформлению

Чтобы отчет выглядел профессионально, проанализируем настройки полей. Для группировки по иерархии свойств часто полезно выводить только само значение, скрывая лишние детали. На вкладке "Наборы данных" для поля КатегорияПродукции можно задать понятный заголовок и настроить оформление, чтобы визуально выделить уровни иерархии (например, разным фоном или отступами).

Таким образом, сочетание правильной типизации данных через ВЫРАЗИТЬ и использование стандартного механизма иерархических группировок СКД позволяет решать задачи любой сложности по структурированию данных в отчетах 1С.

← На главную