В практике 1С-разработчика часто возникает ситуация, когда на стороне клиента или на сервере, где выполняется фоновое задание, не установлен пакет Microsoft Office. Это может быть связано с использованием операционных систем семейства Linux, требованиями безопасности или политикой лицензирования. Традиционный метод через COM-соединение с объектом Word.Application в таких случаях не работает. Однако существует несколько эффективных способов решить эту задачу. Разберем их подробно.
Начиная с версии платформы 8.3.12, разработчики добавили возможность программного формирования файлов формата .docx напрямую из табличного документа. Это самый простой и предпочтительный метод, если вам нужно выгрузить печатную форму. Проанализируем, как это реализовать с помощью объекта ПакетОтображаемыхДокументов.
Рассмотрим пример кода, который позволяет сохранить сформированный табличный документ в файл Word:
// Создаем табличный документ и заполняем его данными
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область(1,1).Текст = "Заголовок документа";
ТабДок.Область(2,1).Текст = "Данные для выгрузки в Word";
// Помещаем табличный документ во временное хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(ТабДок);
// Используем пакет отображаемых документов для конвертации
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета = Пакет.Состав.Добавить();
ЭлементПакета.Данные = АдресХранилища;
// Записываем результат в файл docx
ПутьКФайлу = "C:\Temp\Document.docx";
Пакет.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.DocX);
Этот метод хорош тем, что он полностью независим от внешнего программного обеспечения. Платформа 1С самостоятельно формирует структуру XML-файлов, из которых состоит современный документ Word.
Если вам требуется создать сложный документ по шаблону (например, договор с определенным форматированием текста), а штатный экспорт из ТабличногоДокумента не подходит, мы можем прибегнуть к манипуляции с файлами OpenXML. Напомним, что файл .docx — это обычный ZIP-архив, содержащий XML-структуры.
Разберем алгоритм действий:
шаблон.docx в любом редакторе (хотя бы в WordPad или LibreOffice) один раз.[НомерДоговора], [Дата].ЧтениеZipФайла распаковываем шаблон во временную папку.word/document.xml.СтрЗаменить для подстановки реальных данных вместо меток..docx с помощью ЗаписьZipФайла.Важный нюанс: Как отмечалось в обсуждении, Word может разбивать одну метку (например, [НомерДоговора]) на несколько XML-тегов из-за проверки орфографии или форматирования. Перед созданием шаблона рекомендуется отключить проверку грамматики и вводить метки целиком, не редактируя их внутри.
Если на компьютере нет 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(Истина);
В ситуациях, когда локальное создание файлов по каким-то причинам невозможно, мы можем воспользоваться облачными сервисами. Например, 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, что потребует получения актуального токена перед каждым сеансом связи.
Если строгих требований к формату .docx нет, но файл должен открываться в текстовых редакторах, проанализируем использование HTML или RTF.
CSS). Если сохранить этот текст в файл с расширением .doc, MS Word и LibreOffice откроют его корректно, автоматически интерпретируя теги оформления. Это самый быстрый способ формирования сложных отчетов.ТабличныйДокумент в .rtf «из коробки» методом Записать(Путь, ТипФайлаТабличногоДокумента.RTF).Выбор метода зависит от версии вашей платформы и сложности задачи:
ПакетОтображаемыхДокументов для простого экспорта..docx (ZIP) и заменой строк в XML. Это самый профессиональный и надежный подход, не зависящий от стороннего ПО..doc.Использование данных подходов позволит вам создавать качественные печатные формы в формате Word в любых условиях, обеспечивая стабильную работу системы 1С независимо от установленного офисного ПО.