Как правильно рассчитать процент в СКД и избежать ошибки вложенных агрегатных функций?

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

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

Почему возникает ошибка исполнения отчета?

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

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

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

Способ 1: Использование функции ВычислитьВыражение

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

Перейдем на закладку «Ресурсы» и для нашего поля (например, ПроцентРабот) в колонке «Выражение» напишем следующую конструкцию:

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

Разберем это выражение по шагам:

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

Таким образом, мы делим частное на общее, избегая вложенности агрегатов. Этот метод гарантирует корректный расчет на любом уровне иерархии.

Способ 2: Встроенные системные поля «Процент в группе»

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

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

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

Обработка исключительных ситуаций: Деление на ноль

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


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

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

Продвинутое использование функции ВычислитьВыражение

Функция ВычислитьВыражение обладает огромным потенциалом. Рассмотрим несколько дополнительных сценариев, которые могут пригодиться в работе программиста 1С:

  1. Расчет процента от родителя: Если в отчете есть вложенность (например, Отдел -> Сотрудник), и нам нужно узнать процент сотрудника в рамках его отдела, используем параметр "Группировка".
    100 * Сумма(СуммаРабот) / ВычислитьВыражение("Сумма(СуммаРабот)", "Группировка", "Родитель")
  2. Накопительный итог (Процент с накоплением): Часто требуется для ABC-анализа. Мы можем указать область вычисления от начала отчета до текущей строки.
    Сумма(СуммаРабот) / ВычислитьВыражение("Сумма(СуммаРабот)", "ОбщийИтог", , "Первая", "Текущая")

Важные нюансы настройки ресурсов

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

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

Подведем итог: использование вложенных агрегатных функций — классическая ошибка новичка. Решение заключается в правильном понимании механизмов СКД. Используйте встроенные поля процентов для простых задач и функцию ВычислитьВыражение в ресурсах — для сложных аналитических расчетов. Это сделает ваши отчеты гибкими, быстрыми и профессиональными.

← На главную