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