Почему внешняя печатная форма недоступна для документа «Кадровый перевод списком» и как это исправить

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

При разработке внешних печатных форм (ВПФ) для конфигурации «1С:Зарплата и управление персоналом 3.1» программисты часто сталкиваются с ситуацией: форма идеально работает для одиночного документа (например, КадровыйПеревод), но при попытке подключить её к списочному документу (КадровыйПереводСписком) система выдает ошибку «Печатная форма недоступна». Рассмотрим подробнее, почему это происходит и как правильно адаптировать код обработки.

Анализ функции регистрации СведенияОВнешнейОбработке

Первым делом проанализируем базовую настройку регистрации ВПФ в модуле объекта. Для того чтобы система «увидела» печатную форму в интерфейсе документа, используется экспортная функция СведенияОВнешнейОбработке. Разберем пример кода, который часто используется в качестве шаблона:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.76");
    ПараметрыРегистрации.Информация = НСтр("ru = 'Приказ о переводе (Т-5)'");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
    ПараметрыРегистрации.Версия = "1.0";
    
    // Назначение для списочного документа
    ПараметрыРегистрации.Назначение.Добавить("Документ.КадровыйПереводСписком");
    
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Приказ о переводе (Т-5)'");
    Команда.Идентификатор = "ПФ_MXL_Т5_Внешняя";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
    Команда.ПоказыватьОповещение = Истина;
    Команда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
КонецФункции

Важно помнить, что параметр Идентификатор должен строго совпадать с тем именем, которое вы будете использовать далее в процедуре Печать. Если в регистрации указано ПФ_MXL_Т5_Внешняя, а в коллекции печатных форм будет другое имя, система не сможет связать команду с алгоритмом формирования макета.

Причина №1: Различие в структуре данных (Шапка vs Табличная часть)

Выясним основную техническую причину ошибки. В документе КадровыйПеревод такие данные, как Сотрудник, Должность, Подразделение и ДатаПеревода, находятся непосредственно в шапке (реквизиты документа). Однако в документе КадровыйПереводСписком вся информация о переводах хранится в табличной части Сотрудники.

Проанализируем ситуацию: если ваш запрос в обработке обращается к Ссылка.Сотрудник, то для списочного документа этот код вернет ошибку или неопределенное значение, так как у самого документа-списка нет реквизита Сотрудник. БСП (Библиотека стандартных подсистем) при возникновении исключения внутри кода печати часто перехватывает его и выводит пользователю стандартное сообщение о недоступности формы.

Причина №2: Некорректное заполнение коллекции печатных форм

В процедуре Печать модуля объекта ВПФ мы заполняем таблицу КоллекцияПечатныхФорм. Рассмотрим, как это должно выглядеть, чтобы избежать ошибок:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    ПараметрыПечати = Новый Структура;
    
    // Проверяем наличие нашей команды в коллекции
    НужнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПФ_MXL_Т5_Внешняя");
    Если НужнаяФорма <> Неопределено Тогда
        
        // Формируем табличный документ
        НужнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
        НужнаяФорма.СинонимМакета = "Приказ о переводе (Т-5)";
        
    КонецЕсли;
    
КонецПроцедуры

Если внутри процедуры Печать стоит условие типа Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.КадровыйПеревод"), то при вызове из списочного документа это условие просто не выполнится, строка в коллекцию не добавится, и мы получим ту самую ошибку недоступности.

Как правильно организовать цикл по объектам печати

Разберем по шагам, как должен работать алгоритм для списочного документа. В параметр МассивОбъектов передается ссылка на сам документ КадровыйПереводСписком. Но поскольку приказ Т-5 формируется индивидуально на каждого человека, нам нужно развернуть этот список.

  1. Проанализируем входящий массив ссылок.
  2. Для каждой ссылки (документа) необходимо выполнить запрос к его табличной части Сотрудники.
  3. В цикле по строкам табличной части нужно подготовить данные для каждого сотрудника.
  4. Вывести области макета в итоговый табличный документ, устанавливая разрыв страницы между сотрудниками.

Пример логики запроса для обработки списочного документа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КадровыйПереводСпискомСотрудники.Ссылка КАК Ссылка,
    |	КадровыйПереводСпискомСотрудники.Сотрудник КАК Сотрудник,
    |	КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение,
    |	КадровыйПереводСпискомСотрудники.Должность КАК Должность
    |ИЗ
    |	Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
    |ГДЕ
    |	КадровыйПереводСпискомСотрудники.Ссылка В(&МассивОбъектов)";

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

Использование механизма «Попытка — Исключение»

Часто в коде ВПФ используется конструкция Попытка...Исключение. Если вы только отлаживаете форму, рекомендуем временно закомментировать эти блоки или добавить вывод сообщения об ошибке. Рассмотрим пример:


Попытка
    // Основной код формирования
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить(ОписаниеОшибки()); // Поможет увидеть реальную причину "недоступности"
КонецПопытки;

Без вывода текста ошибки в Исключение, БСП просто «тихо» прекратит выполнение, и вы увидите только стандартное окно о недоступности печатной формы, что сильно затрудняет диагностику.

Версия API БСП

Обратим внимание на строку ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.76"). Если ваша конфигурация ЗУП 3.1 обновлена до актуальных релизов (например, 3.1.23 и выше), попробуйте изменить версию API на более современную, например, 3.0.1.1. В некоторых случаях старые версии интерфейса регистрации могут некорректно обрабатывать параметры модификаторов печати для новых типов документов.

Итоги и рекомендации

Подведем итог: чтобы внешняя печатная форма заработала для документа КадровыйПереводСписком, необходимо обеспечить универсальность кода. Проверьте, чтобы ваш запрос корректно извлекал данные из табличных частей, а идентификаторы команд в функции регистрации и процедуре печати полностью совпадали. Также убедитесь, что в коде отсутствуют жесткие привязки к типам данных, которые актуальны только для одиночных документов перевода.

← На главную