Как программно наложить отбор в форме выбора в управляемом приложении 1С?

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

Переход с обычных форм на управляемые часто ставит перед разработчиками задачу: как реализовать привычный механизм отбора при выборе значения реквизита. В версии 8.1 мы активно использовали ЭлементыФормы.СправочникСписок.Отбор, однако в управляемых формах логика изменилась. Давайте разберем наиболее эффективные и современные способы решения этой задачи.

Использование механизма параметров выбора

Это самый «чистый» способ, который позволяет управлять доступными значениями выбора прямо в форме, где расположен реквизит. Мы используем свойство ПараметрыВыбора элемента формы. Главный нюанс здесь — необходимость использования ФиксированногоМассива, так как платформа требует неизменяемости структуры параметров.

Рассмотрим, как это реализовать на практике в процедуре НачалоВыбора:


&НаКлиенте
Процедура ФабрикаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Формируем список допустимых значений на сервере
    СписокКонтрагентов = ПолучитьСписокКонтрагентовНаСервере();
    
    // Создаем параметр выбора для поля
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка", СписокКонтрагентов);
    
    // Формируем массив и делаем его фиксированным для платформы
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(НовыйПараметр);
    Элементы.Контрагент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры

Важно помнить, что СписокКонтрагентов также должен быть сформирован как ФиксированныйМассив или массив, содержащий значения, соответствующие типу поля. Этот метод удобен тем, что он декларативен и не требует открытия сторонних форм вручную.

Передача отбора через параметры при открытии формы

Если вам необходимо более тонкое управление процессом или требуется открыть конкретную форму выбора с уже наложенным фильтром, можно использовать метод ОткрытьФорму. Мы передаем структуру отбора, которую платформа автоматически применит к ДинамическомуСписку открываемой формы.

Рассмотрим порядок действий для реализации:

  1. Вызываем ОткрытьФорму с параметром Отбор.
  2. В параметре передаем структуру, где ключом является имя поля, а значением — массив данных для отбора.

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

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

Реализация через серверную настройку динамического списка

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

Пример кода для формы выбора:


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

Рекомендации по выбору метода

Проанализируем ситуации, в которых стоит применять тот или иной подход:

При работе с программными отборами всегда следите за типом данных. Если в поле Отбор передается массив, убедитесь, что все элементы массива соответствуют ожидаемому типу поля, иначе платформа может проигнорировать отбор или вызвать ошибку исполнения.

← На главную