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

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

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

Причина 1: Несовпадение идентификаторов печатной формы в БСП

Проанализируем текст базовой ошибки, возникающей при вызове внешней обработки:

В обработчике печати не был сформирован табличный документ для: ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара

Выясним причину такого поведения подсистемы печати. В стандартной процедуре регистрации внешней обработки СведенияОВнешнейОбработке() каждой команде задается строго определенный идентификатор. Например, разработчик указывает ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара. Однако в процедуре Печать модуля объекта часто используется скопированный из типовой конфигурации вызов, где префикс отсутствует:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаданиеНаОтборРазмещениеТовара") Тогда
        // Код формирования
    КонецЕсли;

КонецПроцедуры

Рассмотрим, что происходит в этот момент: метод УправлениеПечатью.НужноПечататьМакет ищет в переданной коллекции имя ЗаданиеНаОтборРазмещениеТовара. Поскольку БСП ожидает идентификатор ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара, функция возвращает значение Ложь. Блок формирования макета пропускается, результирующий табличный документ в коллекцию не добавляется, и система генерирует исключение.

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

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

КонецПроцедуры

Причина 2: Ошибка «Значение не является значением объектного типа» при обращении к параметрам

При переносе кода функции печати из типового документа часто копируются строчки, работающие с контекстными переменными формы документа, например:

ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_" + ПараметрыПечати.ИмяФормы;

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

  1. Задать постоянное имя настроек печати: свойство ТабличныйДокумент.ИмяПараметровПечати используется платформой для запоминания параметров печати пользователя (масштаб, ориентация, колонтитулы) в системном хранилище. Для внешних печатных форм достаточно указать уникальную статическую строку:
    
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаданиеНаОтборРазмещениеТовара";
    
  2. Инициализировать входящие параметры структуры: если функции формирования требуются свойства объекта ПараметрыПечати, в самом начале тела функции добавим проверку:
    
    Если ПараметрыПечати = Неопределено Тогда
        ПараметрыПечати = Новый Структура;
    КонецЕсли;
    

Методы эффективной отладки внешних печатных форм

Разберем по шагам, как быстро проверять и отлаживать код ВПФ без постоянного переподключения файла через справочник дополнительных отчетов и обработок.

  1. Создание тестовой формы внутри самой ВПФ: добавим в обработку основную форму. Разместим на ней реквизит ДокументСсылка соответствующего типа и кнопку Сформировать. В обработчике нажатия кнопки сымитируем вызов подсистемы печати:
    
    &НаСервере
    Процедура ВыполнитьПечатьНаСервере()
        
        МассивОбъектов = Новый Массив;
        МассивОбъектов.Добавить(ДокументСсылка);
        
        КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара");
        ОбъектыПечати = Новый СписокЗначений;
        ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
        
        ЭтотОбъект = РеквизитФормыВЗначение("Отчет"); // или "Объект" для внешней обработки
        ЭтотОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
        
        // Получаем готовый табличный документ для просмотра
        СтрокаТаблицы = КоллекцияПечатныхФорм.Найти("ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара", "ИмяМакета");
        Если СтрокаТаблицы <> Неопределено Тогда
            Элементы.ПолеТабличногоДокумента.Вывести(СтрокаТаблицы.ТабличныйДокумент);
        КонецЕсли;
        
    КонецПроцедуры
    
    Теперь обработку можно просто открывать через меню Файл — Открыть и использовать стандартные точки останова Конфигуратора.
  2. Пошаговая отладка через БСП: если форма уже зарегистрирована в информационной базе, откроем модуль ОбщийМодуль.ДополнительныеОтчетыИОбработки и найдем место вызова процедуры печати подключаемой обработки. Установим точку останова перед строкой вызова метода Печать. Запустим печать из документа и по нажатию клавиши F11 выполним вход непосредственно в модуль объекта внешней формы.

Поиск синтаксических ошибок в скопированном коде

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

  1. Форматирование блока (автоотступ): выделим весь модуль комбинацией Ctrl + A и нажмем Ctrl + Shift + F (пункт меню Текст — Блок — Форматировать). Платформа автоматически сдвинет отступы вложенных условий. Пролистав код, мы сразу увидим строчку, где отступ неестественно съехал вправо и не вернулся обратно на свой уровень.
  2. Переход к парной конструкции: установим курсор на ключевое слово Если и нажмем Ctrl + ]. Курсор автоматически переместится к соответствующему оператору КонецЕсли. Если перехода не происходит или курсор прыгает не на ту конструкцию, значит, парность условий нарушена именно в этом блоке.
  3. Быстрый переход к номеру строки с ошибкой: чтобы перейти к строке, указанной в сообщении об ошибке синтаксического контроля, нажмем сочетание клавиш Ctrl + G и введем нужный номер строки.
← На главную