Как правильно рассчитать итог по группировке для поля Процент в СКД 1С?

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

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

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

Выясняем причину: почему итог считается неправильно?

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

  1. Система сначала вычисляет процент для каждой отдельной строки (детальной записи).
  2. Затем, согласно настройке ресурса, она просто складывает эти полученные результаты.

Математически (А1/Б1) + (А2/Б2) не равно (А1+А2) / (Б1+Б2). Именно поэтому итог по группировке получается некорректным. Нам же нужно, чтобы система сначала просуммировала все числители, затем все знаменатели, и только после этого выполнила деление. Рассмотрим, как это реализовать.

Шаг 1: Правильная формула в ресурсах

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

Рассмотрим пример правильной формулы:


ВЫБОР 
    КОГДА Сумма(Знаменатель) = 0 
    ТОГДА 0 
    ИНАЧЕ Сумма(Числитель) / Сумма(Знаменатель) * 100 
КОНЕЦ

В данном случае Числитель и Знаменатель — это поля вашего набора данных (например, СуммаПродаж и СуммаПлан). Обратите внимание, что мы обязательно проверяем знаменатель на равенство нулю, чтобы избежать ошибки деления на ноль, которая может привести к аварийному завершению формирования отчета.

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

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

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

Шаг 3: Обработка NULL и пустых значений

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

Шаг 4: Расчет доли от общего итога (ВычислитьВыражение)

Если ваша задача — не просто поделить одно число на другое в рамках строки, а вычислить, какой процент составляет текущая группировка от вышестоящей или от всего отчета в целом, нам поможет функция ВычислитьВыражение. Рассмотрим пример расчета доли продаж менеджера в общем объеме продаж компании: Сумма(СуммаПродаж) / ВычислитьВыражение("Сумма(СуммаПродаж)", "ОбщийИтог") * 100

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

Шаг 5: Проверка типов данных и точности

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

Для корректного расчета процентов убедитесь, что:

Подведем итоги

Чтобы ресурс «Процент» в СКД считался правильно, придерживайтесь следующих правил:

  1. Никогда не используйте просто Сумма(ПолеПроцента) для итогов.
  2. Всегда описывайте формулу ресурса как отношение сумм: Сумма(А) / Сумма(Б).
  3. Не забывайте проверять знаменатель на ноль через оператор ВЫБОР.
  4. Используйте разные настройки в колонке «Рассчитывать по» для разделения логики детальных записей и итогов.

Соблюдение этих структурных подходов позволит вам создавать математически достоверные отчеты, которые не вызывают вопросов у бизнес-пользователей.

← На главную