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