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