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