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