Почему внешняя печатная форма в ЗУП 3.1 не видит документ и выводит пустой макет?

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

При переносе внешних печатных форм из конфигурации «Зарплата и управление персоналом» редакции 2.5 в ЗУП 3.1 разработчики часто сталкиваются с ситуацией, когда макет выводится полностью без данных («голый» макет). Это происходит из-за кардинального изменения архитектуры подсистемы печати: конфигурация ЗУП 3.1 работает на базе Библиотеки Стандартных Подсистем (БСП), где привычный механизм работы с реквизитом СсылкаНаОбъект больше не используется.

Разберем подробно, почему возникает эта проблема, в чем заключается разница парадигм и как правильно адаптировать код внешней печатной формы для работы в ЗУП 3.1.

Причина проблемы: сфера применения реквизита СсылкаНаОбъект

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

В ЗУП 3.1 используется подсистема «Дополнительные отчеты и обработки» БСП. В этой концепции реквизит СсылкаНаОбъект не требуется и не заполняется. Все объекты, для которых вызвана печатная форма, передаются в качестве параметров в экспортные процедуры модуля объекта обработки.

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

Разбираем правильную структуру внешней печатной формы в БСП

Рассмотрим, как должен выглядеть модуль объекта внешней печатной формы для ЗУП 3.1. Разберем работу по шагам.

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

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


Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Версия = "1.0";
	
	// Указываем объекты, к которым подключается печатная форма
	ПараметрыРегистрации.Назначение.Добавить("Документ.ПриемНаРаботу");
	
	// Добавление команды печати
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Моя печатная форма'");
	НоваяКоманда.Идентификатор = "МояПечатнаяФорма";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	НоваяКоманда.Модификатор = "ПечатьMXL";
	
	Возврат ПараметрыРегистрации;

КонецФункции

Реализация процедуры печати на сервере

Выясним, как передаются ссылки на документы в процедуру печати. При типе команды ТипКомандыВызовСерверногоМетода() подсистема БСП ищет в модуле объекта экспортную процедуру Печать() со строго определенным составом параметров.

Рассмотрим стандартную сигнатуру процедуры и порядок формирования печатной формы:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "МояПечатнаяФорма");
	Если ПечатнаяФорма <> Неопределено Тогда
		ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
		ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Моя печатная форма'");
	КонецЕсли;

КонецПроцедуры

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояПечатнаяФорма";

	Макет = ПолучитьМакет("Макет");
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

	// Обрабатываем входящие документы из массива
	Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
		
		// Заполнение параметров макета из СсылкаНаДокумент
		ОбластьШапка.Параметры.Заполнить(СсылкаНаДокумент);
		ТабличныйДокумент.Вывести(ОбластьШапка);
		
		// Фиксация выведенного объекта для системы печати
		УправлениеПечатью.ЗаполнитьТаблицуИндексовСпецСимволов(ТабличныйДокумент, ОбъектыПечати, СсылкаНаДокумент);
		
	КонецЦикла;

	Возврат ТабличныйДокумент;

КонецФункции

Альтернативный вариант: вызов клиентского метода

Если перед формированием печатной формы требуется открыть форму внешней обработки (например, для интерактивного выбора подписанта или уточнения параметров печати), используется тип команды ТипКомандыВызовКлиентскогоМетода().

В этом случае в модуле формы внешней обработки реализуется клиентская экспортная процедура с двумя параметрами:


&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив)
	
	// Реализация логики вызова формы или формирования печатной формы
	// ОбъектыНазначенияМассив содержит массив ссылок на выбранные документы
	
КонецПроцедуры

Основные чек-листы при переносе печатных форм из ЗУП 2.5 в ЗУП 3.1

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

  1. Перевод логики на работу с массивом: Убедитесь, что алгоритм запроса или получения данных принимает МассивОбъектов, а не рассчитывает на одиночное значение. В ЗУП 3.1 печать может вызываться одновременно для списка выделенных документов.
  2. Удаление обращений к реквизиту обработки: Полностью исключите из кода модуля и макета ссылки на реквизит СсылкаНаОбъект.
  3. Проверка прав доступа и безопасного режима: Если обработка подключается в безопасном режиме (по умолчанию в БСП), вызовы привилегированного модуля или обращение к незащищенным ресурсам могут блокироваться. При необходимости отключите безопасный режим в карточке дополнительной обработки.
  4. Совпадение идентификаторов: Идентификатор команды, указанный в СведенияОВнешнейОбработке(), должен точно совпадать с идентификатором, передаваемым в функцию УправлениеПечатью.СведенияОПечатнойФорме().
← На главную