Как правильно рассчитать процент наценки в группировках и итогах отчета СКД?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов в системе компоновки данных (СКД) одной из самых распространенных проблем является некорректный расчет относительных показателей, таких как процент наценки, маржинальность или доля прибыли, в строках группировок и общих итогах. Проблема проявляется в том, что по детальным записям (например, по конкретным товарам) расчет выглядит верным, но как только мы смотрим на уровень документа, контрагента или общий итог, цифры становятся бессмысленными.

В этой статье мы подробно разберем, почему так происходит, проанализируем математическую логику СКД и научимся настраивать ресурсы таким образом, чтобы отчет выдавал корректный результат на любом уровне иерархии.

Причина ошибки: Ловушка «Среднего от средних»

Рассмотрим стандартную ситуацию. У нас есть формула наценки: (Выручка * 100 / Себестоимость) - 100. Если мы пропишем эту формулу в тексте запроса, система рассчитает процент для каждой отдельной строки. Когда дело доходит до итогов по группировке, СКД по умолчанию применяет к этому полю функцию СУММА().

Математически это выглядит так: если по первому товару наценка 20%, а по второму 30%, СКД в итоге покажет 50%. Это в корне неверно. Даже если использовать функцию СРЕДНЕЕ(), результат будет 25%, что также не будет являться правильной средневзвешенной наценкой, если объемы продаж товаров значительно различаются. Правильный подход — сначала просуммировать всю выручку, затем всю себестоимость, и только потом применить формулу к этим суммам.

Решение проблемы через выражения ресурсов

Основное правило работы в СКД гласит: относительные показатели должны рассчитываться в ресурсах, а не в запросе. Разберем по шагам, как это реализовать.

  1. Перейдем на закладку «Наборы данных» и убедимся, что у нас есть числовые поля Выручка и Себестоимость.
  2. Перейдем на закладку «Ресурсы».
  3. Добавим поле ПроцентНаценки в список ресурсов.
  4. В колонке «Выражение» вместо стандартного Сумма(ПроцентНаценки) напишем правильную формулу агрегации.

Посмотрим на пример правильной формулы:

Сумма(Выручка) * 100 / Сумма(Себестоимость) - 100

Проанализируем эту ситуацию: теперь СКД на каждом уровне группировки сначала вычислит итог по выручке, затем итог по себестоимости, и на основе этих итогов рассчитает процент. Именно это обеспечит математическую точность отчета.

Защита от деления на ноль

В реальной базе данных часто встречаются ситуации, когда себестоимость может быть равна нулю (например, при оприходовании излишков или ошибках ввода данных). Если использовать прямую формулу, отчет может «вылететь» с ошибкой деления на ноль или показать пустое значение. Проанализируем, как этого избежать с помощью функции ВЫБОР в выражении ресурса.

Рекомендуется использовать следующую конструкцию в поле выражения ресурса:


ВЫБОР 
    КОГДА Сумма(Себестоимость) = 0 ТОГДА 0 
    ИНАЧЕ (Сумма(Выручка) * 100 / Сумма(Себестоимость)) - 100 
КОНЕЦ

Эта проверка гарантирует стабильную работу отчета даже при некорректных или специфических данных в информационной базе.

Использование вычисляемых полей

Если вы хотите, чтобы поле ПроцентНаценки было доступно пользователю для выбора, но не хотите перегружать запрос лишними вычислениями, используйте закладку «Вычисляемые поля».

Важный нюанс: если вы просто добавите выражение (Выручка * 100 / Себестоимость) - 100 в вычисляемые поля, это никак не изменит логику итогов, если в ресурсах по-прежнему будет стоять СУММА(). Вычисляемое поле определяет логику расчета только для детальных записей (самого нижнего уровня). Для итогов по-прежнему критически важно настроить выражение на закладке ресурсов, как мы разобрали выше.

Разная логика для разных уровней группировки

Иногда возникают сложные задачи, когда на уровне номенклатуры нам нужно видеть один показатель, а на уровне «Общего итога» — совершенно другой (например, целевой показатель или среднее отклонение). СКД позволяет гибко это настраивать.

На закладке «Ресурсы» можно добавить одно и то же поле (например, ПроцентНаценки) несколько раз. В колонке «Рассчитывать по...» вы можете указать конкретную группировку:

Рассмотрим подробнее ситуацию, когда нам нужно рассчитать долю конкретного документа в общей наценке всей компании. В этом случае нам помогут агрегатные функции СКД с указанием области расчета.

Сумма(Выручка) / ВычислитьВыражение("Сумма(Выручка)", "ОбщийИтог") * 100

Функция ВычислитьВыражение позволяет обратиться к данным любого уровня, что делает механизм ресурсов СКД мощным инструментом финансового анализа.

Обработка пустых значений (NULL)

Выясним причину, почему иногда даже правильная формула выдает пустой результат. В 1С данные из запроса часто приходят со значением NULL (например, если не было движений по какому-то регистру). Математическая операция с NULL всегда дает NULL.

Чтобы отчет был устойчивым, мы должны обернуть наши слагаемые в функцию ЕСТЬNULL. Хотя внутри функции СУММА() значения NULL игнорируются, при сложении результатов нескольких разных сумм (например, если вы складываете выручку из двух разных наборов данных) это может стать проблемой.

Безопасный вариант выражения ресурса выглядит так:


(ЕСТЬNULL(Сумма(Выручка), 0) * 100 / ВЫБОР КОГДА ЕСТЬNULL(Сумма(Себестоимость), 0) = 0 ТОГДА 1 ИНАЧЕ Сумма(Себестоимость) КОНЕЦ) - 100

Итоги и рекомендации

Подводя итог, проанализируем основные правила создания корректных отчетов с относительными показателями:

  1. Никогда не суммируйте проценты. Поле с процентом в ресурсах почти никогда не должно использовать функцию СУММА() или СРЕДНЕЕ().
  2. Используйте формулы агрегатов. Всегда пишите выражение ресурса как отношение сумм: Сумма(А) / Сумма(Б).
  3. Проверяйте знаменатель. Всегда добавляйте проверку на равенство знаменателя нулю через ВЫБОР...КОГДА.
  4. Расчет после группировок. Помните, что СКД рассчитывает ресурсы именно в тот момент, когда данные уже сгруппированы, поэтому использование агрегатных функций внутри выражения ресурса — это единственный верный путь.

Применяя эти правила, вы сможете создавать точные и надежные аналитические отчеты, которые будут корректно отображать маржинальность и эффективность бизнеса на любом уровне детализации.

← На главную