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