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