Как правильно объединить условие ГДЕ и расширение СКД в фигурных скобках в запросе 1С

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

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

Понимаем назначение фигурных скобок в запросе

Для начала проанализируем ситуацию: зачем вообще нужны фигурные скобки? Это специальные расширения языка запросов для СКД. Текст внутри скобок обрабатывается не основной подсистемой выполнения запросов базы данных, а препроцессором компоновки данных. Это позволяет делать запрос гибким: если пользователь в настройках отчета не установил отбор по полю, указанному в фигурных скобках, СКД просто вырежет этот фрагмент из итогового SQL-запроса, не создавая лишней нагрузки на сервер.

Рассмотрим структуру стандартного расширения:


{ГДЕ
    Номенклатура.*,
    Склад.* КАК СкладОтбор
}

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

Синтаксическая ошибка при объединении условий

Выясним причину основной проблемы, с которой столкнулся автор темы. Попытка написать код в виде ГДЕ &Параметр И {ГДЕ...} приводит к ошибке "Синтаксическая ошибка И". Это происходит потому, что расширение СКД само по себе является инструкцией для генерации блока WHERE в итоговом SQL. Система компоновки данных автоматически «склеивает» ваше статическое условие и динамическое, добавляя оператор И (AND) самостоятельно при генерации текста запроса.

Правильный порядок следования условий

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

Проанализируем верную структуру на примере:


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

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

Как работает препроцессор СКД при выполнении запроса

Рассмотрим подробнее, что произойдет «под капотом» системы в разных сценариях:

  1. Сценарий 1: Пользователь не установил отборы. СКД увидит, что параметры в фигурных скобках не заполнены, и просто удалит весь блок в скобках. Итоговый запрос к БД будет содержать только ГДЕ Организация = &Организация.
  2. Сценарий 2: Пользователь выбрал конкретный Склад. СКД возьмет текст из скобок и добавит его к основному условию. Итоговый запрос превратится в ГДЕ Организация = &Организация И Склад = &Склад.

Такой подход обеспечивает высокую производительность, так как в SQL-запрос не попадают лишние конструкции типа ИЛИ &СкладЗаполнен = ЛОЖЬ.

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

Посмотрим на ситуацию со стороны визуального редактора. Чтобы не ошибиться в синтаксисе вручную, рекомендуется использовать вкладку «Компоновка данных» в Конструкторе запроса:

Если вы добавите условие на вкладке компоновки, 1С сама расставит скобки и запятые в тексте запроса в нужном порядке.

Важные нюансы при работе с псевдонимами

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

Пример сложного объединения с вложенными запросами

Иногда требуется вставить условие СКД внутрь подзапроса или временной таблицы. Рассмотрим пример:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Данные.Ссылка
ИЗ
    ВТ_Данные КАК ВТ_Данные
ГДЕ
    ВТ_Данные.Ссылка В (&СписокРазрешенных)

В данном случае мы видим, что в первой временной таблице используется и жесткий фильтр по пометке удаления, и опциональный фильтр СКД по ссылке. Во второй части запроса используется только статическое условие В (&СписокРазрешенных). Это демонстрирует, что расширения СКД могут применяться точечно в разных частях пакета запросов.

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

← На главную