Как в СКД программно включать или отключать условия в запросе?

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

Часто при разработке отчетов на базе Системы Компоновки Данных (СКД) возникает задача дать пользователю возможность гибко управлять фильтрацией данных. Стандартные «Отборы» не всегда подходят, если требуется изменить логику запроса целиком или отключить специфическое условие, которое не должно влиять на выборку при определенных обстоятельствах. Разберем, как реализовать такую логику с помощью параметров.

Вариант 1: Использование логического ИЛИ

Самый простой и элегантный способ — добавить в блок ГДЕ дополнительное логическое условие, которое будет «гасить» основное фильтрующее поле, если параметр отключен. Рассмотрим, как это работает на примере условия ВременнаяТаблица.ЕстьДанные ЕСТЬ NULL.

Для реализации нам понадобится параметр типа Булево (назовем его &УсловиеВключено). Основная идея заключается в том, что условие должно выполняться, если либо наш фильтр истинен, либо параметр «отключен» (значение Ложь).

Код запроса будет выглядеть так:


ГДЕ
    (ВременнаяТаблица.ЕстьДанные ЕСТЬ NULL 
    ИЛИ НЕ &УсловиеВключено)

Разберем логику: если &УсловиеВключено установлено в ИСТИНА, то выражение НЕ &УсловиеВключено превращается в ЛОЖЬ, и запрос отрабатывает честно: проверяет, является ли значение NULL. Если же пользователь снимает флажок (параметр равен ЛОЖЬ), то выражение ИЛИ НЕ &УсловиеВключено всегда будет возвращать ИСТИНА, тем самым «пропуская» все записи независимо от содержания поля ЕстьДанные.

Вариант 2: Использование конструкции ВЫБОР КОГДА

Альтернативный подход, который может быть более наглядным для сложных логических конструкций — это использование оператора ВЫБОР КОГДА непосредственно в блоке ГДЕ.

Этот метод позволяет явно прописать поведение запроса для каждого из состояний параметра:


ГДЕ
    ВЫБОР 
        КОГДА &УсловиеВключено ТОГДА 
            ВременнаяТаблица.ЕстьДанные ЕСТЬ NULL
        ИНАЧЕ 
            ИСТИНА
    КОНЕЦ

Здесь мы явно указываем системе: если параметр включен, выполняем проверку, если выключен — возвращаем ИСТИНА для каждой строки, фактически отключая фильтр. Этот метод хорош тем, что он легко расширяется: внутри ВЫБОР КОГДА можно добавить несколько уровней вложенности или другие условия.

Рекомендации по настройке в СКД

  1. Параметры: Убедитесь, что параметр &УсловиеВключено добавлен в список параметров схемы компоновки данных. Тип данных должен быть строго Булево.
  2. Отображение: Чтобы пользователь мог управлять этим параметром, перейдите в настройки СКД, откройте вкладку «Параметры» и установите флаг «Включать в доступные поля» (или выведите его в быстрые настройки формы отчета).
  3. Отладка: Если вы столкнулись с тем, что условие «сбрасывается» или работает некорректно, проверьте вкладку «Наборы данных» в СКД. Иногда автоматическое заполнение параметров может переопределять ваши значения. Если проблема сохраняется, принудительно устанавливайте значение параметра в обработчике ПриКомпоновкеРезультата в модуле отчета.

Важные советы по производительности

Помните, что использование сложных логических выражений в блоке ГДЕ может привести к тому, что оптимизатор СУБД не всегда сможет эффективно использовать индексы. Если запрос очень тяжелый, а данных в базе миллионы, рассмотрите возможность использования параметров виртуальных таблиц. В таком случае фильтрация происходит на этапе получения данных из таблицы, а не после их выборки, что значительно ускоряет работу отчета.

Если же логика условий становится слишком запутанной из-за множества параметров, профессиональным подходом считается программное формирование текста запроса в событии ПриКомпоновкеРезультата. Вы можете динамически менять текст запроса, добавляя или удаляя строки с условиями ГДЕ, что обеспечит максимальную производительность, так как в СУБД будет отправляться только «чистый» и оптимизированный запрос.

Используйте предложенные варианты в зависимости от сложности вашего отчета и требуемой скорости его выполнения!

← На главную