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