Как передать ссылку на объект или параметр в форму в обычном приложении 1С?

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

При разработке внешних печатных форм (ВПФ) и обработок для обычного приложения часто возникает необходимость перед формированием печатного документа открыть диалоговое окно или форму настройки. При этом в открываемую форму требуется передать контекст — например, ссылку на документ, для которого формируется печатная форма, или другие вспомогательные параметры.

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

Причина ошибки «Поле объекта не обнаружено»

Проанализируем типовую ситуацию: в модуле обработки разработчик получает форму и пытается передать в нее значение следующим образом:


Форма = ЭтотОбъект.ПолучитьФорму("Форма");
Форма.Параметр = СсылкаНаОбъект;
Форма.Открыть();

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

Также важно помнить о различиях между обычным и управляемым приложением. В управляемом интерфейсе передача параметров выполняется через специальную структуру:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КтоОткрывает", Ссылка);
ОткрытьФорму("МояФорма", ПараметрыОткрытия);

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

Способ 1. Объявление экспортной переменной в модуле формы

Это самый быстрый и распространенный способ передать произвольное значение в форму перед ее открытием.

  1. Откроем модуль нужной формы.
  2. В самом верху модуля (в секции объявлений переменных) объявим переменную с ключевым словом Экспорт:

Перем Параметр Экспорт;

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


ФормаПечати = ЭтотОбъект.ПолучитьФорму("Форма");
ФормаПечати.Параметр = СсылкаНаОбъект;
ФормаПечати.Открыть();

После этого внутри событий формы (например, в процедуре ПередОткрытием или ПриОткрытии) переданное значение будет доступно в переменной Параметр.

Способ 2. Добавление реквизита на закладке «Реквизиты» формы

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

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

После добавления реквизита к нему можно обращаться извне:


ФормаПечати = ЭтотОбъект.ПолучитьФорму("Форма");
ФормаПечати.СсылкаНаОбъект = СсылкаНаОбъект;
ФормаПечати.Открыть();

Способ 3. Экспортная процедура инициализации

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


Процедура ИнициализироватьДанные(ПереданнаяСсылка) Экспорт
    // Сохраняем ссылку или заполняем элементы формы
    СсылкаНаДокумент = ПереданнаяСсылка;
КонецПроцедуры

Вызов перед открытием выглядит следующим образом:


ФормаПечати = ЭтотОбъект.ПолучитьФорму("Форма");
ФормаПечати.ИнициализироватьДанные(СсылкаНаОбъект);
ФормаПечати.Открыть();

Способ 4. Использование реквизитов объекта обработки

Для внешних печатных форм в типовых конфигурациях обычного приложения стандартным механизмом является наличие реквизита СсылкаНаОбъект у самого объекта внешней обработки.

Разберем, как работает этот механизм:

  1. В дереве метаданных внешней обработки создается реквизит СсылкаНаОбъект (составной тип, включающий ссылки на необходимые документы).
  2. Когда форма создается от этого объекта через ЭтотОбъект.ПолучитьФорму("Форма"), и у формы назначен основной реквизит обработки (свойство ЭтотОбъект / РеквизитОбработки), реквизиты объекта становятся напрямую доступны в модуле формы без дополнительной ручной передачи.

В таком случае достаточно, чтобы ссылка была заполнена в объекте обработки до вызова формы. Внутри модуля формы обращение к значению выполняется напрямую по имени реквизита:


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

Итоги

При работе с обычными формами 1С важно различать реквизиты объекта обработки и свойства самой формы. Для передачи данных используйте объявление экспортных переменных модуля формы (Перем ИмяПеременной Экспорт;), добавление реквизитов формы или вызов собственных экспортных процедур инициализации.

← На главную