Как реализовать отбор в СКД, чтобы при одном значении данные фильтровались, а при другом выводились полностью

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача создания гибких фильтров. Стандартный механизм отбора работает по принципу строгого соответствия: если пользователь выбирает значение Истина для булевого поля, система показывает только те записи, где это поле равно Истина. Если выбирается Ложь — только те, где Ложь. Однако в бизнес-логике часто требуется другой подход: например, если флаг «Только услуги» установлен, мы фильтруем список, а если снят — хотим видеть все записи (и товары, и услуги), а не только «не услуги».

В этой статье мы разберем несколько профессиональных способов реализации такой логики, проанализируем настройки запроса и конфигурации компоновки данных.

Способ 1. Использование параметров запроса с логическим условием

Это наиболее надежный и производительный метод. Вместо того чтобы полагаться на стандартный механизм отборов СКД по полям выборки, мы внедрим логику фильтрации непосредственно в текст запроса, используя параметры. Рассмотрим ситуацию на примере справочника Номенклатура.

Для начала добавим в запрос условие в фигурных скобках {}. Это позволит системе компоновки гибко управлять этим условием. Основная хитрость заключается в использовании оператора ИЛИ. Проанализируем пример кода запроса:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
    {ГДЕ
        (НЕ &ТолькоУслуги ИЛИ Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга))
    }

Разберем, как работает эта конструкция:

  1. Если параметр &ТолькоУслуги имеет значение Ложь, то первая часть выражения (НЕ &ТолькоУслуги) становится Истиной. Согласно законам логики, всё условие целиком становится истинным для любой строки, и фильтрация по типу номенклатуры не производится.
  2. Если параметр &ТолькоУслуги имеет значение Истина, то первая часть выражения становится Ложью. В этом случае результат всего условия зависит от второй части: Номенклатура.ТипНоменклатуры = Услуга. Система выведет только услуги.

Способ 2. Настройка параметров редактирования и «Скрытие значения»

Иногда пользователю психологически проще работать не с выбором Истина/Ложь, а с обычным флажком включения отбора. Выясним, как настроить интерфейс таким образом, чтобы наличие галочки включало фильтр, а отсутствие — отключало его полностью.

Посмотрим на шаги настройки в схеме компоновки данных:

  1. Перейдем на вкладку Настройки, выберем нужный вариант отчета.
  2. На вкладке Отбор добавим наше поле (например, ЭтоУслуга).
  3. В колонке Режим отображения установим значение Быстрый доступ.
  4. Для того чтобы пользователь не видел выбора «Да/Нет», а просто управлял активностью отбора, в свойствах поля в наборе данных можно установить ограничение доступных значений.

Проанализируем ситуацию: если мы просто добавим булево поле в отбор и установим значение Истина, то при снятой галочке отбора СКД просто исключит это условие из итогового SQL-запроса. Это именно то, что требовалось автору: при отключенном отборе выводятся все данные.

Способ 3. Ограничение списка доступных значений

Чтобы исключить логическую путаницу (когда пользователь может выбрать значение Ложь и получить пустой или неверный результат), мы можем программно или в настройках ограничить список выбора для параметра.

Рассмотрим пошагово, как это реализовать:

  1. На вкладке Параметры схемы СКД найдем наш параметр &ТолькоУслуги.
  2. В колонке Параметры редактирования нажмем на кнопку выбора.
  3. Найдем пункт Доступные значения и добавим туда только одно значение — Истина с представлением "Да".
  4. В этом случае у пользователя в интерфейсе будет возможность либо выбрать "Да", либо очистить поле (что будет эквивалентно значению Ложь в нашей логике запроса).

Способ 4. Вычисляемые поля и проверка условий

Если признак «Это услуга» не существует в базе в явном виде, мы можем создать его через Вычисляемые поля. Рассмотрим пример выражения для такого поля:

ВЫБОР КОГДА ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга) ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ

Однако важно помнить: если вы используете вычисляемое поле в стандартном отборе на вкладке «Настройки», поведение будет стандартным (Ложь отсечет Истину). Чтобы реализовать логику «Ложь = Все», рекомендуется комбинировать вычисляемые поля с параметрами, как было описано в Способе 1.

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

При работе с большими объемами данных (например, справочник номенклатуры на сотни тысяч позиций) использование условий ИЛИ в блоке ГДЕ может привести к замедлению запроса, так как СУБД сложнее оптимизировать такие планы выполнения. В таких случаях:

Таким образом, мы проанализировали несколько подходов к созданию гибких фильтров в 1С. Самым элегантным решением остается использование параметров с логикой НЕ &Параметр ИЛИ Условие, так как это дает разработчику полный контроль над результатом выборки вне зависимости от того, как СКД интерпретирует пустые значения булева типа.

← На главную