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