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