Как в отчете СКД рассчитать процент строки от общего итога?

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

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

Причина ошибки при расчете доли от итога

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

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

Способ 1. Настройка формулы на вкладке «Ресурсы» с помощью функции ВычислитьВыражение

Рассмотрим основной и наиболее гибкий способ решения. Контекстные и агрегатные вычисления по итогам отчета следует настраивать на вкладке «Ресурсы», а не на вкладке «Вычисляемые поля».

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

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

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

Способ 2. Защита от деления на ноль и пустых значений

Если в выборке данных итоговая сумма может оказаться равной нулю или содержать NULL, отчет завершится с ошибкой деления на ноль. Разберем, как сделать формулу устойчивой к таким ситуациям с помощью конструкции ВЫБОР КОГДА:


ВЫБОР 
    КОГДА ЕстьNULL(ВычислитьВыражение("Сумма(Количество)", "ОбщийИтог"), 0) = 0 ТОГДА 0 
    ИНАЧЕ Сумма(Количество) / ВычислитьВыражение("Сумма(Количество)", "ОбщийИтог") * 100 
КОНЕЦ

Способ 3. Использование встроенных системных полей СКД

Посмотрим на более простой вариант, который не требует написания формул вручную. В платформе 1С:Предприятие 8.3 для числовых ресурсов уже предусмотрены стандартные механизмы вычисления процентов.

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

Управление значением в строке «Общий итог»

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

  1. Для группировок и детальных записей — прописываем формулу расчета процента через ВычислитьВыражение.
  2. Для группировки «Общий итог» — указываем константу 100 или NULL, если выводить процент в итоговой строке не требуется.
← На главную