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