При работе в облачных сервисах, таких как Scloud, разработчики часто сталкиваются с проблемой: привычный метод формирования печатных форм через COMОбъект("Word.Application") отказывается работать. Особенно остро это проявляется при использовании веб-клиента (через браузер). Ошибка "Тип не определен (COMObject)" возникает из-за того, что в контексте браузера или серверного окружения облака физически отсутствует установленный Microsoft Word, либо к нему нет доступа через COM-интерфейс. Рассмотрим, как обойти эти ограничения и реализовать полноценную печать в формат .docx.
Разберем причину возникновения проблемы. Когда мы пишем код COMОбъект = Новый COMОбъект("Word.Application"), 1С пытается инициализировать приложение Word на той машине, где исполняется код. В случае веб-клиента код исполняется либо на сервере (где Word не установлен в целях безопасности и экономии ресурсов), либо в браузере пользователя (который не имеет прав запускать локальные приложения). Чтобы наша печатная форма работала в любых условиях, нам нужно пересмотреть сам подход к формированию документа.
Проанализируем возможности современной платформы 1С. Если ваша конфигурация использует БСП (например, Бухгалтерия предприятия 3.0, ERP или УНФ), в ней уже заложены механизмы работы с офисными документами без использования COM. Начиная с определенных версий БСП, формирование документов .docx и .odt происходит путем манипуляции внутренним XML-содержимым файла.
Для реализации этого метода выполним следующие шаги:
УправлениеПечатью.СформироватьДокументПоШаблону.Пример кода для серверной части:
// Подготавливаем данные для заполнения
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("НомерДокумента", ОбъектСсылка.Номер);
ДанныеОбъекта.Вставить("ДатаДокумента", Формат(ОбъектСсылка.Дата, "ДЛФ=DD"));
// Получаем макет из конфигурации или расширения
Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.МойШаблонВорд");
// Формируем документ средствами БСП (без COM!)
АдресВоВременномХранилище = "";
УправлениеПечатью.СформироватьДокументПоШаблону(Макет, ДанныеОбъекта, АдресВоВременномХранилище);
Возврат АдресВоВременномХранилище;
Если штатных функций БСП недостаточно или конфигурация сильно кастомизирована, разберем более "низкоуровневый", но надежный метод. Документ формата .docx — это на самом деле ZIP-архив, содержащий набор XML-файлов. Мы можем программно "разобрать" этот архив, заменить нужные текстовые метки в XML и собрать его обратно.
Рассмотрим алгоритм реализации на сервере:
ЧтениеZipФайла для открытия шаблона, хранящегося в двоичных данных.word/document.xml. Это основной файл, содержащий текст документа.ЧтениеXML находим в этом файле наши параметры-заглушки (например, [Контрагент]) и заменяем их на реальные данные из базы.ЗаписьZipФайла, чтобы упаковать измененный XML обратно в структуру архива.Этот метод гарантированно работает в веб-клиенте Scloud, так как 1С выполняет только операции с файлами и строками, не обращаясь к внешним приложениям.
Посмотрим на ситуацию под другим углом. Если верстка договора не требует сложного позиционирования элементов, которое есть только в Word, мы можем упростить себе задачу. Создадим обычный табличный документ 1С (типа .mxl), который умеют рисовать все разработчики, а затем сохраним его в формате .docx.
Выясним, как это сделать программно на сервере:
ТабДок = Новый ТабличныйДокумент;
// ... тут код заполнения табличного документа данными ...
// Сохраняем результат во временный файл в формате DOCX
ИмяФайла = ПолучитьИмяВременногоФайла("docx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.Docx);
// Помещаем файл в хранилище для передачи на клиент
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
Важный нюанс: метод Записать() в формат Docx работает полностью на стороне сервера 1С и не требует установленного офисного пакета. Это идеальный вариант для облака.
Выясним причину, по которой у многих возникают сложности на этапе выдачи файла пользователю. В веб-клиенте прямая работа с файловой системой (например, C:\Temp) запрещена из соображений безопасности браузера. Поэтому мы должны использовать асинхронные методы передачи.
Проанализируем правильную последовательность действий:
ДвоичныеДанные документа (одним из способов выше).URL).Пример клиентского кода для скачивания готового файла:
&НаКлиенте
Асинхр Процедура ЗавершитьПечать(АдресВХранилище)
// Современный асинхронный метод для веб-клиента
ПараметрыПолучения = Новый ПараметрыПолученияФайла;
ПараметрыПолучения.Заголовок = "Сохраните ваш договор";
Ждать ПолучитьФайлССервераАсинх (АдресВХранилище, "Договор.docx", ПараметрыПолучения);
КонецПроцедуры
Многие пользователи опасаются, что облачные сервисы блокируют сторонние разработки. В Scloud ситуация проще, чем в "1С:Фреш": здесь нет жесткого автоматизированного аудита кода. Вы можете подключить свою внешнюю печатную форму (ВПФ) через раздел "Дополнительные отчеты и обработки". Главное условие — чтобы весь код формирования документа был вынесен в серверные модули объекта обработки, а клиентская часть лишь инициировала получение файла, как мы разобрали выше. Если вы используете COM-объекты, форма будет работать только в тонком клиенте при условии, что Word установлен на локальном компьютере пользователя. Для универсальности всегда выбирайте методы без COM.
Мы рассмотрели три способа формирования документов Word в облаке. Для типовых конфигураций лучшим выбором будет использование механизмов БСП. Для простых отчетов подойдет сохранение табличного документа в Docx. А для сложных шаблонов со специфическим форматированием стоит реализовать прямую правку XML внутри ZIP-архива. Главное правило: формирование всегда происходит на сервере, а готовый результат передается клиенту в виде двоичных данных.