Как сформировать печатную форму Word в облаке Scloud при работе через веб-клиент?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в облачных сервисах, таких как Scloud, разработчики часто сталкиваются с проблемой: привычный метод формирования печатных форм через COMОбъект("Word.Application") отказывается работать. Особенно остро это проявляется при использовании веб-клиента (через браузер). Ошибка "Тип не определен (COMObject)" возникает из-за того, что в контексте браузера или серверного окружения облака физически отсутствует установленный Microsoft Word, либо к нему нет доступа через COM-интерфейс. Рассмотрим, как обойти эти ограничения и реализовать полноценную печать в формат .docx.

Почему стандартный метод с COMОбъект не работает?

Разберем причину возникновения проблемы. Когда мы пишем код COMОбъект = Новый COMОбъект("Word.Application"), 1С пытается инициализировать приложение Word на той машине, где исполняется код. В случае веб-клиента код исполняется либо на сервере (где Word не установлен в целях безопасности и экономии ресурсов), либо в браузере пользователя (который не имеет прав запускать локальные приложения). Чтобы наша печатная форма работала в любых условиях, нам нужно пересмотреть сам подход к формированию документа.

Решение 1: Использование механизмов Библиотеки стандартных подсистем (БСП)

Проанализируем возможности современной платформы 1С. Если ваша конфигурация использует БСП (например, Бухгалтерия предприятия 3.0, ERP или УНФ), в ней уже заложены механизмы работы с офисными документами без использования COM. Начиная с определенных версий БСП, формирование документов .docx и .odt происходит путем манипуляции внутренним XML-содержимым файла.

Для реализации этого метода выполним следующие шаги:

  1. Создадим макет печатной формы с типом "Двоичные данные", куда загрузим наш шаблон Word.
  2. В коде формирования печатной формы обратимся к общему модулю УправлениеПечатью.
  3. Вместо вызова Word на клиенте, подготовим данные на сервере и воспользуемся методом СформироватьДокументПоШаблону.

Пример кода для серверной части:


// Подготавливаем данные для заполнения
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("НомерДокумента", ОбъектСсылка.Номер);
ДанныеОбъекта.Вставить("ДатаДокумента", Формат(ОбъектСсылка.Дата, "ДЛФ=DD"));

// Получаем макет из конфигурации или расширения
Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.МойШаблонВорд");

// Формируем документ средствами БСП (без COM!)
АдресВоВременномХранилище = "";
УправлениеПечатью.СформироватьДокументПоШаблону(Макет, ДанныеОбъекта, АдресВоВременномХранилище);
Возврат АдресВоВременномХранилище;

Решение 2: Ручная сборка DOCX через OpenXML (ZIP + XML)

Если штатных функций БСП недостаточно или конфигурация сильно кастомизирована, разберем более "низкоуровневый", но надежный метод. Документ формата .docx — это на самом деле ZIP-архив, содержащий набор XML-файлов. Мы можем программно "разобрать" этот архив, заменить нужные текстовые метки в XML и собрать его обратно.

Рассмотрим алгоритм реализации на сервере:

  1. Используем объект ЧтениеZipФайла для открытия шаблона, хранящегося в двоичных данных.
  2. Извлекаем файл word/document.xml. Это основной файл, содержащий текст документа.
  3. С помощью строковых функций или объекта ЧтениеXML находим в этом файле наши параметры-заглушки (например, [Контрагент]) и заменяем их на реальные данные из базы.
  4. Используем ЗаписьZipФайла, чтобы упаковать измененный XML обратно в структуру архива.
  5. Полученный двоичный поток отдаем пользователю.

Этот метод гарантированно работает в веб-клиенте Scloud, так как 1С выполняет только операции с файлами и строками, не обращаясь к внешним приложениям.

Решение 3: Конвертация табличного документа в формат Word

Посмотрим на ситуацию под другим углом. Если верстка договора не требует сложного позиционирования элементов, которое есть только в Word, мы можем упростить себе задачу. Создадим обычный табличный документ 1С (типа .mxl), который умеют рисовать все разработчики, а затем сохраним его в формате .docx.

Выясним, как это сделать программно на сервере:


ТабДок = Новый ТабличныйДокумент;
// ... тут код заполнения табличного документа данными ...

// Сохраняем результат во временный файл в формате DOCX
ИмяФайла = ПолучитьИмяВременногоФайла("docx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.Docx);

// Помещаем файл в хранилище для передачи на клиент
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

Важный нюанс: метод Записать() в формат Docx работает полностью на стороне сервера 1С и не требует установленного офисного пакета. Это идеальный вариант для облака.

Как правильно передать файл на веб-клиент?

Выясним причину, по которой у многих возникают сложности на этапе выдачи файла пользователю. В веб-клиенте прямая работа с файловой системой (например, C:\Temp) запрещена из соображений безопасности браузера. Поэтому мы должны использовать асинхронные методы передачи.

Проанализируем правильную последовательность действий:

  1. На сервере формируем ДвоичныеДанные документа (одним из способов выше).
  2. Помещаем их во временное хранилище и получаем адрес (URL).
  3. На клиенте вызываем процедуру получения файла.

Пример клиентского кода для скачивания готового файла:


&НаКлиенте
Асинхр Процедура ЗавершитьПечать(АдресВХранилище)
    // Современный асинхронный метод для веб-клиента
    ПараметрыПолучения = Новый ПараметрыПолученияФайла;
    ПараметрыПолучения.Заголовок = "Сохраните ваш договор";
    
    Ждать ПолучитьФайлССервераАсинх (АдресВХранилище, "Договор.docx", ПараметрыПолучения);
КонецПроцедуры

Подключение внешней печатной формы в Scloud

Многие пользователи опасаются, что облачные сервисы блокируют сторонние разработки. В Scloud ситуация проще, чем в "1С:Фреш": здесь нет жесткого автоматизированного аудита кода. Вы можете подключить свою внешнюю печатную форму (ВПФ) через раздел "Дополнительные отчеты и обработки". Главное условие — чтобы весь код формирования документа был вынесен в серверные модули объекта обработки, а клиентская часть лишь инициировала получение файла, как мы разобрали выше. Если вы используете COM-объекты, форма будет работать только в тонком клиенте при условии, что Word установлен на локальном компьютере пользователя. Для универсальности всегда выбирайте методы без COM.

Резюме

Мы рассмотрели три способа формирования документов Word в облаке. Для типовых конфигураций лучшим выбором будет использование механизмов БСП. Для простых отчетов подойдет сохранение табличного документа в Docx. А для сложных шаблонов со специфическим форматированием стоит реализовать прямую правку XML внутри ZIP-архива. Главное правило: формирование всегда происходит на сервере, а готовый результат передается клиенту в виде двоичных данных.

← На главную