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