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