Почему при печати внешней печатной формы УПД возникает ошибка «Печатная форма недоступна» и как её исправить?

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

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

Причины возникновения ошибки

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

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

Пошаговое решение и исправление кода

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

Шаг 1. Проверяем регистрацию и экспортную функцию печати

Посмотрим на пример функции Печать в модуле объекта внешней печатной формы. Она должна принимать стандартный набор параметров БСП и вызывать процедуру заполнения коллекции:


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

Шаг 2. Исправляем сбор данных для документов реализации

Выясним причину возврата пустого документа. В процедуре формирования УПД массив ОснованияНаРеализацию накапливает ссылки на документы продажи. Чтобы передать их в печать, необходимо проанализировать выставленные счета-фактуры с помощью метода Документы.СчетФактураВыданный.ПолучитьСчетаФактурыНаПечать(). Если этого не сделать, массив ДокументыБезВыданногоСчетаФактуры останется пустым, и цикл вывода макета просто не запустится.

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


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

Рекомендации по отладке внешних печатных форм

Для ускорения поиска ошибок при разработке внешних печатных форм воспользуемся следующими практическими приемами:

  1. Проверка через точку останова: Поставьте точку останова перед строкой Возврат ТабличныйДокумент; и проверьте значение свойства ТабличныйДокумент.ВысотаТаблицы. Если высота равна 0, проверьте коллекции СтруктураТиповНаПечать и ДанныеДляПечати — в них должны быть реальные строки и ссылки.
  2. Безопасный режим: Если при подключении внешней обработки в справочнике «Дополнительные отчеты и обработки» включен безопасный режим, вызов УстановитьПривилегированныйРежим(Истина) будет проигнорирован. Если в алгоритме требуется доступ к защищенным данным или модулям, установите признак БезопасныйРежим = Ложь в функции регистрации.
  3. Отладка через форму обработки: Чтобы не обновлять обработку в справочнике после каждого изменения, добавьте на основную форму обработки кнопку с вызовом процедуры Печать, передав в качестве параметра массив с конкретной ссылкой на документ реализации.
← На главную