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