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