Как сделать параметр в СКД необязательным для заполнения?

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

При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача сделать определенные параметры необязательными. Пользователи хотят, чтобы при незаполненном параметре отчет формировался без наложения этого фильтра, а при указании значения — фильтровался по нему. Однако попытки поместить параметры в блок ВЫБРАТЬ с использованием фигурных скобок часто приводят к ошибкам синтаксиса или логическим сбоям.

Почему нельзя использовать фигурные скобки в блоке ВЫБРАТЬ

Важно понимать, что фигурные скобки {} в тексте запроса СКД предназначены исключительно для определения доступных полей, которые пользователь может добавлять или удалять в настройках отчета. Параметры запроса (те, что начинаются с &) имеют другую природу: они должны быть определены на этапе выполнения SQL-запроса. Попытка записать &МойПараметр КАК МоеПоле внутри {ВЫБРАТЬ ...} является архитектурно неверной, так как система ожидает там список полей источника данных, а не значения параметров.

Реализация через конструкцию ИЛИ в блоке ГДЕ

Самым надежным и общепринятым способом решения задачи «необязательного» параметра является перенос логики фильтрации в блок ГДЕ. Мы можем использовать логическое условие, которое проверяет, заполнено ли значение параметра. Если параметр пуст, условие возвращает ИСТИНА и игнорирует отбор.

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

  1. Создайте параметр в СКД, например, &ВыбранныйКонтрагент.
  2. В блоке ГДЕ запроса напишите условие, объединяющее проверку на пустоту и проверку равенства:

ГДЕ
    (НЕ ЗначениеЗаполнено(&ВыбранныйКонтрагент) 
    ИЛИ ПолеКонтрагент = &ВыбранныйКонтрагент)

Этот метод универсален. Если пользователь не выбрал контрагента, условие НЕ ЗначениеЗаполнено вернет ИСТИНА, и отчет выведет все данные. Если контрагент выбран, сработает вторая часть условия.

Использование программной установки параметров

В сложных случаях, когда требуется не просто равенство, а более гибкая логика (например, диапазоны дат или АЗС), можно применять программный подход. Мы можем передавать в запрос дополнительный «управляющий» параметр, который вычисляется в модуле объекта (событие ПриКомпоновкеРезультата).

Разберем пример реализации, где мы управляем отбором через флаг:


// В тексте запроса:
ГДЕ
    ( &ИспользоватьОтборПоАЗС = ЛОЖЬ 
      ИЛИ уатСливГСМ.АЗС = &АЗС )

// В модуле отчета:
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("АЗС"));
Если ЗначениеПараметра <> Неопределено Тогда
    Значение = ЗначениеПараметра.Значение;
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИспользоватьОтборПоАЗС", ЗначениеЗаполнено(Значение));
КонецЕсли;

Рекомендации по работе с вычисляемыми полями

Если ваша задача — фильтровать данные по результатам вычислений (например, пользователь вводит число, и нужно показать записи, где Сумма > Число), не пытайтесь перегружать запрос «колхозными» методами через ВЫБРАТЬ. Лучшим подходом будет следующее:

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

← На главную