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