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