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