Почему возникает ошибка «Поле объекта не обнаружено» при передаче параметров между формами 1С и как её исправить?

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

Передача данных между формами — одна из самых частых задач при разработке в среде «1С:Предприятие». Однако при переходе с обычных форм на управляемые разработчики часто сталкиваются с ошибкой «Поле объекта не обнаружено (ИмяПараметра)» при попытке прочитать переданное значение на клиенте в обработчике ПриОткрытии.

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

Анализ проблемы и причина возникновения ошибки

Рассмотрим типовую ситуацию. Из основной формы (например, формы элемента справочника) вызывается открытие подчиненной формы с передачей структуры параметров:


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

В открываемой форме разработчик пытается сразу прочитать значение в клиентском событии ПриОткрытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Страна = Параметры.СтрокаПередаваемая; // Вызывает ошибку "Поле объекта не обнаружено"!
КонецПроцедуры

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

  1. В обычных формах структура параметров полностью передавалась и оставалась доступной на клиенте в любой момент времени.
  2. В управляемых формах структура Параметры доступна в полном объеме только на сервере во время выполнения обработчика ПриСозданииНаСервере.

Когда форма передается на клиент для выполнения процедуры ПриОткрытии, произвольные пользовательские параметры не сохраняются автоматически в структуре Параметры, если они не были помещены в реквизиты формы или не являются ключевыми.

Способ 1. Чтение параметров в «ПриСозданииНаСервере» (Рекомендуемый подход)

Проанализируем стандартное решение этой задачи. Чтобы данные были доступны на клиенте, их необходимо прочитать на сервере в момент создания формы и записать в реквизиты формы или объекта.

Разберем по шагам создание правильного механизма:

  1. В конфигураторе на закладке «Параметры» открываемой формы создаем параметр СтрокаПередаваемая с нужным типом данных (например, Строка).
  2. На закладке «Реквизиты» добавляем реквизит формы для хранения полученных данных (например, Страна) или используем реквизит основного объекта Объект.Страна.
  3. В модуле формы обрабатываем событие ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметра в структуре
    Если Параметры.Свойство("СтрокаПередаваемая") Тогда
        // Записываем значение в реквизит формы или объекта
        Страна = Параметры.СтрокаПередаваемая;
    КонецЕсли;
    
КонецПроцедуры

После выполнения этого кода реквизит Страна будет доступен в любых клиентских процедурах, включая ПриОткрытии и события элементов формы.

Способ 2. Использование ключевых параметров

Выясним, в каком случае параметр остается доступен в структуре Параметры на клиенте в процедуре ПриОткрытии.

В конфигураторе в свойствах параметра формы присутствует флаг «Ключевой». Ключевые параметры имеют особенность: платформа сохраняет их на протяжении всего жизненного цикла формы (и на сервере, и на клиенте).

Важное ограничение: ключевой параметр влияет на уникажность экземпляра формы. Если попытаться открыть форму с тем же значением ключевого параметра, платформа не создаст новый экземпляр, а активизирует уже открытое окно. Используйте этот способ только тогда, когда такое поведение логически оправдано.

Возврат полученных данных в основную форму

Когда данные в подчиненной форме заполнены, возникает необходимость передать результат обратно в вызывающую форму. Для этого в современных управляемых формах применяются следующие методы:

  1. ОповеститьОВыборе: Подчиненная форма вызывается с указанием владельца. При завершении выбора вызывается метод ОповеститьОВыборе(Значение), а в форме-владельце обрабатывается событие ОбработкаВыбора.
  2. ОписаниеОповещения (асинхронный вызов): При вызове ОткрытьФорму() передается объект ОписаниеОповещения. В подчиненной форме вызывается метод Закрыть(ПередаваемыйРезультат), и данные попадают напрямую в процедуру-обработчик оповещения.

Пример использования асинхронного закрытия с возвратом данных:


// Модуль подчиненной формы
&НаКлиенте
Процедура КомандаОК(Команда)
    // Передаем заполненное значение при закрытии
    Закрыть(Страна); 
КонецПроцедуры

Резюме

Чтобы избежать ошибки Поле объекта не обнаружено в 1С 8.3:

← На главную