Как исправить ошибку «Ошибка при установке значения атрибута контекста (ПараметрыВыбора)» и установить отбор при открытии формы выбора?

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

При программном открытии формы выбора со сложным или динамическим отбором разработчики часто сталкиваются с непредвиденной ошибкой времени выполнения:

Ошибка при установке значения атрибута контекста (ПараметрыВыбора): Несоответствие типов

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

Выясним причину ошибки

Посмотрим на типичный фрагмент кода события НачалоВыбора:


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

Проанализируем, почему на строке присвоения структуры переменной ПараметрыВыбора платформа 1С выбрасывает исключение. В контексте модуля управляемой формы имя ПараметрыВыбора зарезервировано — это системное свойство элементов управления и формы, имеющее тип ФиксированныйМассив.

Если мы не объявили локальную переменную явно с помощью ключевого слова Перем, платформа считает обращение ПараметрыВыбора = ... попыткой перезаписать системное свойство формы или элемента. Поскольку тип присваиваемого значения (Структура) не совпадает с ожидаемым системным типом (ФиксированныйМассив), возникает ошибка «Несоответствие типов».

Способ 1. Переименование локальной переменной структуры параметров

Самое быстрое и простое исправление — заменить имя переменной, передаваемой в метод ОткрытьФорму, например, на ПараметрыФормы или ПараметрыОткрытия.

Рассмотрим исправленный код:


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

При передаче структуры с ключом "Отбор" платформа автоматически накладывает условие. Если в правое значение передан массив ссылок или СписокЗначений, платформа автоматически применит вид сравнения «В списке».

Способ 2. Использование объекта ФиксированныеНастройки

Если требуется жестко зафиксировать отбор в открываемой форме без возможности его изменения пользователем, либо если стандартная структура отбора переопределяется прикладной логикой конфигурации, воспользуемся объектом НастройкиКомпоновкиДанных.

Разберем по шагам построение настроек компоновки данных:

  1. Создаем экземпляр объекта НастройкиКомпоновкиДанных.
  2. Добавляем в коллекцию элементов отбора новый элемент типа ЭлементОтбораКомпоновкиДанных.
  3. Устанавливаем левое значение как Новый ПолеКомпоновкиДанных("Ссылка").
  4. Указываем вид сравнения ВидСравненияКомпоновкиДанных.ВСписке.
  5. Передаем в правое значение массив или список ссылок.
  6. Передаем настройки в параметре формы с ключом "ФиксированныеНастройки".

Посмотрим на пример реализации:


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

Способ 3. Штатный механизм элемента формы без отключения стандартной обработки

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

Рассмотрим, как правильно сформировать массив параметров выбора:


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

Что проверить, если форма открывается, но отбор не применяется

Если после устранения ошибки форма выбора открывается, но список элементов не фильтруется или отображается пустым, проанализируем следующие моменты:

  1. Заполнение коллекции значений: убедимся, что серверная функция возвращает заполненный массив или список. Если передать пустой массив в отбор по условию «В списке», динамический список не вернет ни одной записи.
  2. Типы данных в списке: если используется СписокЗначений, проверим, что в свойство Значение каждого элемента списка помещена именно ссылка на объект (СправочникСсылка.Партнеры), а не строка с наименованием или кодом.
  3. Логика в модуле формы выбора: проверим обработчик ПриСозданииНаСервере открываемой формы. Если в типовой конфигурации там выполняется принудительная инициализация или сброс Список.КомпоновщикНастроек, внешние параметры могут перезаписываться. В таких случаях передача через ФиксированныеНастройки является наиболее надежным решением.
  4. Настройки динамического списка: если список построен на основе произвольного запроса, поле, по которому накладывается фильтр, должно присутствовать в выборке запроса и иметь корректный псевдоним.
← На главную