При построении отчетов в системе компоновки данных часто возникает задача вывести справочник в виде иерархического дерева, но исключить из отображения самый верхний узел (папку верхнего уровня). Разработчики часто сталкиваются с ситуацией, когда стандартные методы фильтрации перестают работать ожидаемым образом: условие в тексте запроса или отбор на вкладке настроек либо не дают эффекта, либо полностью скрывают все вложенные ветки.
Выясним причину такого поведения платформы и разберем практические способы решения этой задачи.
Проанализируем механику работы СКД. Когда в настройках структуры для группировки выбирается тип Иерархия, процессор компоновки данных выполняет автоматическое рекурсивное построение дерева. Для обеспечения целостности иерархической структуры система самостоятельно поднимается вверх по ссылкам метаданных до тех пор, пока не дойдет до пустого значения.
Из-за этого возникают следующие эффекты:
ГДЕ Родитель <> &ВерхняяПапка, запрос отсечет саму запись папки, однако в процессе компоновки СКД все равно прочитает ссылку на этого родителя из подчиненных элементов и достроит недостающий корневой узел дерева.Ссылка Не равно ПапкаВерхнегоУровня на уровне отчета или группировки, платформа воспримет это как исключение ветки целиком. В результате исчезнет не только сам верхний узел, но и все дочерние элементы, так как они потеряют связь с корнем.Чтобы обойти это системное ограничение, рассмотрим надежные способы скрытия корневого уровня.
Наиболее корректный способ исключить верхний узел на уровне данных — отказаться от автоматической иерархии платформы и настроить собственную иерархию в схеме компоновки данных. Это позволяет напрямую управлять точкой входа в дерево.
Разберем настройку по шагам:
Ссылка, а в колонке Поле приемника — Родитель.При таком подходе процессор компоновки сформирует дерево строго от заданных начальных узлов, а вышестоящий родитель вообще не попадет в выборку данных.
Если требуется сохранить типовую структуру данных, но отсечь отображение корневой строки, применим механизм отбора после группировки.
Для этого создадим пользовательское поле-выражение, определяющее родительский контекст:
Выбор
Когда Уровень() = 0 Тогда
Неопределено
Иначе
ВычислитьВыражение("Ссылка", , "Иерархия")
Конец
Далее настроим отбор в группировке:
СистемныеПоля.УровеньВГруппировке или созданному пользовательскому полю.Параметр После группировки или для иерархии указывает системе сначала рассчитать агрегаты и подчиненные строки, а уже затем применить фильтр к сформированным узлам. Это предотвращает каскадное удаление дочерних записей.
Если достаточно визуально скрыть строку верхнего родителя в отчете, воспользуемся вкладкой Условное оформление. Этот метод не удаляет строку из модели данных, но делает ее невидимой для пользователя.
Разберем порядок действий:
СистемныеПоля.УровеньВГруппировке Равно 1 (или условие равенства поля конкретной верхней папке).Данный вариант прост в реализации, однако оставляет в отчете тонкую полосу свернутой строки, что не всегда подходит для печатных форм.
Когда отчет выводится программно через модуль отчета или форму, задачу можно решить чисто и без артефактов верстки.
Посмотрим на пример скрытия строк в объекте ТабличныйДокумент после вывода результата компоновки данных:
ТабличныйДокумент.НачатьАвтогруппировкуСтрок();
// Находим строки первого уровня и отключаем видимость
НомерСтроки = 1;
Пока НомерСтроки <= ТабличныйДокумент.ВысотаТаблицы Цикл
ОбластьСтроки = ТабличныйДокумент.Область("R" + Строка(НомерСтроки));
Если ОбластьСтроки.Уровень = 1 Тогда
ОбластьСтроки.Видимость = Ложь;
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабличныйДокумент.ЗакончитьАвтогруппировкуСтрок();
Также при программном обходе элементов компоновщика в цикле через ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент можно анализировать свойство ЭлементРезультата.Уровень и просто не вызывать метод ВывестиЭлемент() для верхнего уровня.
Для полного исключения корневого узла из итогового набора данных наиболее архитектурно правильным решением является настройка собственной иерархии через связи наборов данных. Если необходимо быстро скорректировать только внешний вид отчета в пользовательском режиме без изменения схемы компоновки, оптимально использовать условное оформление или отбор с применением После группировки или для иерархии.