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