При разработке внешних печатных форм (ВПФ) для конфигураций на базе Библиотеки стандартных подсистем (1С:ЗУП 3.1, 1С:ЗКГУ 3.1, 1С:ERP и др.) разработчики нередко сталкиваются с ситуацией, когда печать документа по головной организации выполняется корректно, а при попытке сформировать тот же документ по филиалу программа выводит сообщение: «Печатная форма недоступна».
Проанализируем архитектуру подсистемы печати БСП, выясним коренную причину этой ошибки и разберем практические шаги по ее устранению.
Сообщение «Печатная форма недоступна» является универсальной экранной заглушкой подсистемы печати Библиотеки стандартных подсистем. Разберем ключевые ситуации, приводящие к такому поведению программы:
Неопределено) перехватывается механизмом БСП, после чего пользователю выводится стандартная заглушка.ОбъектыПечати с помощью метода УправлениеПечатью.ЗадатьОбластьПечатиДокумента, подсистема может трактовать это как отсутствие результата печати.В конфигурациях 1С:ЗУП 3.1 и 1С:ЗКГУ 3.1 филиалы регистрируются как отдельные элементы справочника Организации, у которых установлен флаг филиала и указана головная организация. В реальном учете пользователи часто заполняют адреса, телефоны и ответственных лиц только для головной организации, оставляя контактные данные филиалов пустыми.
Если в запросе для сбора данных используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ со справочником или регистром сведений контактной информации, то при отсутствии записи по филиалу весь запрос возвращает 0 строк. В результате цикл вывода секций макета не выполняется, табличный документ остается пустым, а БСП сообщает, что форма недоступна.
Рассмотрим структуру стандартной функции вывода макета ВПФ:
Функция ТабличныйДокументТрудовойДоговор(Макет, МассивОбъектов, ОбъектыПечати)
ДокументРезультат = Новый ТабличныйДокумент;
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
МассивДанныхЗаполнения = ДанныеДляПечатиТрудовогоДоговора(МассивОбъектов);
ПервыйПриказ = Истина;
Для Каждого ПараметрыМакета Из МассивДанныхЗаполнения Цикл
Если Не ПервыйПриказ Тогда
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц;
Иначе
ПервыйПриказ = Ложь;
КонецЕсли;
НомерСтрокиНачало = ДокументРезультат.ВысотаТаблицы + 1;
ОбластьЧасть = Макет.ПолучитьОбласть("Часть10");
ОбластьЧасть.Параметры.Заполнить(ПараметрыМакета);
ДокументРезультат.Вывести(ОбластьЧасть);
// Регистрация области печати для БСП
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, НомерСтрокиНачало, ОбъектыПечати, ПараметрыМакета.Ссылка);
КонецЦикла;
Возврат ДокументРезультат;
КонецФункции
Если функция ДанныеДляПечатиТрудовогоДоговора возвращает пустой массив, объект ДокументРезультат возвращается в метод Печать абсолютно пустым.
Разберем, как сделать выборку данных устойчивой к отсутствию реквизитов у филиалов. В тексте запроса следует всегда использовать ЛЕВОЕ СОЕДИНЕНИЕ и обрабатывать пустые значения через конструкцию ЕСТЬNULL с подстановкой реквизитов головной организации:
ВЫБРАТЬ
ДокументПрием.Ссылка КАК Ссылка,
ДокументПрием.Организация КАК Организация,
ВЫБОР
КОГДА КонтактнаяИнформацияФилиала.Представление ЕСТЬ NULL ИЛИ КонтактнаяИнформацияФилиала.Представление = ""
ТОГДА КонтактнаяИнформацияГоловной.Представление
ИНАЧЕ КонтактнаяИнформацияФилиала.Представление
КОНЕЦ КАК ЮридическийАдрес
ИЗ
Документ.ПриемНаРаботу КАК ДокументПрием
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК КонтактнаяИнформацияФилиала
ПО ДокументПрием.Организация = КонтактнаяИнформацияФилиала.Ссылка
И КонтактнаяИнформацияФилиала.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК КонтактнаяИнформацияГоловной
ПО ДокументПрием.Организация.ГоловнаяОрганизация = КонтактнаяИнформацияГоловной.Ссылка
И КонтактнаяИнформацияГоловной.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации)
ГДЕ
ДокументПрием.Ссылка В(&МассивОбъектов)
При таком подходе, даже если у филиала не внесен юридический или фактический адрес, запрос вернет строку с адресом головной организации, документ успешно сформируется и выведется на экран.
Вместо ручного соединения таблиц контактной информации рекомендуется использовать штатные функции БСП из модуля УправлениеКонтактнойИнформацией, которые безопасно извлекают адреса и телефоны без риска падения запроса:
// Безопасное получение адреса организации или филиала через функции БСП
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
АдресОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОрганизацияСсылка, ВидАдреса);
Если ПустаяСтрока(АдресОрганизации) И ЗначениеЗаполнено(ОрганизацияСсылка.ГоловнаяОрганизация) Тогда
АдресОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОрганизацияСсылка.ГоловнаяОрганизация, ВидАдреса);
КонецЕсли;
Чтобы оперативно выявлять причину сбоя при печати и не гадать, почему появилась заглушка «Печатная форма недоступна», обернем процедуру формирования в блок перехвата исключений и сохраним диагностические сведения в Журнал регистрации:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ТрудовойДоговор") Тогда
Попытка
ТабДок = ТабличныйДокументТрудовойДоговор(ПолучитьМакет("ТрудовойДоговор"), МассивОбъектов, ОбъектыПечати);
Если ТабДок.ВысотаТаблицы = 0 Тогда
ВызватьИсключение "Табличный документ не содержит строк. Проверьте заполнение данных организации/филиала.";
КонецЕсли;
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ТрудовойДоговор",
"Трудовой договор",
ТабДок
);
Исключение
ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(
"Печать ВПФ",
УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка при формировании трудового договора: " + ИнформацияОбОшибке
);
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что при любых непредвиденных ошибках или пустых выборках разработчик увидит точную причину сбоя в Журнале регистрации конфигурации.