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