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