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

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

Фигурные скобки в запросе 1С: секция ГДЕ и расширение языка запросов

Разбираем, зачем в запросах 1С используются фигурные скобки в секции ГДЕ, как работают расширения языка запросов, отборы в СКД и типичные ошибки.

В текстах запросов 1С часто встречаются фигурные скобки вокруг секций ГДЕ, СГРУППИРОВАТЬ ПО или УПОРЯДОЧИТЬ ПО. Новички воспринимают это как странный синтаксис, а опытные разработчики знают: это не часть стандартного языка запросов, а расширение, которое обрабатывается построителем запроса или системой компоновки данных (СКД).

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

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

Что означают фигурные скобки в тексте запроса

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

Конструкция выглядит так:

ВЫБРАТЬ

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

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

ИЗ

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

{ГДЕ

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

(Номенклатура.Артикул = &Артикул)}

Каждое условие внутри {ГДЕ} обособляется круглыми скобками и перечисляется через запятую. Когда отбор по полю установлен, соответствующее условие подставляется в итоговый текст запроса и соединяется с другими по И. Когда отбора нет — условие просто выбрасывается.

Как работает секция {ГДЕ} в СКД

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

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

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

Фигурные скобки в динамических списках

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

Типичный пример — список документов с возможностью отбора по контрагенту и организации. Без фигурных скобок пришлось бы программно модифицировать текст запроса при каждом изменении отбора. С расширением языка достаточно один раз написать корректный шаблон:

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Контрагент,

Реализация.Организация

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

{ГДЕ

(Реализация.Контрагент = &Контрагент),

(Реализация.Организация = &Организация)}

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

Другие секции с фигурными скобками

Расширение языка запросов не ограничивается секцией ГДЕ. Аналогично работают и другие конструкции, которые включаются в запрос по условию.

Итоги и группировки

Секция {ИТОГИ ПО} позволяет СКД динамически управлять группировками отчёта. Пользователь меняет структуру отчёта — компоновщик формирует соответствующие итоги без изменения исходного текста запроса.

Упорядочивание

Конструкция {УПОРЯДОЧИТЬ ПО} применяет сортировку только если она задана в настройках. Это удобно, когда порядок записей определяет пользователь в форме, а не жёстко зашит в запрос.

Выбираемые поля

В построителе отчёта секция {ВЫБРАТЬ} позволяет динамически добавлять поля в результат. Если поле не выбрано в настройках, оно не попадёт в запрос и не создаст лишнюю нагрузку на выборку.

Если отчёт на СКД игнорирует отбор пользователя, первым делом проверьте, заключено ли условие в фигурные скобки и правильно ли указан псевдоним таблицы. Условие с неверным псевдонимом компоновщик не сможет сопоставить с полем отбора.
ПЗ
Практическое замечание

Типичные ошибки при использовании {ГДЕ}

Самая частая ошибка — попытка выполнить запрос с фигурными скобками напрямую через объект «Запрос». Платформа вернёт ошибку синтаксиса, потому что обычный запрос не обрабатывает расширения. Нужно либо убрать скобки, либо использовать построитель запроса.

Вторая ошибка — нарушение формата перечисления условий. Каждое условие должно быть в круглых скобках, условия разделяются запятыми. Логические операторы И/ИЛИ между ними не ставятся: компоновщик сам объединяет активные условия по И.

Третья проблема — условия по полям, недоступным для отбора. Если поле не входит в список доступных полей СКД или не выбрано в запросе, отбор по нему может не сработать. Проверяйте закладку «Компоновка данных» в конструкторе запроса и настройки доступности полей.

Типичные ошибки
01
Выполнение запроса со скобками через объект Запрос — синтаксическая ошибка, расширения обрабатывают только построитель и СКД
02
Условия без круглых скобок или с оператором И внутри {ГДЕ} — текст не распознаётся
03
Отбор по полю, не выбранному в запросе, — условие молча не применяется
04
Ожидание логики ИЛИ между условиями — активные условия всегда объединяются по И

Как проверить, что условие сработало

Надёжный способ — посмотреть итоговый текст запроса после обработки компоновщиком. В отладчике можно получить макет компоновки и изучить сформированный запрос: там будут видны только реально применённые условия и переданные параметры.

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

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

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

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

При установленном отборе условие присутствует в итоговом тексте

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

Условие отсутствует, хотя отбор задан

Результат с отбором и без
Норма

Наборы записей различаются

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

Результаты одинаковые — отбор не сработал

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

Параметр заполнен только при активном отборе

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

Платформа требует параметр, хотя отбор не задан

Когда фигурные скобки не нужны

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

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

Итог

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

Фигурные скобки в запросе 1С — расширение языка для построителя и СКД: условие в {ГДЕ} применяется только при установленном отборе. Каждое условие пишется в круглых скобках через запятую, напрямую через объект Запрос такой текст не выполняется.

Частые вопросы

Почему запрос с фигурными скобками выдаёт ошибку при выполнении?

Объект «Запрос» не обрабатывает расширения языка. Либо уберите скобки и используйте обычную секцию ГДЕ, либо выполняйте запрос через построитель запроса, построитель отчёта или СКД.

Можно ли объединить условия в {ГДЕ} по ИЛИ?

Нет, активные условия всегда соединяются по И. Для логики ИЛИ формируйте текст запроса программно или используйте группы отборов в настройках СКД.

Обязательно ли заполнять параметр, указанный внутри {ГДЕ}?

Нет. Если отбор по этому условию не установлен, параметр в итоговый запрос не попадает и его значение не требуется. Это главное удобство расширения.

Отбор в отчёте задан, но не фильтрует данные. Что проверить?

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

Работают ли фигурные скобки в консоли запросов?

Большинство консолей выполняют текст через объект «Запрос», поэтому скобки вызовут ошибку. Для проверки замените расширенные секции обычными условиями.

Чем {ГДЕ} отличается от параметра виртуальной таблицы?

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