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