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

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

Фигурные скобки в запросе 1С: что это и зачем они нужны

Разбираем, что означают фигурные скобки в тексте запроса 1С: расширение языка запросов, конструкции ВЫБРАТЬ, ГДЕ, СОЕДИНЕНИЕ, примеры и типичные ошибки.

Если вы открыли текст запроса в типовой конфигурации 1С и увидели конструкции вида {ВЫБРАТЬ ...} или {ГДЕ ...}, не пугайтесь — это не ошибка и не синтаксис другого языка. Фигурные скобки в запросе 1С — это элемент расширения языка запросов, который позволяет помечать части текста запроса как необязательные. Такие фрагменты могут быть автоматически удалены построителем запроса или консолью отчетов, если соответствующие поля и отборы не используются.

Главное назначение механизма — создание универсальных запросов-шаблонов. Один и тот же текст запроса может обслуживать разные сценарии: в одном отчете нужны все поля и отборы, в другом — только часть. Вместо того чтобы программно собирать строку запроса через конкатенацию, разработчик заключает изменяемые фрагменты в фигурные скобки, а платформа сама «вычищает» лишнее во время выполнения.

Важно понимать: фигурные скобки не являются частью стандартного синтаксиса языка запросов 1С. Если выполнить запрос с ними напрямую через объект Запрос без предварительной обработки, платформа выдаст ошибку. Обработкой занимаются объекты ПостроительЗапроса, ПостроительОтчета, а также схема компоновки данных и типовая консоль запросов.

Что такое расширение языка запросов 1С

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

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

Какие конструкции можно заключать в фигурные скобки

Расширение поддерживает несколько управляющих конструкций. Каждая соответствует определенной секции запроса и имеет свои правила обработки.

Основные конструкции расширения языка запросов:

  • {ВЫБРАТЬ Поле1, Поле2} — необязательные поля выборки. Поле попадет в итоговый запрос, только если оно запрошено настройками построителя;
  • {ГДЕ Условие} — необязательные отборы. Условие применяется, только если соответствующий отбор установлен пользователем или кодом;
  • {СОЕДИНЕНИЕ ...} — необязательное соединение таблиц, которое включается, если нужны поля из присоединяемой таблицы;
  • {УПОРЯДОЧИТЬ ПО ...} и {ИТОГИ ПО ...} — необязательные секции упорядочивания и итогов.

Типовой пример запроса с расширением выглядит так:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Номенклатура

{ВЫБРАТЬ

Номенклатура.Артикул,

Номенклатура.ЕдиницаИзмерения}

ИЗ

Справочник.Номенклатура КАК Номенклатура

{ГДЕ

(Номенклатура.Родитель = &Родитель),

(НЕ Номенклатура.ПометкаУдаления)}

Если построителю нужна только ссылка без отборов, итоговый запрос будет содержать лишь ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура — все содержимое скобок исчезнет.

Кто обрабатывает фигурные скобки и как это работает

Обработка расширения происходит в несколько этапов. Сначала текст запроса передается обработчику — например, через ПостроительЗапроса.Текст = ТекстСоСкобками. Затем разработчик или пользователь указывает, какие поля выбираются (Построитель.ВыбранныеПоля.Добавить("Артикул")) и какие отборы установлены. При вызове Построитель.ПолучитьЗапрос() платформа анализирует настройки и генерирует итоговый текст без скобок.

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

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

Как сопоставляются отборы и условия в {ГДЕ}

Условия внутри {ГДЕ ...} сопоставляются с элементами отбора построителя по имени поля, указанному в условии. Если вы добавили отбор по полю Родитель, то условие (Номенклатура.Родитель = &Родитель) попадет в итоговый запрос; если отбора нет — условие будет удалено. Имя параметра при этом роли не играет, важно именно поле.

Каждое условие внутри секции {ГДЕ} обычно заключают в круглые скобки и перечисляют через запятую. Это позволяет обработчику корректно удалять отдельные условия, не ломая синтаксис итогового запроса: оставшиеся условия объединяются по И.

Отборы по виртуальным полям и через точку

Отбор можно устанавливать по полям, доступным через точку, — например, Номенклатура.Родитель.Наименование. В этом случае условие в скобках должно использовать соответствующее выражение. Учтите, что обращения через точку по ссылочным полям в отборах могут замедлять запрос на больших таблицах, поэтому для часто используемых фильтров лучше отбирать по самой ссылке.

Если отбор в построителе добавлен, но условие в итоговом запросе не появилось, чаще всего имя поля в отборе не совпадает с полем в условии {ГДЕ}. Сравните имена посимвольно — регистр и лишние алиасы типа «Номенклатура.» перед полем в настройке отбора могут мешать сопоставлению.
ПЗ
Практическое замечание

Чем фигурные скобки отличаются от других похожих механизмов

Новички часто путают расширение языка запросов с другими конструкциями 1С. Различия принципиальны:

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

Способы сделать запрос гибким

Расширение языка запросов (фигурные скобки)

Подходит для построителя запроса и построителя отчета; требует обработчика и не работает при прямом выполнении

СКД с настройками

Лучший выбор для отчетов: пользователь сам управляет полями и отборами без изменения текста запроса

Программная сборка текста

Универсально, но повышает риск ошибок и требует аккуратности с подстановкой строковых значений

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Выполнение запроса со скобками напрямую через объект Запрос — платформа возвращает синтаксическую ошибку
02
Все поля выборки заключены в {ВЫБРАТЬ} — при пустых настройках запрос остается без полей и падает
03
Имя поля в отборе построителя не совпадает с полем в условии {ГДЕ} — отбор молча игнорируется
04
Попытка использовать скобки для подстановки значений вместо параметров — риск ошибок и некорректных данных
05
Проверка текста запроса в консоли, которая не поддерживает расширение — ложный вывод о «битом» запросе

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

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

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

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

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

Итоговый текст после ПолучитьЗапрос()
Норма

Фигурных скобок нет, присутствуют только запрошенные поля и отборы

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

Скобки остались или пропали нужные условия — проверяйте настройки построителя

Работа отборов
Норма

Добавленный отбор появляется в секции ГДЕ итогового запроса

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

Отбор установлен, но условия нет — имена полей не совпадают

Выполнение запроса
Норма

Запрос выполняется и возвращает ожидаемые данные

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

Синтаксическая ошибка — текст не прошел обработку построителем

Частые вопросы о фигурных скобках в запросах 1С

Можно ли выполнить запрос с фигурными скобками напрямую через объект Запрос?

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

Чем фигурные скобки отличаются от параметров &Параметр?

Параметры подставляют значения в неизменный текст запроса. Фигурные скобки меняют саму структуру текста: добавляют или удаляют поля, условия и соединения. Это разные уровни — структурный и значений.

Почему мой отбор не попадает в итоговый запрос?

Наиболее вероятная причина — имя поля в настройке отбора построителя не совпадает с полем, указанным в условии внутри {ГДЕ}. Проверьте имена, лишние алиасы и обращения через точку.

Используются ли фигурные скобки в СКД?

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

Консоль запросов выдает ошибку на скобках — запрос неправильный?

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

Итог

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

Фигурные скобки в запросе 1С — это расширение языка запросов для необязательных полей и отборов. Такой текст обрабатывается построителем запроса или построителем отчета, а напрямую выполнять его нельзя. Для значений всегда используйте параметры, а скобки оставьте для структуры запроса.