Как в СКД 1С реализовать удобное включение и отключение отбора через параметр «Да» / «Нет»?

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

Приветствуем всех разработчиков и аналитиков 1С! При проектировании отчетов на базе Системы компоновки данных (СКД) мы регулярно сталкиваемся с необходимостью сделать интерфейс максимально простым и интуитивно понятным для конечного пользователя. Стандартная система настройки отборов СКД очень мощная, но для обычного пользователя она часто выглядит перегруженной. Гораздо удобнее предоставить лаконичный переключатель в шапке отчета: например, параметр «По выпуску» с вариантами выбора «Да» или «Нет».

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

Способ 1. Реализация условного отбора через логическое «ИЛИ» в запросе

Начнем с самого популярного и быстрого метода, который не требует написания кода на встроенном языке 1С. Вся логика закладывается непосредственно в текст запроса схемы компоновки данных.

Многие разработчики пытаются решить эту задачу с помощью конструкции ВЫБОР КОГДА ... ТОГДА прямо в секции ГДЕ. Однако синтаксис языка запросов 1С устроен так, что динамически включать или отключать строки условий через конструкцию выбора там нельзя. Вместо этого мы применим классическое правило булевой логики с использованием оператора ИЛИ.

Рассмотрим, как должно выглядеть условие в секции ГДЕ вашего запроса:


ГДЕ
    НЕ &ПоВыпуску
    ИЛИ ТаблицаИсточника.СтатусВыпуска = &ЗначениеВыпущено

Проанализируем детально, как работает эта логика в зависимости от действий пользователя:

  1. Сценарий первый: пользователь выбирает значение «Нет». В этом случае булев параметр &ПоВыпуску равен значению Ложь. Наше выражение НЕ &ПоВыпуску превращается в НЕ Ложь, что дает результат Истина. По законам логики, если первая часть выражения с оператором ИЛИ истинна, то все условие целиком автоматически становится истинным для абсолютно любой строки выборки. СУБД даже не проверяет второе условие, отбор фактически отключается, и отчет выводит полные стандартные данные.
  2. Сценарий второй: пользователь выбирает значение «Да». В этом случае параметр &ПоВыпуску равен значению Истина. Выражение НЕ &ПоВыпуску превращается в НЕ Истина, что дает нам Ложь. Поскольку первая часть условия ложна, итоговый результат секции ГДЕ теперь полностью зависит от проверки второй части выражения: ТаблицаИсточника.СтатусВыпуска = &ЗначениеВыпущено. Отбор активируется, и в отчет попадут только те строки, которые соответствуют условию.

Этот способ невероятно элегантен, не требует программирования и отлично подходит для большинства рабочих задач.

Способ 2. Программное управление отбором в модуле объекта отчета

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

Для этого мы добавим нужный отбор в настройки схемы СКД как неактивный по умолчанию, а управлять его использованием будем в модуле объекта отчета перед компоновкой результата.

Разберем этот процесс по шагам:

  1. Откройте СКД вашего отчета, перейдите на вкладку «Настройки», выберите вкладку «Отбор» и добавьте новый элемент отбора по полю (например, СтатусВыпуска со значением Выпущено). Галочку использования у этого отбора ставить не нужно.
  2. На вкладке «Параметры» добавьте булев параметр ПоВыпуску.
  3. Откройте Модуль объекта вашего отчета (нажав правой кнопкой мыши по отчету в дереве конфигурации и выбрав «Открыть модуль объекта»).
  4. Переопределите стандартную предопределенную процедуру ПриКомпоновкеРезультата.

Пропишем следующий код в модуле объекта:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем значение нашего булева параметра из пользовательских настроек
    ПараметрПоВыпуску = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти("ПоВыпуску");
    
    Если ПараметрПоВыпуску <> Неопределено Тогда
        
        // Обходим элементы отбора в настройках компоновщика данных
        Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
            
            // Находим нужный элемент отбора по имени его поля компоновки
            Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтатусВыпуска") Тогда
                
                // Если пользователь выбрал Да (Истина), включаем отбор, иначе - выключаем
                ЭлементОтбора.Использование = (ПараметрПоВыпуску.Значение = Истина);
                
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Этот код считывает выбор пользователя из параметров формы. Если выбрано «Да» (Истина), он программно включает стандартный отбор, устанавливая свойство Использование в значение Истина. В противном случае отбор остается выключенным, и СУБД выполняет максимально простой и быстрый запрос без лишних условий.

Настройка интерфейса: как красиво отобразить варианты «Да» / «Нет» в управляемой форме

Чтобы параметр ПоВыпуску выглядел для пользователя профессионально и аккуратно, нам нужно заменить стандартный системный выбор булевых значений на понятные текстовые кнопки «Да» и «Нет».

Выполним пошаговую настройку свойств параметра в конструкторе СКД:

  1. Перейдите на вкладку «Параметры» вашей схемы компоновки данных.
  2. Найдите ваш параметр ПоВыпуску, убедитесь, что его тип установлен как Булево.
  3. В колонке «Доступные значения» нажмите на кнопку выбора (три точки) и добавьте два фиксированных соответствия:
    • Значение: Истина — Представление: Да
    • Значение: Ложь — Представление: Нет
  4. В колонке «Параметры редактирования» найдите свойство «Быстрый выбор» и установите для него значение Истина. Это укажет платформе 1С выводить данный параметр на форме в виде компактного выпадающего списка, а не в виде сложного диалогового окна.
  5. Убедитесь, что параметр включен в состав пользовательских настроек (свойство «Ограничение доступности» отключено, а в свойствах элемента пользовательских настроек задан режим отображения «Быстрый доступ»).

Теперь в шапке отчета над табличной частью появится интуитивный выпадающий список, в котором пользователь сможет четко выбрать нужный режим работы.

Альтернативный вариант: лаконичный флажок (чекбокс)

Если в процессе разработки концепция интерфейса поменяется и вам потребуется заменить список «Да/Нет» на простую галочку (флажок), сделать это в СКД еще проще. Достаточно зайти в параметры схемы и установить для параметра свойство «Использование» в положение «Всегда». Платформа 1С автоматически сгенерирует лаконичный флажок в шапке отчета. Установленный флажок будет соответствовать значению Истина (отбор включен), снятый — значению Ложь (отбор выключен).

Бонус: программное открытие отчета СКД с предзаполненным отбором

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

Для реализации этого в управляемом приложении используется метод ОткрытьФорму. Посмотрим на практический пример кода:


ПараметрыОтбора = Новый Структура;
// Устанавливаем значение нашего параметра
ПараметрыОтбора.Вставить("ПоВыпуску", Истина); 

ПараметрыФормы = Новый Структура;
// Указываем имя варианта отчета из схемы компоновки
ПараметрыФормы.Вставить("КлючВарианта", "Основной"); 
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
// Настраиваем автоматическое формирование при открытии формы
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

// Открываем управляемую форму нашего отчета
ОткрытьФорму("Отчет.ИмяВашегоОтчета.Форма", ПараметрыФормы);

Этот простой код позволяет бесшовно интегрировать отчеты в любые интерфейсные формы конфигурации, значительно экономя время пользователей.

Мы подробно проанализировали задачу создания условных отборов через параметры СКД. Используя предложенные методы, вы сможете делать ваши отчеты удобными, быстрыми и визуально приятными. Желаем вам успешной разработки!

← На главную