Как производить арифметические операции с итоговыми полями в СКД

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача, когда простые итоги (сумма, количество) необходимо дополнить сложной бизнес-логикой. Например, к итоговой сумме комиссии нужно прибавить некий фиксированный параметр, вычесть расходы и поделить результат пополам. Основная сложность здесь заключается в том, чтобы эти расчеты применялись только к финальному итогу, не искажая промежуточные суммы по группировкам.

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

Понимание разницы между вычисляемыми полями и ресурсами

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

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

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

Настройка выражений в ресурсах

Рассмотрим ситуацию, когда в ресурсах выдается синтаксическая ошибка при попытке написать простую формулу. Основная причина — использование параметров или полей без функций агрегации. В выражениях ресурсов СКД все поля должны быть «оборачены» в агрегатные функции, такие как СУММА(), МАКСИМУМ() или СРЕДНЕЕ().

Правильный синтаксис для ресурса будет выглядеть следующим образом:

(СУММА(Комиссия) + МАКСИМУМ(&ДополнительнаяКомиссия) - МАКСИМУМ(&Расход)) / 2

Почему мы используем МАКСИМУМ() для параметров? Даже если параметр &ДополнительнаяКомиссия является константой для всего отчета, СКД должна понимать, какое именно значение брать при расчете группировки. Если использовать СУММА(&ДополнительнаяКомиссия), то значение параметра будет суммироваться столько раз, сколько строк попало в группировку, что приведет к огромным итоговым цифрам.

Управление расчетом по группировкам (колонку «Рассчитывать по...»)

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

Посмотрим, как это реализовать через вкладку «Ресурсы»:

  1. Добавим поле Комиссия в список ресурсов дважды.
  2. Для первой строки с полем Комиссия укажем простое выражение СУММА(Комиссия). В колонке «Рассчитывать по...» выберем все группировки (Менеджер, Заказчик и т.д.), но снимем галочку с пункта <Общий итог>.
  3. Для второй строки с этим же полем Комиссия пропишем нашу сложную формулу:
  4. 
    (СУММА(Комиссия) + ЕСТЬNULL(МАКСИМУМ(&ДополнительнаяКомиссия), 0) - ЕСТЬNULL(МАКСИМУМ(&Расход), 0)) / 2
    
  5. В колонке «Рассчитывать по...» для этой строки снимем все галочки и оставим только <Общий итог>.

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

Использование функции Уровень() для гибкой логики

Если мы хотим использовать одну универсальную формулу, которая сама определяет, где она находится, можно применить функцию Уровень(). В СКД уровень 0 соответствует общим итогам.

Проанализируем пример такого выражения в ресурсе:


ВЫБОР 
    КОГДА Уровень() = 0 
    ТОГДА (СУММА(Комиссия) + МАКСИМУМ(&ДопКомиссия) - МАКСИМУМ(&Расход)) / 2 
    ИНАЧЕ СУММА(Комиссия) 
КОНЕЦ

Это выражение позволяет динамически менять логику расчета в зависимости от того, на каком уровне иерархии отчета выводится строка.

Функция ВычислитьВыражение для работы с общими итогами

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

ВычислитьВыражение("СУММА(Комиссия)", "", "ОбщийИтог")

Это избавляет от необходимости создавать сложные вложенные запросы и позволяет выполнять арифметические действия над итогом всего отчета в контексте любой строки.

Важные рекомендации по работе с NULL

При выполнении любых арифметических операций в 1С (особенно сложения и вычитания) крайне важно помнить о значениях NULL. Если хотя бы один операнд в формуле (например, &Расход) окажется не заполнен, результатом всей формулы станет NULL, и ячейка в отчете будет пустой.

Всегда оборачивайте поля и параметры в функцию ЕСТЬNULL():


(СУММА(Комиссия) + ЕСТЬNULL(МАКСИМУМ(&ДопКомиссия), 0) - ЕСТЬNULL(МАКСИМУМ(&Расход), 0)) / 2

Это гарантирует, что даже при отсутствии данных по расходам, расчет комиссии будет произведен корректно.

Использование пользовательских полей

Если правка схемы компоновки в конфигураторе недоступна, можно воспользоваться Пользовательскими полями непосредственно в режиме «1С:Предприятие». В настройках отчета можно создать «Пользовательское поле — выражение».

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

Рассмотренные методы позволяют создавать гибкие и точные управленческие отчеты, где итоговые показатели могут рассчитываться по совершенно иным правилам, чем детальные данные.

← На главную