К статье
Практический материал

Разработка и Конфигурация · 15 мин

Построитель запроса в 1С: назначение, возможности и примеры использования

Что такое построитель запроса в 1С, чем отличается от обычного запроса, как задавать отборы и итоги программно. Примеры кода, типичные ошибки и FAQ.

Построитель запроса в 1С — это встроенный объект встроенного языка (тип ПостроительЗапроса), который позволяет формировать и модифицировать текст запроса программно, без ручного редактирования строки запроса. Вместо того чтобы собирать текст запроса конкатенацией строк — с риском синтаксических ошибок и подстановки небезопасных значений — разработчик работает со структурой: выбранными полями, отборами, порядком, итогами.

Основной сценарий применения — динамические отборы. Когда пользователь на форме выбирает произвольный набор условий (по контрагенту, периоду, складу, номенклатуре), заранее написать один статический запрос под все комбинации невозможно. Построитель берёт базовый текст запроса и добавляет в него только те условия, которые реально заданы, автоматически формируя секцию ГДЕ и параметры.

Построитель тесно связан с построителем отчёта (ПостроительОтчета), который расширяет его возможности настройками группировок и вывода, и с консолью запросов, где результат работы построителя удобно проверять. Понимание этого объекта важно для разработчиков, которые создают универсальные отчёты, обработки подбора и произвольные выборки данных.

Что такое построитель запроса и зачем он нужен

Построитель запроса — это программный объект, который хранит исходный текст запроса и позволяет изменять его структуру через свойства и методы: добавлять отборы, менять сортировку, управлять итогами. После настройки вызывается метод формирования, и построитель возвращает готовый объект Запрос с уже подставленными условиями и параметрами, который выполняется обычным способом.

Ключевое отличие от обычного запроса: обычный запрос статичен — его текст фиксирован в коде, а варьируются только значения параметров. Построитель делает динамической саму структуру запроса: состав условий в секции ГДЕ, порядок сортировки, наличие итогов. Это принципиально другой уровень гибкости.

Типовые задачи, где построитель незаменим:

  • универсальные отчёты, где пользователь сам выбирает условия отбора;
  • обработки подбора данных с произвольным набором фильтров;
  • динамические списки с настраиваемой пользователем фильтрацией (в обычных формах);
  • выборки, где состав условий зависит от логики программы (например, разные отборы для разных ролей).

Как устроен построитель: основные свойства и методы

Работа с построителем строится вокруг нескольких ключевых элементов. Свойство Текст содержит исходный запрос-шаблон. После его установки построитель разбирает текст и автоматически заполняет коллекции доступных полей: ВыбранныеПоля, ДоступныеПоля.

Коллекция Отбор — главный инструмент динамической настройки. В неё добавляют элементы отбора, указывая путь к полю, вид сравнения и значение. Построитель поддерживает стандартные виды сравнения: равно, не равно, в списке, в иерархии, между, больше, меньше, содержит и другие. Элемент отбора можно сделать неактивным (свойство Использование) — тогда он сохранится в настройках, но в запрос не попадёт.

Итоговый запрос получают методом ПолучитьЗапрос(). Он возвращает полноценный объект Запрос, у которого уже заполнены текст и параметры. Дальше работа идёт как обычно: Выполнить(), Выгрузить(), обход выборки.

Базовый пример использования построителя запроса

Типовой код работы с построителем выглядит так: создаётся объект, устанавливается текст запроса, добавляются отборы, получается и выполняется запрос.

bsl
Построитель = Новый ПостроительЗапроса;
Построитель.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|{ГДЕ
| (Номенклатура.Родитель = &Группа),
| (Номенклатура.Наименование ПОДОБНО &Маска)}";

Построитель.ЗаполнитьНастройки();

Если ЗначениеЗаполнено(Группа) Тогда
    ЭлементОтбора = Построитель.Отбор.Добавить("Номенклатура.Родитель");
    ЭлементОтбора.ВидСравнения = ВидСравнения.ВИерархии;
    ЭлементОтбора.Значение = Группа;
    ЭлементОтбора.Использование = Истина;
КонецЕсли;

Построитель.Выполнить();
Результат = Построитель.Результат.Выгрузить();

Обратите внимание на фигурные скобки вокруг секции {ГДЕ ...} — это расширение языка запросов для построителя. Условия внутри таких скобок являются шаблонами: построитель включает в итоговый текст только те из них, для которых добавлен и активирован соответствующий элемент отбора. Если ни один отбор не задан, секция ГДЕ в итоговом запросе отсутствует вовсе.

Метод ЗаполнитьНастройки() автоматически создаёт элементы отбора по шаблонам из фигурных скобок — тогда не нужно добавлять их вручную, достаточно установить значение и флаг использования у нужного элемента. Это удобно, когда состав возможных отборов фиксирован, а активируются они по условию.

Динамические отборы: главный сценарий применения

Рассмотрим практическую ситуацию: форма подбора товаров, где пользователь может фильтровать по группе, части наименования, признаку «не помеченные на удаление». Заранее неизвестно, какие фильтры он включит. Без построителя пришлось бы писать либо восемь вариантов текста запроса, либо собирать строку вручную с проверками.

