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