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

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

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

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

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

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

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

Что такое расширение языка запросов и где оно работает

Стандартный язык запросов 1С статичен: какие поля перечислены в ВЫБРАТЬ, такие и попадут в результат. Это неудобно для отчётов, где пользователь сам решает, какие колонки выводить и по каким условиям фильтровать данные. Чтобы не генерировать текст запроса строковой склейкой, в платформу добавили расширение — секции в фигурных скобках, обрабатываемые отдельным механизмом.

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

Обычный программный запрос через Новый Запрос расширение не понимает. Если скопировать текст с фигурными скобками из макета СКД и выполнить его напрямую, платформа выдаст ошибку вида «Синтаксическая ошибка "{"». Это самая частая причина непонимания механизма у начинающих разработчиков.

Конструкция {ВЫБРАТЬ}: динамические поля результата

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

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.Количество

{ВЫБРАТЬ

Продажи.Сумма КАК Сумма,

Продажи.Контрагент КАК Контрагент}

ИЗ

РегистрНакопления.Продажи КАК Продажи

Здесь Номенклатура и Количество попадут в выборку всегда, а Сумма и Контрагент — только если их включат в настройках. Если построитель не применялся, скобочные поля в итоговый запрос не попадают вовсе: механизм трактует их как необязательные.

Псевдоним после КАК важен вдвойне: он становится именем колонки результата и одновременно именем настройки. По нему поле можно программно найти в коллекции ВыбранныеПоля построителя или в настройках компоновки. Выбирайте осмысленные псевдонимы без пробелов — это упрощает программную работу.

Конструкция {ГДЕ}: настраиваемые отборы

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

{ГДЕ

(Продажи.Номенклатура = &Номенклатура) КАК Номенклатура,

(Продажи.Контрагент = &Контрагент) КАК Контрагент,

(Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода)}

Когда пользователь в отчёте добавляет отбор по номенклатуре, построитель подставляет в итоговый запрос соответствующее условие и устанавливает параметр. Если отбор не задан, условие просто отсутствует в финальном тексте — и это принципиально отличается от приёма ГДЕ &Параметр = Неопределено ИЛИ Поле = &Параметр, который заставляет проверять условие для каждой строки.

Псевдоним после КАК определяет, под каким именем отбор появится в настройках. Условие без псевдонима тоже допустимо, но управлять им программно будет сложнее. Внутри скобок допустимы произвольные выражения языка запросов: сравнения, ПОДОБНО, В ИЕРАРХИИ, проверки на NULL.

Группировки, итоги и упорядочивание в скобках

По аналогии с полями и отборами работают секции {СГРУППИРОВАТЬ ПО} и {УПОРЯДОЧИТЬ ПО}. Первая объявляет поля, по которым пользователь может группировать данные, вторая — доступные направления сортировки. В построителе отчёта группировки из этой секции появляются в списке доступных измерений отчёта.

Отдельная конструкция — {ИТОГИ ПО} и {ОБЩИЕ ИТОГИ}: она управляет тем, какие итоги построитель добавит в запрос. В СКД аналогичную роль играют ресурсы и настройки группировок, поэтому в компоновке эти секции встречаются редко.

Есть и специализированные секции для работы с характеристиками и периодичностью: {ХАРАКТЕРИСТИКИ} подключает механизм дополнительных свойств (план видов характеристик), а конструкция ПЕРИОДАМИЧЕСКОСТЬ(...) внутри скобок управляет детализацией виртуальных таблиц по периодам. Обе относятся к продвинутым сценариям и применяются в основном в типовых механизмах.

Как скобки преобразуются в итоговый запрос

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

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

Как проверить, что генерирует построитель
  1. 1
    Создайте объект ПостроительЗапроса и установите ему текст со скобочными секциями
  2. 2
    Заполните настройки: добавьте отбор и выбранные поля программно
  3. 3
    Вызовите метод ПолучитьЗапрос() и выведите свойство Текст полученного запроса
  4. 4
    Сравните результат с исходным текстом: включённые настройки должны появиться, отключённые — исчезнуть

Типичные ошибки при работе со скобочными секциями

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

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

Третья ошибка — размещение секций не на своих местах. {ВЫБРАТЬ} допустима только сразу после списка полей, {ГДЕ} — в позиции условия, {УПОРЯДОЧИТЬ ПО} — в конце запроса. Скобка, вставленная в произвольное место текста, приведёт к ошибке разбора ещё на этапе установки текста построителю.

Типичные ошибки
01
Выполнение текста со скобками через обычный Запрос — синтаксическая ошибка на символе {
02
Дублирование псевдонимов КАК в разных секциях — потеря полей или некорректный итоговый запрос
03
Отборы в {ГДЕ} без псевдонимов — невозможно управлять ими программно из кода
04
Попытка динамически менять сам текст запроса строковой заменой вместо использования настроек построителя

Когда использовать скобки, а когда обойтись без них

В современных разработках на СКД потребность в ручном написании скобочных секций невелика: компоновка сама управляет полями, отборами и группировками через настройки. Основной случай, где {ВЫБРАТЬ} в тексте набора данных СКД остаётся полезным, — поля, которые должны быть доступны для выбора, но не participate в обязательной структуре отчёта.

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

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

Способы динамической настройки запроса

Секции в фигурных скобках + построитель

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

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

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

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

Гибко для произвольных алгоритмов, но требует аккуратности: только параметры, никакой подстановки пользовательского ввода в текст

Итог

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

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

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

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

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

Чем {ГДЕ} отличается от обычного ГДЕ с параметром?

Условие из {ГДЕ} физически добавляется в итоговый запрос только когда отбор включён в настройках. Обычное условие с параметром присутствует всегда, и его приходится «отключать» приёмами вроде проверки на Неопределено, что увеличивает нагрузку при выполнении.

Нужно ли писать скобки в тексте набора данных СКД?

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

Можно ли использовать несколько секций {ВЫБРАТЬ} в одном запросе?

В одном запросе секция {ВЫБРАТЬ} одна и ставится сразу после основного списка полей. В объединении (ОБЪЕДИНИТЬ) свои скобочные секции могут быть у каждой части, но псевдонимы должны быть согласованы, иначе построитель сформирует некорректный результат.

Что означает секция {ХАРАКТЕРИСТИКИ}?

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

Как программно узнать, какие отборы объявлены в секции {ГДЕ}?

После установки текста построителю запроса или отчёта коллекция Отбор заполняется доступными элементами по псевдонимам из секции. Переберите её и проверяйте свойства Имя и Использование — так видно, какие отборы объявлены и какие включены.