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