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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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


РегистрБухгалтерии.Хозрасчетный.Обороты(
    ,
    &КонецПериода {(&КонецПериода)},
    ,
    ,
    Субконто1.Вид = ЗНАЧЕНИЕ(Перечисление.Виды.Затраты)
    {(Организация).* КАК Организация},
    ,
) КАК Р

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

Назначение фигурных скобок: расширение языка запросов

Конструкции вида {...} представляют собой расширение языка запросов для Системы компоновки данных (СКД) и Построителя отчета. Стандартный SQL-подобный язык запросов 1С не поддерживает динамическое включение условий или полей на основе действий пользователя в интерфейсе. Именно для этого было создано специальное расширение.

Всё, что заключено в фигурные скобки, не является жестким требованием синтаксиса для СУБД. Эти инструкции предназначены исключительно для генератора отчетов (процессора компоновки или построителя). Они указывают, какие параметры, поля выборки и условия отбора могут динамически добавляться в итоговый текст запроса в зависимости от пользовательских настроек.

Разбор конструкций из примера

Проанализируем детально каждую из конструкций, представленных в исходном запросе.

  1. Опциональный параметр периода: {(&КонецПериода)}

    В параметрах виртуальной таблицы оборотов второе поле отвечает за дату окончания периода. Поместив параметр в фигурные скобки, мы делаем его необязательным для отчета. Если пользователь в пользовательских настройках СКД или построителя не заполнит дату окончания, платформа не станет вызывать исключение «Не задано значение параметра». Вместо этого будет подставлено пустое значение по умолчанию (пустая дата), и ограничение по периоду сверху просто не применится.

  2. Динамический отбор виртуальной таблицы: {(Организация).* КАК Организация}

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

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

    Символ .* (точка-звездочка). Данный синтаксис разрешает пользователю устанавливать отбор не только по самому значению ссылки Организация, но и по любым ее дочерним реквизитам через точку (например, Организация.ИНН, Организация.ГоловнаяОрганизация и т. д.).

    Конструкция КАК Организация. Задает псевдоним поля, под которым оно будет доступно пользователю в дереве полей компоновки и в окне настройки отборов.

Поведение обычного объекта «Запрос»

Посмотрим на поведение платформы, если данный текст запроса передать обычному объекту Запрос в программном модуле:


Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаСФигурнымиСкобками;
// Выполнение запроса
Выборка = Запрос.Выполнить().Выбрать();

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

  1. Условие по организации будет полностью проигнорировано, так как оно существовало только внутри фигурных скобок. В запросе останется лишь фиксированный фильтр Субконто1.Вид = ЗНАЧЕНИЕ(...).
  2. Поскольку параметр &КонецПериода в примере продублирован перед фигурными скобками, платформа посчитает его обязательным. Если разработчик не вызовет метод Запрос.УстановитьПараметр("КонецПериода", Дата), выполнение завершится ошибкой.

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

Разберем практические сценарии работы с расширением языка запросов:

  1. Использование в схемах компоновки данных (СКД). При создании набора данных-запроса в СКД с активным флажком «Автозаполнение» платформа сама формирует доступные поля и условия. Однако если флажок снят для оптимизации или жесткого контроля полей, ручное написание фигурных скобок становится обязательным для вывода полей в отчет и настройки условий.

  2. Формирование запросов в конструкторе. Конструкции расширения не обязательно вводить вручную. В Конструкторе запроса при работе в контексте СКД или Построителя отчета доступна вкладка «Компоновка данных» (или «Построитель»). Все настройки параметров, полей и условий, добавленные на этой вкладке, автоматически оборачиваются конструктором в фигурные скобки.

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

Таким образом, фигурные скобки в тексте запроса 1С представляют собой декларативные директивы для генератора отчетов, позволяющие гибко управлять структурой итогового SQL-запроса при взаимодействии с пользователем.

← На главную