Что означают фигурные скобки {} в запросах 1С и как их использовать?

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

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

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

Общее понятие: Расширение языка запросов

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

  1. Системой компоновки данных (СКД) — современным и основным инструментом построения отчетов.
  2. Построителем отчета (ПостроительОтчета) — устаревшим механизмом, который использовался в обычных формах (1С v8.0 и 8.1), но до сих пор встречается в поддержке старого кода.

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

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

Основные конструкции внутри фигурных скобок

Давайте проанализируем синтаксис, который чаще всего встречается в работе. Фигурные скобки могут обрамлять несколько ключевых секций запроса.

1. Секция {ВЫБРАТЬ}

Указывает, какие поля пользователь сможет выбрать для вывода в отчет (в качестве колонок или группировок). Рассмотрим пример:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.СуммаОборот КАК Сумма
{ВЫБРАТЬ
    Номенклатура.*,
    Сумма}
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи

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

2. Секция {ГДЕ}

Пожалуй, самая часто используемая конструкция. Она указывает, по каким полям пользователь имеет право накладывать отборы. Разберем пример из темы на форуме:


ГДЕ
    ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И ОсновныеНачисления.Организация = &Организация
{ГДЕ
    ОсновныеНачисления.ФизЛицо.*,
    ОсновныеНачисления.Регистратор.*}

В этом примере условия в секции ГДЕ (без скобок) являются обязательными. Запрос не выполнится, если не будут установлены параметры НачалоПериода, КонецПериода и Организация. А вот условия внутри {ГДЕ ...} являются необязательными (динамическими). Если пользователь в настройках отчета на форме не установил отбор по Физическому лицу или Регистратору, СКД вообще не будет накладывать эти условия в итоговом SQL-запросе к СУБД.

3. Секция {УПОРЯДОЧИТЬ ПО}

Определяет список полей, по которым пользователь сможет настраивать сортировку в отчете:


{УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование,
    Сумма}

4. Секция {ИТОГИ ПО}

Позволяет пользователю управлять иерархией группировок и рассчитывать итоги по выбранным разрезам данных.

Продвинутые возможности и секреты фигурных скобок

Помимо стандартного управления полями и отборами, фигурные скобки предоставляют разработчику мощнейшие инструменты оптимизации и тонкой настройки.

1. Символ «звездочка» (например, ФизЛицо.*)

В тексте запроса автора темы мы видим конструкцию ФизЛицо.*. Что означает этот символ?

Если мы укажем в секции отборов просто ФизЛицо, то пользователь в режиме предприятия сможет сделать отбор только по самой ссылке на физическое лицо (например, «ФизЛицо Равно Иванов И.И.»). Но если мы пишем ФизЛицо.* (со звездочкой), мы даем указание СКД разрешить отбор не только по ссылке, но и по абсолютно всем реквизитам этого объекта. Пользователь сможет настроить отбор по ИНН физического лица, его коду, дате рождения или любому другому свойству справочника, даже не выводя эти поля в сам запрос вручную. Это значительно упрощает разработку и делает отчет максимально гибким.

2. Необязательные параметры виртуальных таблиц

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


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
    РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, , ) КАК ПродажиОбороты

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

3. Динамические (необязательные) соединения таблиц

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

Решить эту проблему помогают фигурные скобки, наложенные на секцию соединения:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.СуммаОборот КАК Сумма
    {ВЫБРАТЬ
    Контрагенты.Страна КАК СтранаКонтрагента}
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
    {ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО Продажи.Контрагент = Контрагенты.Ссылка}

Выясним, как это работает. Если пользователь формирует отчет и выводит только Номенклатуру и Сумму, СКД анализирует схему, видит фигурные скобки вокруг соединения и полностью исключает ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты из итогового SQL-запроса к базе данных! Но как только пользователь добавит в колонки отчета или в группировки поле «СтранаКонтрагента», СКД динамически вернет это соединение обратно в запрос. Это позволяет создавать универсальные и быстрые отчеты.

4. Роль фигурных скобок при отключенном «Автозаполнении»

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

Если мы отключаем автозаполнение, СКД больше не пытается автоматически угадать доступные поля. В этом случае фигурные скобки становятся единственным и незаменимым способом вручную жестко регламентировать для СКД, какие именно поля можно выбирать, фильтровать и сортировать.

5. Директива {ХАРАКТЕРИСТИКИ}

С помощью этой конструкции прямо в запросе можно динамически связывать объекты с механизмом дополнительных реквизитов и сведений (свойств), настроенных в системе. Это позволяет выводить дополнительные свойства номенклатуры или контрагентов (например, «Цвет», «Размер», «Регион») в настройки отчета так, как будто они являются стандартными реквизитами справочника.

6. Правильная группировка условий в секции {ГДЕ}

Обратите внимание на то, как именно вы прописываете условия в секции отборов. Если вы хотите, чтобы отборы были независимыми, их следует помещать в раздельные блоки фигурных скобок:


{ГДЕ ОсновныеНачисления.ФизЛицо.*}
{ГДЕ ОсновныеНачисления.Организация.*}

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

Резюме и рекомендации

Проанализировав ситуацию, мы можем сделать следующие выводы:

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