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