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