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