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

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

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

Анализ проблемы и частые ошибки

Рассмотрим структуру типового отчета: в строках находятся две или более группировки (например, Контрагент и вложенная Номенклатура), а в колонках располагается дополнительный разрез (например, ПериодМесяц). Нам требуется получить процент по каждому элементу относительно итога всей колонки.

Попытка использовать формулу вида:


Сумма(Показатель) / ВычислитьВыражение("Сумма(Показатель)", "", "", "Первая", "Последняя") * 100

может приводить к ошибкам компиляции выражения СКД:

  1. Использование вложенных агрегатных функций не допускается: ошибка возникает, когда агрегатная функция применяется внутри выражения, которое само передается в другую агрегатную конструкцию некорректно.
  2. Неверный контекст группировки: если во втором параметре функции ВычислитьВыражение передана пустая строка "", расчет выполняется в контексте текущей группировки. В результате вместо процента от общего итога колонки мы получим долю строки относительно ее непосредственного родителя.

Решение 1. Использование функции ВычислитьВыражение с явным указанием группировки

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

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


Количество / ВычислитьВыражение("Сумма(Количество)", "Контрагент", "", "Первая", "Последняя") * 100

Параметры функции в этом выражении работают так:

  1. Выражение (первый параметр): строка "Сумма(Количество)" определяет показатель, который необходимо рассчитать.
  2. Группировка (второй параметр): строка "Контрагент" задает контекст, в рамках которого вычисляются границы строк.
  3. Тип расчета (третий параметр): пустая строка указывает стандартный расчет.
  4. Начало и Окончание (четвертый и пятый параметры): значения "Первая" и "Последняя" заставляют СКД просуммировать значения по всем строкам от первой до последней в рамках колонки.

Решение 2. Использование области вычисления ОбщийИтог

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

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


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

Этот вариант компактнее и не требует жесткой привязки к конкретным строкам первой и последней записи.

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

СКД предоставляет встроенный механизм расчета долей без написания формул вручную. Платформа 1С автоматически создает виртуальные поля процентов для всех ресурсов.

Разберем по шагам, как вывести процент без формул:

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

Дополнительные рекомендации: защита от деления на ноль

При формировании отчетов возможны ситуации, когда итог по колонке равен нулю или данные отсутствуют (значение NULL). Чтобы избежать ошибок времени выполнения, обернем расчет в конструкцию проверки:


Выбор 
    Когда ЕстьNULL(ВычислитьВыражение("Сумма(Количество)", "Контрагент", "", "Первая", "Последняя"), 0) = 0 
        Тогда 0 
    Иначе 
        Количество / ВычислитьВыражение("Сумма(Количество)", "Контрагент", "", "Первая", "Последняя") * 100 
Конец

Такой подход обеспечивает корректное отображение отчета при любых отборах и пустых выборках данных.

← На главную