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