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