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