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