Как реализовать визуальный отбор на управляемых формах 1С, аналогичный типу Отбор в обычных формах

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

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

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

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

  1. Создадим реквизит формы с типом ДинамическийСписок. Назовем его, например, СписокДляОтбора.
  2. В свойствах реквизита установим флаг Произвольный запрос.
  3. В тексте запроса нам необходимо перечислить поля, по которым пользователь должен иметь возможность устанавливать отбор. Проанализируем пример запроса, который не будет нагружать систему:
    
    Выбрать
        1 КАК Число,
        Значение(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
        Значение(Справочник.Склады.ПустаяСсылка) КАК Склад,
        ДАТАВРЕМЯ(1, 1, 1) КАК Период
    ГДЕ
        Ложь
    
    Использование условия ГДЕ Ложь критически важно: это гарантирует, что список всегда будет пустым и не станет выполнять реальных обращений к таблицам базы данных при открытии формы.
  4. Развернем дерево реквизита СписокДляОтбора в редакторе формы. Найдем вложенный путь НастройкиКомпоновкиДанных.Настройки.Отбор.
  5. Перетащим этот элемент Отбор мышью на форму (например, на отдельную страницу или в группу).

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

Способ 2. Использование Компоновщика настроек компоновки данных

Более изящный и архитектурно правильный метод — использование объекта КомпоновщикНастроекКомпоновкиДанных. Этот способ позволяет не создавать лишних динамических списков и дает полный контроль над доступными полями.

Рассмотрим алгоритм реализации:

  1. Создадим реквизит формы с типом КомпоновщикНастроекКомпоновкиДанных. Назовем его КомпоновщикОтбора.
  2. При создании формы на сервере (процедура ПриСозданииНаСервере) необходимо инициализировать компоновщик. Это нужно, чтобы он «понимал», какие поля доступны для выбора. Если у нас есть готовая схема компоновки данных (СКД) в макете, можно использовать её. Если нет — создадим её программно.
  3. Вынесем на форму элемент, связанный с путем КомпоновщикОтбора.Settings.Filter (в русской редакции — КомпоновщикОтбора.Настройки.Отбор).

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем пустую схему компоновки
    Схема = Новый СхемаКомпоновкиДанных;
    ИсточникДанных = Схема.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "Источник1";
    ИсточникДанных.ТипИсточникаДанных = "Local";
    
    НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "НаборДанных1";
    НаборДанных.Запрос = "ВЫБРАТЬ Номенклатура, Склад ИЗ Справочник.Номенклатура ГДЕ ЛОЖЬ";
    НаборДанных.ИсточникДанных = "Источник1";
    
    // Добавляем доступные поля для отбора
    ПолеНоменклатура = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеНоменклатура.Поле = "Номенклатура";
    ПолеНоменклатура.ПутьКДанным = "Номенклатура";
    ПолеНоменклатура.Заголовок = "Товар";
    
    // Загружаем схему в компоновщик
    АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
    КомпоновщикОтбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
    
КонецПроцедуры

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

Способ 3. Программное получение данных из настроенного отбора

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

Для этого используется ПроцессорКомпоновкиДанных. Разберем пример функции, которая возвращает данные, отфильтрованные согласно настройкам нашего визуального отбора:


&НаСервере
Функция ПолучитьДанныеСУчетомОтбора()
    
    // Получаем текущие настройки из компоновщика на форме
    Настройки = КомпоновщикОтбора.ПолучитьНастройки();
    
    // Создаем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    // Процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в таблицу значений
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТаблицаРезультат = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТаблицаРезультат;
    
КонецФункции

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

Сравнение методов и полезные советы

Выбор конкретного решения зависит от сложности задачи. Посмотрим на основные рекомендации:

Важный нюанс: Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), обратите внимание на подсистему «Групповое изменение реквизитов». Там уже реализованы удобные формы для выбора условий отбора, которые можно вызвать одной строчкой кода и получить готовый результат в виде структуры условий.

Рассмотренные подходы позволяют разработчику гибко настраивать пользовательский интерфейс, сохраняя привычный для пользователей функционал «сложных» отборов при переходе на современные версии платформы 1С:Предприятие 8.3.

← На главную