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