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