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