При построении отчетов в системе компоновки данных (СКД) с использованием стандартной группировки типа «Иерархия» разработчики часто сталкиваются с ситуацией, когда элемент справочника выводится дважды: сначала в качестве узла группировки со свернутыми суммами, а затем отдельной строкой детальной записи со своим собственным количеством. Попытка настроить отбор по функции Уровень() нередко приводит к ошибке «Выражение не может быть вычислено "Level"». Разберем по шагам, почему возникает эта проблема и как правильно настроить схему компоновки данных.
Проанализируем механику работы СКД при формировании иерархических отчетов:
Уровень(): Системные функции Уровень() и системное поле УровеньВГруппировке определены только в контексте группировочных записей. Если отбор или вычисляемое поле применяется к детальным записям или задается на корневом уровне отчета без указания области применения, СКД выдает ошибку невозможности расчета уровня.Рассмотрим стандартное решение задачи через пользовательские поля выражения и корректный отбор на уровне группировки.
РодительскийУзел) и укажем формулу:
Выбор
Когда Уровень() = 0
Тогда Неопределено
Иначе ВычислитьВыражение("Ссылка", , "ИЕРАРХИЯ")
Конец
Ссылка Не равно ПользовательскиеПоля.РодительскийУзел
Выражение не может быть вычислено "Level", в свойствах созданного элемента отбора переключим параметр «Применение» в значение «После группировки или для иерархии» (или «Для иерархии»).СистемныеПоля.УровеньВГруппировке Равно 1.Выясним, как вывести в узел иерархии собственную сумму (например, полученную из внешней таблицы) вместо стандартного суммирования детальных записей.
Сумма(Количество)
Количество. В колонке «Рассчитывать по...» выберем значение ИмяГруппировки Иерархия.
ВычислитьВыражениеСГруппировкойМассив("Сумма(Количество)", "ИмяГруппировки")
или условие через Выбор Когда ... Тогда ... Конец, что позволит гибко переопределить выводимые показатели для папок и конечных элементов.
Если требуется полностью контролировать древовидную структуру и расчет итогов без скрытых механизмов типа «Иерархия», разберем построение дерева через связь набора данных с самим собой.
НаборДанных1НаборДанных1СсылкаРодительРодитель = &Родитель (для корня отбираются элементы, где Родитель Не Заполнено).Ссылка с типом «Элементы» (не «Иерархия»).