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