С построителем логика линейна: для каждого заполненного поля формы добавляется элемент отбора. Пустые поля просто пропускаются — и в итоговом запросе не окажется лишних условий, которые ухудшили бы план выполнения.

Порядок действий
  1. 1
    Сформулируйте базовый текст запроса и оберните изменяемые условия в фигурные скобки {ГДЕ ...}
  2. 2
    Создайте объект ПостроительЗапроса и присвойте свойству Текст этот шаблон
  3. 3
    Вызовите ЗаполнитьНастройки() или добавьте элементы отбора вручную через Отбор.Добавить()
  4. 4
    Для каждого активного условия установите ВидСравнения, Значение и Использование = Истина
  5. 5
    Вызовите Выполнить() или получите запрос через ПолучитьЗапрос() и проверьте результат
  6. 6
    Выгрузите результат в таблицу значений или обойдите выборку

Отбор по списку значений и по интервалу

Для отбора по нескольким значениям используется вид сравнения ВСписке, а значением назначается массив или список значений. Для диапазонов дат или чисел — вид сравнения Интервал или ИнтервалВключаяГраницы, где значение задаётся через свойства ЗначениеС и ЗначениеПо. Построитель сам сформирует корректное условие и параметры.

Отборы по полям через точку

Построитель позволяет накладывать отборы на реквизиты ссылочных полей, например Контрагент.Регион. При этом важно помнить: такие разыменования в условиях могут порождать соединения и снижать производительность на больших таблицах. Если отбор по реквизиту ссылки массовый, лучше перенести условие в явное соединение в тексте запроса.

Построитель запроса против альтернатив: что выбрать

Построитель — не единственный способ динамической фильтрации, и не всегда оптимальный. Выбор зависит от платформы, типа форм и задачи.

Сравнение вариантов

ПостроительЗапроса

Подходит для обычных форм и произвольных выборок с заранее неизвестным набором отборов. Ограничение: в управляемых формах и тонком клиенте возможности построителя отчёта сильно ограничены, для интерфейсной фильтрации лучше СКД

СКД (схема компоновки данных)

Стандарт для отчётов в управляемом приложении: отборы, группировки, варианты настроек без программирования. Избыточна для простых программных выборок внутри алгоритмов

Ручная сборка текста запроса

Допустима для простых случаев, но требует аккуратной подстановки параметров. Никогда не подставляйте пользовательский ввод прямо в текст — только через параметры, иначе возможны ошибки синтаксиса и небезопасное выполнение

Статический запрос с параметрами

Оптимален, когда набор условий фиксирован: проще читается, лучше контролируется план запроса, легче отлаживать в консоли запросов

Практическое правило: если отчёт должен настраиваться пользователем в управляемом интерфейсе — берите СКД. Если нужна программная динамическая выборка в серверной логике или в обычных формах — построитель запроса оправдан. Если условий два-три и они известны заранее — проще статический запрос.

Маршрут решения

Как выбрать действие

Отчёт в управляемом приложении с пользовательскими настройкамиИспользуйте СКД вместо построителя
Набор условий формируется программно в момент выполненияИспользуйте ПостроительЗапроса с шаблоном в фигурных скобках
Состав условий фиксирован, меняются только значенияНапишите статический запрос с параметрами
Нужно сохранять и восстанавливать настройки отборов пользователяИспользуйте методы построителя ПолучитьНастройки() и УстановитьНастройки()

Сохранение и восстановление настроек построителя

Полезная возможность построителя — сериализация настроек. Метод ПолучитьНастройки() возвращает структуру настроек (отборы, порядок, выбранные поля), которую можно сохранить в хранилище значений, а метод УстановитьНастройки() — восстановить. Так реализуют «пользовательские варианты» подбора: пользователь один раз настроил фильтры, и они применяются при следующем открытии обработки.

При восстановлении настроек проверяйте, что поля, на которые ссылаются сохранённые отборы, всё ещё присутствуют в тексте запроса. Если запрос-шаблон изменился (например, после обновления конфигурации), старые настройки могут ссылаться на несуществующие поля — это вызовет ошибку. Оборачивайте УстановитьНастройки() в попытку/исключение и при сбое сбрасывайте настройки к значениям по умолчанию.

Частые ошибки и ограничения построителя

Несмотря на удобство, у построителя есть подводные камни, которые регулярно приводят к ошибкам у начинающих разработчиков.

Типичные ошибки
01
Условие в тексте запроса не обёрнуто в фигурные скобки — построитель не сможет управлять этим условием, и оно попадёт в итоговый запрос всегда
02
Имя в Отбор.Добавить() не совпадает с путём поля в шаблоне — получите ошибку «Поле не найдено» при выполнении
03
Попытка задать параметры запроса вручную после ПолучитьЗапрос() для полей отбора — параметры уже установлены построителем, повторная установка либо избыточна, либо конфликтует
04
Отбор по реквизиту через точку на больших таблицах без анализа плана — резкое падение производительности из-за неявных соединений
05
Использование построителя отчёта в управляемых формах там, где нужна СКД — потерянное время и неработающий интерфейс
06
Подстановка пользовательского ввода прямо в текст запроса вместо отборов построителя — риск синтаксических ошибок и небезопасного кода

