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

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

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

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

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

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

Где в языке запросов 1С встречаются фигурные скобки

Сам язык запросов 1С (диалект, близкий к SQL) не использует фигурные скобки как служебный символ в основной грамматике. Выборка, соединения, группировки и итоги обходятся без них. Поэтому любые фигурные скобки в тексте запроса — это всегда один из трёх механизмов, и определить нужный можно по контексту.

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

Параметры виртуальных таблиц регистров в скобках

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

ВЫБРАТЬ

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

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки

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

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

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|  Срез.Номенклатура,
|  Срез.Цена
|ИЗ
|  РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦены = &ТипЦены) КАК Срез";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("ТипЦены", ТипЦены);

Фигурные скобки расширения языка запросов СКД

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

Например, секция {ГДЕ (Товары.Склад = &Склад)} означает: это условие можно включать и отключать в настройках отчёта. Если выполнить такой текст обычным объектом Запрос, платформа выдаст синтаксическую ошибку — движок запросов фигурные скобки не понимает. Поэтому текст с расширениями предназначен только для СКД, построителя отчёта или консоли, которая умеет их предварительно обрабатывать.

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

Три смысла фигурных скобок

Параметры виртуальной таблицы

Работают в обычном объекте Запрос. Ускоряют выборку за счёт отбора до вычисления таблицы.

Расширение языка запросов СКД

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

Метки для СтрЗаменить

Самодельные плейсхолдеры вроде {УсловиеОтбора}. Платформа их не обрабатывает — замену делает ваш код.

Подстановка текста в шаблон запроса

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

ТекстЗапроса = "ВЫБРАТЬ Товары.Ссылка

|ИЗ Справочник.Номенклатура КАК Товары

|ГДЕ {УсловиеОтбора}";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "{УсловиеОтбора}", "Товары.ПометкаУдаления = ЛОЖЬ");

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

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

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

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

Порядок проверки проблемного запроса
  1. 1
    Определите тип скобок: параметры виртуальной таблицы, расширение СКД или свои метки
  2. 2
    Для виртуальной таблицы проверьте параметры в консоли запросов — период и условие отбора
  3. 3
    Для СКД уберите конструкции расширения и выполните чистый текст отдельно
  4. 4
    Для меток подстановки выведите итоговый текст запроса в журнал или сообщение перед выполнением
  5. 5
    Сравните результат с данными в базе через отчёт или просмотр регистра

Типичные ошибки и их признаки

Самая частая ошибка — попытка выполнить текст с конструкциями {ВЫБРАТЬ} или {ГДЕ} обычным объектом Запрос. Признак — синтаксическая ошибка с указанием на символ «{». Вторая по частоте — передача условия отбора по измерению в секцию ГДЕ вместо параметра виртуальной таблицы: запрос работает, но медленно, потому что платформа вычисляет остатки по всем измерениям и фильтрует потом.

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

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

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

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

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

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

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

Суммы и строки результата
Норма

Совпадают со стандартным отчётом по регистру на ту же дату

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

Расхождения — проверьте период виртуальной таблицы и условие отбора

Выполнение текста из СКД
Норма

Отчёт формируется через СКД без ошибок

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

Синтаксическая ошибка на «{» при выполнении обычным Запросом

Реакция на настройки отчёта
Норма

Отключение отбора в настройках меняет результат

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

Отбор не влияет — условие зашито в основной текст запроса

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

Можно ли использовать фигурные скобки в обычном запросе без СКД?

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

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

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

Почему запрос с конструкцией {ГДЕ} выдаёт синтаксическую ошибку?

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

Как безопасно подставить имя таблицы или поля в текст запроса?

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

Почему виртуальная таблица остатков возвращает пустой результат?

Чаще всего причина в параметре периода: пустая дата, дата раньше первого движения или граница, заданная не тем типом. Проверьте параметр в консоли запросов и сверьте с фактическими движениями по регистру. Вторая причина — слишком жёсткое условие отбора во втором параметре.

Что означает амперсанд перед именем — это тоже связано со скобками?

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

Итог

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

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