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