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