Как исправить ошибку «Значение не является значением объектного типа (Табличный документ)» во внешней печатной форме УНФ?

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

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

Выясняем причину возникновения ошибки

Проанализируем ситуацию: в типовых конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), процесс формирования печатных форм жестко регламентирован. Когда мы вызываем печать, система создает объект КоллекцияПечатныхФорм. Это таблица значений, в которой хранятся идентификаторы доступных макетов и соответствующие им табличные документы.

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

Правильная структура процедуры Печать в модуле объекта

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

Посмотрим на пример правильной реализации:


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

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

Использование метода УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию — это наиболее безопасный способ. Он самостоятельно находит нужную строку в коллекции или создает ее, избавляя вас от необходимости вручную проверять объекты на Неопределено.

Адаптация сложной логики из модуля менеджера УНФ

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

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

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

Рассмотрим пример функции формирования документа, которая учитывает специфику УНФ, но адаптирована под ВПФ:


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

Почему не стоит делать «Печать» функцией для отладки?

Многие начинающие разработчики меняют Процедура Печать на Функция Печать, чтобы иметь возможность запустить обработку через «Файл - Открыть» и сразу увидеть результат. Это допустимо на этапе разработки, но недопустимо при регистрации в справочнике «Дополнительные отчеты и обработки».

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

Важный момент: В УНФ часто используется механизм ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки. Если вы удалите этот вызов из скопированного кода, кнопка «Отправить по почте» в форме печати может перестать работать или будет выдавать ошибки о пустом вложении. Всегда проверяйте наличие этой строки в финальном коде вашей ВПФ:


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

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

← На главную