Как во внешней обработке получить макет из модуля управляемой формы?

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

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

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

В управляемой форме внешняя обработка представлена основным реквизитом (обычно он называется Объект и имеет тип ДанныеФормыСтруктура). У этого реквизита нет метода ПолучитьМакет(). Чтобы получить доступ ко всем свойствам и методам прикладного объекта, необходимо восстановить реальный объект внешней обработки в памяти сервера.

Для этого используется функция РеквизитФормыВЗначение(). Выполнять данную операцию можно исключительно на стороне сервера.

Посмотрим на пример правильного вызова в серверной процедуре формы:


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

Разбор ошибки: «Недопустимое значение параметра (параметр номер '1')»

Нередко при выполнении кода разработчики сталкиваются с исключением платформы: Ошибка при вызове метода контекста (ПолучитьМакет): Недопустимое значение параметра (параметр номер '1'). Проанализируем основные причины, из-за которых возникает данная ситуация:

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

Чтобы избежать ошибок с жестко прописанными именами, обратимся к объекту через коллекцию метаданных:


&НаСервере
Процедура ПолучитьМакетБезопасно()
    ЭтаОбработка = РеквизитФормыВЗначение("Объект");
    
    // Обращение через метаданные исключает ошибки синтаксиса при изменении имени
    Макет = ЭтаОбработка.ПолучитьМакет(ЭтаОбработка.Метаданные().Макеты.МакетОтчета);
КонецПроцедуры

Архитектурная рекомендация: вынос логики в модуль объекта

Хотя получение макета в модуле формы через РеквизитФормыВЗначение() является рабочим приемом, с точки зрения стандартов разработки 1С формировать печатные формы и отчеты непосредственно в коде формы не рекомендуется. Оптимальный подход заключается в том, чтобы разделить интерфейс и бизнес-логику.

Рассмотрим правильную реализацию задачи по шагам:

  1. В модуле объекта внешней обработки создаем экспортную функцию. В контексте модуля объекта метод ПолучитьМакет() доступен напрямую:
    
    // Модуль объекта внешней обработки
    Функция СформироватьПечатнуюФорму() Экспорт
        ТабДок = Новый ТабличныйДокумент;
        Макет = ПолучитьМакет("МакетОтчета");
        
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ТабДок.Вывести(ОбластьШапка);
        
        Возврат ТабДок;
    КонецФункции
    
  2. В модуле управляемой формы на сервере вызываем эту функцию объекта:
    
    // Модуль формы
    &НаСервере
    Процедура СформироватьНаСервере()
        ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
        ТабличныйДокументРезультат = ОбработкаОбъект.СформироватьПечатнуюФорму();
    КонецПроцедуры
    

Альтернативный вариант: создание экземпляра через менеджер

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


&НаСервере
Процедура ПолучитьМакетИзФайла(ПутьКФайлу)
    ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу);
    Макет = ОбработкаОбъект.ПолучитьМакет("МакетОтчета");
КонецПроцедуры

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

← На главную