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