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