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