При разработке внешних печатных форм (ВПФ) для конфигурации «1С:Зарплата и управление персоналом 3.1» программисты часто сталкиваются с ситуацией: форма идеально работает для одиночного документа (например, КадровыйПеревод), но при попытке подключить её к списочному документу (КадровыйПереводСписком) система выдает ошибку «Печатная форма недоступна». Рассмотрим подробнее, почему это происходит и как правильно адаптировать код обработки.
Первым делом проанализируем базовую настройку регистрации ВПФ в модуле объекта. Для того чтобы система «увидела» печатную форму в интерфейсе документа, используется экспортная функция СведенияОВнешнейОбработке. Разберем пример кода, который часто используется в качестве шаблона:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.76");
ПараметрыРегистрации.Информация = НСтр("ru = 'Приказ о переводе (Т-5)'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
ПараметрыРегистрации.Версия = "1.0";
// Назначение для списочного документа
ПараметрыРегистрации.Назначение.Добавить("Документ.КадровыйПереводСписком");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Приказ о переводе (Т-5)'");
Команда.Идентификатор = "ПФ_MXL_Т5_Внешняя";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
Команда.ПоказыватьОповещение = Истина;
Команда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Важно помнить, что параметр Идентификатор должен строго совпадать с тем именем, которое вы будете использовать далее в процедуре Печать. Если в регистрации указано ПФ_MXL_Т5_Внешняя, а в коллекции печатных форм будет другое имя, система не сможет связать команду с алгоритмом формирования макета.
Выясним основную техническую причину ошибки. В документе КадровыйПеревод такие данные, как Сотрудник, Должность, Подразделение и ДатаПеревода, находятся непосредственно в шапке (реквизиты документа). Однако в документе КадровыйПереводСписком вся информация о переводах хранится в табличной части Сотрудники.
Проанализируем ситуацию: если ваш запрос в обработке обращается к Ссылка.Сотрудник, то для списочного документа этот код вернет ошибку или неопределенное значение, так как у самого документа-списка нет реквизита Сотрудник. БСП (Библиотека стандартных подсистем) при возникновении исключения внутри кода печати часто перехватывает его и выводит пользователю стандартное сообщение о недоступности формы.
В процедуре Печать модуля объекта ВПФ мы заполняем таблицу КоллекцияПечатныхФорм. Рассмотрим, как это должно выглядеть, чтобы избежать ошибок:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
// Проверяем наличие нашей команды в коллекции
НужнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПФ_MXL_Т5_Внешняя");
Если НужнаяФорма <> Неопределено Тогда
// Формируем табличный документ
НужнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
НужнаяФорма.СинонимМакета = "Приказ о переводе (Т-5)";
КонецЕсли;
КонецПроцедуры
Если внутри процедуры Печать стоит условие типа Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.КадровыйПеревод"), то при вызове из списочного документа это условие просто не выполнится, строка в коллекцию не добавится, и мы получим ту самую ошибку недоступности.
Разберем по шагам, как должен работать алгоритм для списочного документа. В параметр МассивОбъектов передается ссылка на сам документ КадровыйПереводСписком. Но поскольку приказ Т-5 формируется индивидуально на каждого человека, нам нужно развернуть этот список.
Сотрудники.Пример логики запроса для обработки списочного документа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КадровыйПереводСпискомСотрудники.Ссылка КАК Ссылка,
| КадровыйПереводСпискомСотрудники.Сотрудник КАК Сотрудник,
| КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение,
| КадровыйПереводСпискомСотрудники.Должность КАК Должность
|ИЗ
| Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
|ГДЕ
| КадровыйПереводСпискомСотрудники.Ссылка В(&МассивОбъектов)";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Часто в коде ВПФ используется конструкция Попытка...Исключение. Если вы только отлаживаете форму, рекомендуем временно закомментировать эти блоки или добавить вывод сообщения об ошибке. Рассмотрим пример:
Попытка
// Основной код формирования
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить(ОписаниеОшибки()); // Поможет увидеть реальную причину "недоступности"
КонецПопытки;
Без вывода текста ошибки в Исключение, БСП просто «тихо» прекратит выполнение, и вы увидите только стандартное окно о недоступности печатной формы, что сильно затрудняет диагностику.
Обратим внимание на строку ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.76"). Если ваша конфигурация ЗУП 3.1 обновлена до актуальных релизов (например, 3.1.23 и выше), попробуйте изменить версию API на более современную, например, 3.0.1.1. В некоторых случаях старые версии интерфейса регистрации могут некорректно обрабатывать параметры модификаторов печати для новых типов документов.
Подведем итог: чтобы внешняя печатная форма заработала для документа КадровыйПереводСписком, необходимо обеспечить универсальность кода. Проверьте, чтобы ваш запрос корректно извлекал данные из табличных частей, а идентификаторы команд в функции регистрации и процедуре печати полностью совпадали. Также убедитесь, что в коде отсутствуют жесткие привязки к типам данных, которые актуальны только для одиночных документов перевода.