При разработке внешних печатных форм для конфигураций 1С на базе Библиотеки Стандартных Подсистем (БСП) часто возникает задача вывести документ не в стандартный табличный документ (формат .mxl), а напрямую в шаблон Microsoft Word. Однако при попытке сформировать такую форму из подменю «Печать» разработчики сталкиваются с критической ошибкой:
{ОбщийМодуль.УправлениеПечатью.Модуль(1119)}: В обработчике печати не был сформирован табличный документ для: [ИмяПечатнойФормы]
В этой статье мы разберем причину возникновения данной ошибки и проанализируем несколько способов её решения.
Проанализируем работу подсистемы «Печать» БСП. При стандартном серверном способе вызова печатных форм подсистема передает в процедуру печати таблицу КоллекцияПечатныхФорм. По завершении выполнения процедуры модуль управления печатью проверяет, для всех ли запрошенных печатных форм был создан и передан объект типа ТабличныйДокумент.
Если генерация документа Word выполняется через COM-объект или напрямую из обработки без заполнения ТабличногоДокумента в коллекции, БСП считает, что произошел сбой, и вызывается исключение. Если же попытаться передать пустой ТабличныйДокумент, ошибка исчезает, но 1С выводит пользователю лишнее пустое окно предварительного просмотра.
Наиболее корректным решением для вызова документов Word, формируемых на стороне клиента или через форму обработки, является сменa способа вызова команды при регистрации внешней обработки.
Рассмотрим, как изменить функцию СведенияОВнешнейОбработке() в модуле объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.КадровыйПеревод");
// Указываем вариант вызова клиентского метода
ТаблицаКоманд = ПараметрыРегистрации.Команды;
СтрокаКоманды = ТаблицаКоманд.Добавить();
СтрокаКоманды.Представление = НСтр("ru = 'Договор в Word'");
СтрокаКоманды.Идентификатор = "ДСТДСаратов";
СтрокаКоманды.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.СпособВызоваКомандыВызовКлиентскогоМетода();
СтрокаКоманды.Модификатор = "ПечатьUnspecified";
Возврат ПараметрыРегистрации;
КонецФункции
При таком подходе обработчик выполняется на клиенте, и серверная проверка БСП на наличие сформированного ТабличногоДокумента не срабатывает. Логику формирования и открытия печатной формы Word в этом случае переносят в форму внешней обработки или клинтский модуль.
Если логика вызова должна оставаться в рамках стандартного серверного метода Печать(), можно обойти ошибку программно. Для этого помещаем в коллекцию пустой табличный документ, а в структуре ПараметрыВывода отключаем его отображение.
Разберем пример реализации в процедуре Печать() модуля объекта:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СформироватьПечатнуюФорму(КоллекцияПечатныхФорм, "ДСТДСаратов");
Если ПечатнаяФорма <> Неопределено Тогда
// Выполняем вашу логику формирования файла Word
СформироватьИОткрытьДокументWord(МассивОбъектов);
// Передаем пустой табличный документ, чтобы избежать ошибки БСП
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
// Отключаем открытие окна просмотра табличного документа в 1С
ПараметрыВывода.ОтображатьТабличныйДокумент = Ложь;
КонецЕсли;
КонецПроцедуры
Благодаря параметру ПараметрыВывода.ОтображатьТабличныйДокумент = Ложь подсистема БСП зафиксирует успешное выполнение печати, но не станет открывать пустое окно перед пользователем.
В современных конфигурациях 1С на базе БСП предусмотрен встроенный механизм работы с макетами MS Word без использования COM-объектов. В этом случае файл .docx загружается в обработку как макет типа ДвоичныеДанные, а замену тегов и формирование печатной формы выполняет сама платформа.
Схема работы со штатным механизмом БСП выглядит следующим образом:
УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента().УправлениеПечатью.ИнициализироватьПечатнуюФорму().УправлениеПечатью.ЗаполнитьПараметры().УправлениеПечатью.СформироватьДокумент().Использование штатного механизма БСП для .docx исключает зависимости от установленного на сервере MS Word и работает кроссплатформенно (в том числе под управлением ОС Linux).