Как исправить ошибку «В обработчике печати не был сформирован табличный документ» в 1С

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

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

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

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

Механизм печати в БСП работает по принципу «заказчик — исполнитель». Когда пользователь нажимает кнопку печати, система вызывает процедуру Печать в модуле вашей обработки. В эту процедуру передается специальная таблица — КоллекцияПечатныхФорм. Задача вашего кода — не просто сформировать ТабличныйДокумент, а зарегистрировать его в этой коллекции под строго определенным идентификатором.

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

Разбор структуры внешней печатной формы

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


Функция СформироватьТабличныйДокумент(ОбъектПечати) Экспорт
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ОриентацияСтраницы  = ОриентацияСтраницы.Ландшафт;
    ТабДок.АвтоМасштаб         = Истина;
    ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АктВыполненныхУслуг";

    Если Не ЗначениеЗаполнено(ОбъектПечати) Тогда
        Возврат ТабДок;
    КонецЕсли;

    Макет = ПолучитьМакет("ПФ_MXL_АктВыполненныхРабот_ru");
    
    // Получение областей макета
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьТекстШапки = Макет.ПолучитьОбласть("ТекстШапки");
    ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
    
    // Вывод областей в документ
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьТекстШапки);
    ТабДок.Вывести(ОбластьПодписи);
    
    Возврат ТабДок;
КонецФункции

Сама по себе эта функция корректна — она возвращает заполненный объект ТабличныйДокумент. Однако проблема обычно находится уровнем выше — в процедуре Печать, которая является точкой входа для БСП.

Синхронизация идентификаторов: пошаговое решение

Для того чтобы система «увидела» ваш документ, необходимо обеспечить идентичность имен в трех ключевых точках. Разберем их по порядку.

1. Функция СведенияОВнешнейОбработке

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


НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Акт выполненных работ";
НоваяКоманда.Идентификатор = "АктВыполненныхРабот"; // ВАЖНО: запоминаем это имя
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыПечатьФормы();

2. Процедура Печать

Теперь рассмотрим правильную реализацию процедуры Печать. Мы должны проверить, нужно ли печатать именно наш макет, и использовать тот же идентификатор АктВыполненныхРабот при выводе в коллекцию.


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

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

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

3. Идентификатор в ВывестиТабличныйДокументВКоллекцию

Обратите внимание на второй параметр метода УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию. Если вы укажете там "АктВыполненныхРабот_1" или просто допустите ошибку в регистре символов (в некоторых случаях это критично), БСП не сможет сопоставить результат с вызванной командой. Система посчитает, что команда была запущена, но «исполнитель» ничего не вернул.

Частые ошибки при формировании коллекции

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

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

Как эффективно отлаживать такие ситуации

Если визуальный осмотр кода не помогает, выполните следующие действия:

Во-первых, проверьте передаваемые параметры. Поставьте точку останова в начале процедуры Печать и посмотрите содержимое КоллекцияПечатныхФорм. Вы увидите колонку ИмяВКоллекции — именно это значение ожидается в качестве идентификатора.

Во-вторых, проанализируйте параметр ОбъектыПечати. Хотя он не всегда напрямую влияет на появление ошибки «не сформирован», его правильное заполнение (связь ссылки документа со строкой в табличном документе) критично для работы навигации в форме предпросмотра.

Выясним причину ошибки через глобальный поиск. Если ошибка не исчезает, поищите по конфигурации вызов текста «В обработчике печати не был сформирован табличный документ». Вы попадете в общий модуль (обычно это УправлениеПечатью), где сможете увидеть, по какой логике система проверяет коллекцию. Это даст вам точное понимание, какого именно ключа не хватает в вашей коллекции КоллекцияПечатныхФорм.

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

← На главную