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