Почему внешняя печатная форма выдает ошибку «Печатная форма недоступна» для филиалов в 1С?

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

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

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

Механизм возникновения ошибки в БСП

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

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

Анализ типовой ошибки при работе с филиалами

В конфигурациях 1С:ЗУП 3.1 и 1С:ЗКГУ 3.1 филиалы регистрируются как отдельные элементы справочника Организации, у которых установлен флаг филиала и указана головная организация. В реальном учете пользователи часто заполняют адреса, телефоны и ответственных лиц только для головной организации, оставляя контактные данные филиалов пустыми.

Если в запросе для сбора данных используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ со справочником или регистром сведений контактной информации, то при отсутствии записи по филиалу весь запрос возвращает 0 строк. В результате цикл вывода секций макета не выполняется, табличный документ остается пустым, а БСП сообщает, что форма недоступна.

Рассмотрим структуру стандартной функции вывода макета ВПФ:


Функция ТабличныйДокументТрудовойДоговор(Макет, МассивОбъектов, ОбъектыПечати)
    ДокументРезультат = Новый ТабличныйДокумент;
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    
    МассивДанныхЗаполнения = ДанныеДляПечатиТрудовогоДоговора(МассивОбъектов);
    ПервыйПриказ = Истина;
    
    Для Каждого ПараметрыМакета Из МассивДанныхЗаполнения Цикл
        Если Не ПервыйПриказ Тогда
            ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц;
        Иначе
            ПервыйПриказ = Ложь;
        КонецЕсли;
        
        НомерСтрокиНачало = ДокументРезультат.ВысотаТаблицы + 1;
        ОбластьЧасть = Макет.ПолучитьОбласть("Часть10");
        ОбластьЧасть.Параметры.Заполнить(ПараметрыМакета);
        
        ДокументРезультат.Вывести(ОбластьЧасть);
        
        // Регистрация области печати для БСП
        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, НомерСтрокиНачало, ОбъектыПечати, ПараметрыМакета.Ссылка);
    КонецЦикла;
    
    Возврат ДокументРезультат;
КонецФункции

Если функция ДанныеДляПечатиТрудовогоДоговора возвращает пустой массив, объект ДокументРезультат возвращается в метод Печать абсолютно пустым.

Решение 1. Использование ЛЕВОГО СОЕДИНЕНИЯ и получение данных головной организации

Разберем, как сделать выборку данных устойчивой к отсутствию реквизитов у филиалов. В тексте запроса следует всегда использовать ЛЕВОЕ СОЕДИНЕНИЕ и обрабатывать пустые значения через конструкцию ЕСТЬNULL с подстановкой реквизитов головной организации:


ВЫБРАТЬ
    ДокументПрием.Ссылка КАК Ссылка,
    ДокументПрием.Организация КАК Организация,
    ВЫБОР
        КОГДА КонтактнаяИнформацияФилиала.Представление ЕСТЬ NULL ИЛИ КонтактнаяИнформацияФилиала.Представление = ""
            ТОГДА КонтактнаяИнформацияГоловной.Представление
        ИНАЧЕ КонтактнаяИнформацияФилиала.Представление
    КОНЕЦ КАК ЮридическийАдрес
ИЗ
    Документ.ПриемНаРаботу КАК ДокументПрием
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК КонтактнаяИнформацияФилиала
        ПО ДокументПрием.Организация = КонтактнаяИнформацияФилиала.Ссылка
        И КонтактнаяИнформацияФилиала.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации)
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК КонтактнаяИнформацияГоловной
        ПО ДокументПрием.Организация.ГоловнаяОрганизация = КонтактнаяИнформацияГоловной.Ссылка
        И КонтактнаяИнформацияГоловной.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации)
ГДЕ
    ДокументПрием.Ссылка В(&МассивОбъектов)

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

Решение 2. Использование механизмов БСП для контактной информации

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


// Безопасное получение адреса организации или филиала через функции БСП
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
АдресОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОрганизацияСсылка, ВидАдреса);

Если ПустаяСтрока(АдресОрганизации) И ЗначениеЗаполнено(ОрганизацияСсылка.ГоловнаяОрганизация) Тогда
    АдресОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ОрганизацияСсылка.ГоловнаяОрганизация, ВидАдреса);
КонецЕсли;

Решение 3. Добавление логирования ошибок при формировании печатной формы

Чтобы оперативно выявлять причину сбоя при печати и не гадать, почему появилась заглушка «Печатная форма недоступна», обернем процедуру формирования в блок перехвата исключений и сохраним диагностические сведения в Журнал регистрации:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ТрудовойДоговор") Тогда
        Попытка
            ТабДок = ТабличныйДокументТрудовойДоговор(ПолучитьМакет("ТрудовойДоговор"), МассивОбъектов, ОбъектыПечати);
            
            Если ТабДок.ВысотаТаблицы = 0 Тогда
                ВызватьИсключение "Табличный документ не содержит строк. Проверьте заполнение данных организации/филиала.";
            КонецЕсли;
            
            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
                КоллекцияПечатныхФорм, 
                "ТрудовойДоговор", 
                "Трудовой договор", 
                ТабДок
            );
        Исключение
            ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
            ЗаписьЖурналаРегистрации(
                "Печать ВПФ",
                УровеньЖурналаРегистрации.Ошибка,,,
                "Ошибка при формировании трудового договора: " + ИнформацияОбОшибке
            );
            ВызватьИсключение;
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Такой подход гарантирует, что при любых непредвиденных ошибках или пустых выборках разработчик увидит точную причину сбоя в Журнале регистрации конфигурации.

← На главную