Как в СКД рассчитать ресурс на основе двух других ресурсов (деление сумм)

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

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

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

Почему возникает ошибка вложенных агрегатных функций?

Выясним причину этой проблемы. В СКД существует четкое разделение этапов обработки данных:

  1. Детальные записи (строки): На этом этапе рассчитываются значения вычисляемых полей для каждой отдельной строки, полученной из базы данных. Здесь еще нет группировок и итогов.
  2. Группировки и итоги (ресурсы): На этом этапе детальные строки группируются, и для них рассчитываются агрегатные функции (такие как Сумма, Количество, Максимум, Среднее).

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

Пошаговое решение: Правильная настройка схемы

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

Шаг 1. Создание вычисляемого поля

Перейдем на вкладку «Вычисляемые поля». Добавим новую строку:

Шаг 2. Определение поля как ресурса

Перейдем на вкладку «Ресурсы». Добавим наше поле РасчетноеЗначение в список ресурсов. В колонке «Выражение» напишем формулу расчета итогов:

Сумма(Ресурс1) / Сумма(Ресурс2)

При такой настройке СКД сначала просуммирует значения Ресурс1 и Ресурс2 по всем группировкам, а затем выполнит деление одной суммы на другую для получения итогового показателя.

Важные доработки и лучшие практики

Описанный выше базовый алгоритм решает проблему, но в реальной работе конфигурации 1С этого недостаточно. Разберем важные нюансы, которые уберегут ваш отчет от падений и сделают его расчет точным.

1. Защита от деления на ноль

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

В выражении ресурса на вкладке «Ресурсы» запишем безопасную формулу:


Выбор 
    Когда ЕстьNull(Сумма(Ресурс2), 0) = 0 Тогда 0 
    Иначе Сумма(Ресурс1) / Сумма(Ресурс2) 
Конец

2. Настройка расчета для детальных записей

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

Настроим обе вкладки для сквозного расчета:

При такой схеме СКД на уровне строк произведет простое деление полей, а на уровне группировок пересчитает итоги по формуле отношения сумм, избегая неверного сложения или усреднения рассчитанных долей.

3. Использование колонки «Рассчитывать по...»

Иногда расчет формулы имеет смысл только для определенных уровней итогов. Например, показатель должен рассчитываться для группировки «Организация» и «Контрагент», но в «Номенклатуре» или в детальных записях его выводить не имеет смысла.

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

Альтернативный вариант: Пользовательские поля

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

Разберем по шагам, как это сделать:

  1. В режиме отчета перейдем в меню «Настройки», затем на вкладку «Пользовательские поля».
  2. Нажмем кнопку «Добавить» и выберем тип «Новое поле-выражение».
  3. Зададим имя поля, например, «Доля затрат».
  4. В поле «Выражение детальных записей» пропишем расчет для строк: Выбор Когда Ресурс2 = 0 Тогда 0 Иначе Ресурс1 / Ресурс2 Конец
  5. В поле «Выражение итогов» укажем формулу расчета агрегатов:
    
    Выбор Когда Сумма(Ресурс2) = 0 Тогда 0 Иначе Сумма(Ресурс1) / Сумма(Ресурс2) Конец
    

После сохранения это поле можно будет добавить в структуру отчета (в выбранные поля) аналогично стандартным ресурсам.

Сложные расчеты с функцией ВычислитьВыражение

Проанализируем более сложную ситуацию. Что делать, если нам нужно рассчитать долю конкретной группировки в общем итоге? Например, процент продаж конкретного менеджера от общего объема продаж всей компании. Обычное деление Сумма(Ресурс1) / Сумма(Ресурс2) здесь не поможет, так как нам нужно разделить сумму текущей группировки на сумму всей вышестоящей группировки или общего итога.

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


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

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

Мы успешно разобрали основные механизмы расчета зависимых ресурсов в системе компоновки данных. Применяя эти правила, вы сможете создавать сложные, производительные и защищенные от ошибок отчеты любой сложности.

← На главную