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