Как создать документ Word в 1С без установленного Microsoft Office

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

В практике 1С-разработчика часто возникает ситуация, когда на стороне клиента или на сервере, где выполняется фоновое задание, не установлен пакет Microsoft Office. Это может быть связано с использованием операционных систем семейства Linux, требованиями безопасности или политикой лицензирования. Традиционный метод через COM-соединение с объектом Word.Application в таких случаях не работает. Однако существует несколько эффективных способов решить эту задачу. Разберем их подробно.

Способ 1: Использование штатных средств платформы (начиная с 8.3.12)

Начиная с версии платформы 8.3.12, разработчики добавили возможность программного формирования файлов формата .docx напрямую из табличного документа. Это самый простой и предпочтительный метод, если вам нужно выгрузить печатную форму. Проанализируем, как это реализовать с помощью объекта ПакетОтображаемыхДокументов.

Рассмотрим пример кода, который позволяет сохранить сформированный табличный документ в файл Word:


// Создаем табличный документ и заполняем его данными
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область(1,1).Текст = "Заголовок документа";
ТабДок.Область(2,1).Текст = "Данные для выгрузки в Word";

// Помещаем табличный документ во временное хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(ТабДок);

// Используем пакет отображаемых документов для конвертации
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета = Пакет.Состав.Добавить();
ЭлементПакета.Данные = АдресХранилища;

// Записываем результат в файл docx
ПутьКФайлу = "C:\Temp\Document.docx";
Пакет.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.DocX);

Этот метод хорош тем, что он полностью независим от внешнего программного обеспечения. Платформа 1С самостоятельно формирует структуру XML-файлов, из которых состоит современный документ Word.

Способ 2: Работа с форматом .docx как с ZIP-архивом (OpenXML)

Если вам требуется создать сложный документ по шаблону (например, договор с определенным форматированием текста), а штатный экспорт из ТабличногоДокумента не подходит, мы можем прибегнуть к манипуляции с файлами OpenXML. Напомним, что файл .docx — это обычный ZIP-архив, содержащий XML-структуры.

Разберем алгоритм действий:

  1. Создаем эталонный файл шаблон.docx в любом редакторе (хотя бы в WordPad или LibreOffice) один раз.
  2. В тексте шаблона расставляем уникальные метки-заполнители, например: [НомерДоговора], [Дата].
  3. В 1С с помощью объекта ЧтениеZipФайла распаковываем шаблон во временную папку.
  4. Находим основной файл с текстом — обычно это word/document.xml.
  5. Читаем содержимое этого XML как обычную строку текста.
  6. Используем функцию СтрЗаменить для подстановки реальных данных вместо меток.
  7. Записываем измененный текст обратно в файл.
  8. Упаковываем папку обратно в ZIP-архив с расширением .docx с помощью ЗаписьZipФайла.

Важный нюанс: Как отмечалось в обсуждении, Word может разбивать одну метку (например, [НомерДоговора]) на несколько XML-тегов из-за проверки орфографии или форматирования. Перед созданием шаблона рекомендуется отключить проверку грамматики и вводить метки целиком, не редактируя их внутри.

Способ 3: Использование LibreOffice через COM (если он установлен)

Если на компьютере нет MS Office, но установлен бесплатный LibreOffice или OpenOffice, мы можем управлять им программно. У LibreOffice есть свой программный интерфейс (UNO API), который позволяет работать с документами в фоновом режиме.

Выясним, как инициализировать соединение:


// Попытка создать объект менеджера LibreOffice
Попытка
    ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
    Сообщить("LibreOffice не найден!");
    Возврат;
КонецПопытки;

// Создаем экземпляр Desktop для работы с документами
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");

// Параметры открытия (скрытый режим)
Параметры = Новый COMSafeArray("Unknown", 1);
Параметр = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Параметр.Name = "Hidden";
Параметр.Value = Истина;
Параметры.SetValue(0, Параметр);

// Создаем новый документ (Writer)
ТекстДокумент = Desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Параметры);

// Работа с текстом документа
Cursor = ТекстДокумент.Text.createTextCursor();
ТекстДокумент.Text.insertString(Cursor, "Привет из 1С через LibreOffice!", Ложь);

// Сохранение в формате DOCX
ПутьСохранения = "file:///C:/Temp/LibreDoc.docx"; // URL-формат пути
ПараметрыСохранения = Новый COMSafeArray("Unknown", 1);
ПараметрСохр = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
ПараметрСохр.Name = "FilterName";
ПараметрСохр.Value = "MS Word 2007 XML";
ПараметрыСохранения.SetValue(0, ПараметрСохр);

ТекстДокумент.storeAsURL(ПутьСохранения, ПараметрыСохранения);
ТекстДокумент.close(Истина);

Способ 4: Использование внешних API (Google Docs)

В ситуациях, когда локальное создание файлов по каким-то причинам невозможно, мы можем воспользоваться облачными сервисами. Например, Google Docs API позволяет программно создавать документы и скачивать их в нужном формате. Рассмотрим пример отправки файла для обработки:


СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full";
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ТокенАвторизации);
Заголовки.Вставить("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");

// Отправка файла на сервер для регистрации или конвертации
Результат = Соединение.ОтправитьДляОбработки(ПутьКФайлуИсточнику, УРЛ, ПутьКОтвету, Заголовки);

Стоит помнить, что современные протоколы Google требуют авторизации через OAuth 2.0, что потребует получения актуального токена перед каждым сеансом связи.

Способ 5: Форматы-посредники (HTML и RTF)

Если строгих требований к формату .docx нет, но файл должен открываться в текстовых редакторах, проанализируем использование HTML или RTF.

  1. HTML: Вы можете сформировать текстовую строку с обычной HTML-разметкой (таблицы, стили CSS). Если сохранить этот текст в файл с расширением .doc, MS Word и LibreOffice откроют его корректно, автоматически интерпретируя теги оформления. Это самый быстрый способ формирования сложных отчетов.
  2. RTF (Rich Text Format): Это текстовый формат описания документов. Он достаточно громоздкий для ручного написания, но 1С умеет сохранять ТабличныйДокумент в .rtf «из коробки» методом Записать(Путь, ТипФайлаТабличногоДокумента.RTF).

Резюме и рекомендации

Выбор метода зависит от версии вашей платформы и сложности задачи:

Использование данных подходов позволит вам создавать качественные печатные формы в формате Word в любых условиях, обеспечивая стабильную работу системы 1С независимо от установленного офисного ПО.

← На главную