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