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