Ещё одно ограничение: построитель работает с синтаксисом языка запросов, и сложные конструкции (пакетные запросы, временные таблицы, объединения с разным составом полей) требуют аккуратного оформления шаблона. Если запрос использует временные таблицы, менеджер временных таблиц нужно передавать в полученный запрос вручную после ПолучитьЗапрос().

Как проверить, что построитель сформировал правильный запрос

Главный инструмент проверки — свойство Построитель.ПолучитьЗапрос().Текст или отладка текста после настройки. Выведите итоговый текст запроса (например, через Сообщить() в отладочном режиме) и выполните его в консоли запросов с теми же параметрами — так вы увидите и структуру условий, и результат.

Контрольные точки

Как проверить результат

Текст итогового запроса
Норма

Секция ГДЕ содержит только активные условия, лишних скобок и пустых операторов нет

Тревожный признак

В тексте остались условия, которые должны были быть отключены, или секция ГДЕ пуста, хотя отборы заданы

Параметры запроса
Норма

Каждому активному отбору соответствует параметр с ожидаемым значением и типом

Тревожный признак

Параметр отсутствует или значение не того типа (строка вместо ссылки)

Результат выполнения
Норма

Выборка содержит только записи, удовлетворяющие заданным условиям

Тревожный признак

В результат попали лишние записи — проверяйте вид сравнения и флаг Использование

Производительность
Норма

Запрос выполняется за приемлемое время на рабочем объёме данных

Тревожный признак

Резкое замедление при отборе по реквизитам через точку — пересмотрите структуру запроса

Если запрос возвращает не то, что ожидалось, в первую очередь проверяйте три вещи: совпадает ли имя в Отбор.Добавить() с путём поля в шаблоне, установлен ли флаг Использование, и тот ли вид сравнения выбран (например, Равно вместо ВИерархии для групп справочника).

Удобный приём: сначала напишите и отладьте статический запрос в консоли запросов, добейтесь правильного результата, а затем перенесите его в построитель, обернув в фигурные скобки только те условия, которые должны быть динамическими. Так вы отделите ошибки логики запроса от ошибок настройки построителя.
ПЗ
Практическое замечание

FAQ: частые вопросы о построителе запроса

Чем построитель запроса отличается от построителя отчёта?

Построитель запроса работает только с формированием запроса: отборы, порядок, итоги. Построитель отчёта (ПостроительОтчета) наследует эти возможности и добавляет настройки вывода — группировки строк и колонок, выбранные поля, оформление, а также готовый механизм вывода результата в табличный документ. Построитель отчёта применялся в основном в обычных формах; в управляемом приложении его место заняла СКД.

Можно ли использовать построитель запроса в управляемых формах?

Объект ПостроительЗапроса доступен на сервере, поэтому программная сборка запроса в серверных процедурах возможна и в управляемом приложении. Однако стандартным способом пользовательской фильтрации в управляемых формах являются динамические списки с настройками и СКД. Построитель в управляемом приложении оправдан в основном для внутренних серверных выборок.

Как добавить отбор по нескольким значениям сразу?

Добавьте элемент отбора с видом сравнения ВСписке и присвойте свойству Значение массив или список значений. Построитель сам сформирует условие В (&Параметр) и передаст коллекцию как параметр. Убедитесь, что все элементы списка одного типа и соответствуют типу поля отбора.

Почему построитель выдаёт ошибку «Поле не найдено»?

Причина почти всегда в несовпадении имени: строка, переданная в Отбор.Добавить(), должна точно совпадать с путём поля в тексте запроса, включая псевдоним таблицы. Проверьте, что поле присутствует в тексте запроса, что псевдоним таблицы указан верно, и что вызов ЗаполнитьНастройки() выполнен после установки текста запроса, а не до.

Как сохранить настройки отборов между сеансами пользователя?

Вызовите ПолучитьНастройки() — метод вернёт структуру настроек, которую можно поместить в хранилище значения и записать, например, в константу, регистр сведений или хранилище общих настроек. При следующем запуске прочитайте значение и передайте его в УстановитьНастройки(). Обработайте исключение на случай, если структура запроса изменилась и старые настройки стали несовместимы.

Что выбрать для нового отчёта: построитель или СКД?

Для новых разработок в управляемом приложении выбирайте СКД: она даёт пользователю отборы, группировки, варианты отчёта и оформление без программирования и поддерживается всеми клиентами. Построитель запроса остаётся актуальным для программных динамических выборок внутри алгоритмов и для поддержки решений на обычных формах.

Итог

Что важно запомнить

Построитель запроса (ПостроительЗапроса) программно собирает запрос из шаблона: условия в фигурных скобках превращаются в управляемые отборы, а метод ПолучитьЗапрос() возвращает готовый запрос с параметрами. Используйте его для динамических выборок, проверяйте итоговый текст в консоли запросов, а для пользовательских отчётов в управляемом приложении предпочитайте СКД.