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