Почему не работают фигурные скобки в запросе 1С и как сделать параметры необязательными?

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

Многие разработчики, переходя к написанию обычных запросов после активного использования СКД, сталкиваются с тем, что конструкция {(Поле = &Параметр)} не работает в объекте Запрос. Давайте разберем, почему так происходит, и рассмотрим рабочие способы реализации гибкой фильтрации данных.

Почему фигурные скобки не работают?

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

Способ 1: Использование конструкции ВЫБОР КОГДА в параметрах виртуальной таблицы

Это самый популярный способ для простой фильтрации. Мы можем передавать параметр в виртуальную таблицу, а внутри самой таблицы вычислять, нужно ли применять фильтр или проигнорировать его.

Пример реализации:


РегистрНакопления.ОборотыСБ.Обороты(
    &НачалоПериода, 
    &КонецПериода, 
    Регистратор, 
    ВЫБОР 
        КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА ИСТИНА 
        ИНАЧЕ Контрагент = &Контрагент 
    КОНЕЦ
) КАК ОборотыСБОбороты

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

Способ 2: Динамическое формирование текста запроса (через СтрЗаменить)

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

Разберем по шагам:

  1. В тексте запроса оставляем заглушку, например %допУсловие.
  2. В коде 1С проверяем заполненность переменной.
  3. Методом СтрЗаменить подставляем нужное условие.

// В тексте запроса: ... ГДЕ 1=1 %допУсловие
Если ЗначениеЗаполнено(Отчет.Контрагент) Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "%допУсловие", "И Контрагент = &Контрагент");
    Запрос.УстановитьПараметр("Контрагент", Отчет.Контрагент);
Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "%допУсловие", "");
КонецЕсли;

Способ 3: Использование ПостроителяЗапроса

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

Как это работает:

  1. Создаем объект ПостроительЗапроса.
  2. Задаем текст с использованием фигурных скобок для секций отбора.
  3. Через коллекцию Отбор добавляем условия программно, активируя их флагом Использование = Истина.

Пример кода:


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

Рекомендации по выбору метода

Надеемся, что теперь процесс настройки фильтрации в ваших запросах станет проще и понятнее!

← На главную