При переносе внешних печатных форм из конфигурации «Зарплата и управление персоналом» редакции 2.5 в ЗУП 3.1 разработчики часто сталкиваются с ситуацией, когда макет выводится полностью без данных («голый» макет). Это происходит из-за кардинального изменения архитектуры подсистемы печати: конфигурация ЗУП 3.1 работает на базе Библиотеки Стандартных Подсистем (БСП), где привычный механизм работы с реквизитом СсылкаНаОбъект больше не используется.
Разберем подробно, почему возникает эта проблема, в чем заключается разница парадигм и как правильно адаптировать код внешней печатной формы для работы в ЗУП 3.1.
В ЗУП 2.5 (на обычных формах) для передачи ссылки на печатный документ во внешнюю обработку создавался обязательный реквизит СсылкаНаОбъект. В момент вызова печати платформа автоматически заполняла этот реквизит ссылкой на текущий документ, из которого вызывалась печатная форма.
В ЗУП 3.1 используется подсистема «Дополнительные отчеты и обработки» БСП. В этой концепции реквизит СсылкаНаОбъект не требуется и не заполняется. Все объекты, для которых вызвана печатная форма, передаются в качестве параметров в экспортные процедуры модуля объекта обработки.
Если алгоритм формирования макета продолжает обращаться к СсылкаНаОбъект, система считывает значение Неопределено. В результате логика формирования табличного документа отрабатывает вызовом областей, но параметры остаются незаполненными.
Рассмотрим, как должен выглядеть модуль объекта внешней печатной формы для ЗУП 3.1. Разберем работу по шагам.
СведенияОВнешнейОбработке().Печать(), принимающей массив ссылок на объекты.Проанализируем пример кода функции регистрации обработки в информационной базе:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
// Указываем объекты, к которым подключается печатная форма
ПараметрыРегистрации.Назначение.Добавить("Документ.ПриемНаРаботу");
// Добавление команды печати
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Моя печатная форма'");
НоваяКоманда.Идентификатор = "МояПечатнаяФорма";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Выясним, как передаются ссылки на документы в процедуру печати. При типе команды ТипКомандыВызовСерверногоМетода() подсистема БСП ищет в модуле объекта экспортную процедуру Печать() со строго определенным составом параметров.
Рассмотрим стандартную сигнатуру процедуры и порядок формирования печатной формы:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "МояПечатнаяФорма");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Моя печатная форма'");
КонецЕсли;
КонецПроцедуры
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояПечатнаяФорма";
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Обрабатываем входящие документы из массива
Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
// Заполнение параметров макета из СсылкаНаДокумент
ОбластьШапка.Параметры.Заполнить(СсылкаНаДокумент);
ТабличныйДокумент.Вывести(ОбластьШапка);
// Фиксация выведенного объекта для системы печати
УправлениеПечатью.ЗаполнитьТаблицуИндексовСпецСимволов(ТабличныйДокумент, ОбъектыПечати, СсылкаНаДокумент);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Если перед формированием печатной формы требуется открыть форму внешней обработки (например, для интерактивного выбора подписанта или уточнения параметров печати), используется тип команды ТипКомандыВызовКлиентскогоМетода().
В этом случае в модуле формы внешней обработки реализуется клиентская экспортная процедура с двумя параметрами:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив)
// Реализация логики вызова формы или формирования печатной формы
// ОбъектыНазначенияМассив содержит массив ссылок на выбранные документы
КонецПроцедуры
Чтобы избежать ошибок при выводе пустых данных, рекомендуем проверить следующие моменты:
МассивОбъектов, а не рассчитывает на одиночное значение. В ЗУП 3.1 печать может вызываться одновременно для списка выделенных документов.СсылкаНаОбъект.СведенияОВнешнейОбработке(), должен точно совпадать с идентификатором, передаваемым в функцию УправлениеПечатью.СведенияОПечатнойФорме().