Как программно сохранить текст в Word без использования макета в 1С?

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

При разработке регламентных заданий или автоматизированных систем формирования отчетов часто возникает задача: сохранить данные в формате Microsoft Word, не прибегая к созданию статичных макетов в конфигураторе. Это может быть связано с тем, что структура документа слишком динамична или требуется полная независимость от предопределенных печатных форм. В данной статье мы разберем несколько эффективных способов реализации этой задачи, проанализируем их плюсы и минусы, а также учтем специфику работы на стороне сервера в фоновых процессах.

Способ 1: Использование программного формирования Табличного Документа

Это самый надежный и нативный метод для платформы 1С:Предприятие 8.3. Несмотря на то что автор темы хотел избежать "печатных форм", техническое использование объекта ТабличныйДокумент без обращения к объекту метаданных Макет является легитимным и эффективным решением. Начиная с версии 8.3.6, платформа позволяет сохранять табличные документы напрямую в формат .docx.

Рассмотрим по шагам, как это реализовать программно:

  1. Создаем новый экземпляр объекта ТабличныйДокумент в коде.
  2. Программно заполняем ячейки, используя области или прямое обращение по координатам.
  3. Вызываем метод Записать() с указанием соответствующего типа файла.

Пример реализации на встроенном языке:


ТабДок = Новый ТабличныйДокумент;
// Обращаемся к конкретной ячейке программно
Ячейка = ТабДок.Область("R1C1");
Ячейка.Текст = "Результаты регламентного задания";
Ячейка.Шрифт = Новый Шрифт(,,Истина); // Делаем жирным

// Добавляем данные в цикле
Для Каждого СтрокаДанных Из РезультатыЗадания Цикл
    ТекущаяСтрока = ТабДок.ВысотаТаблицы + 1;
    ТабДок.Область("R" + ТекущаяСтрока + "C1").Текст = СтрокаДанных.Наименование;
    ТабДок.Область("R" + ТекущаяСтрока + "C2").Текст = СтрокаДанных.Значение;
КонецЦикла;

// Сохраняем в формат DOCX
ПутьКФайлу = "C:\Reports\Result.docx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.Docx);

Преимущество метода: полная кроссплатформенность. Этот код будет работать на сервере под управлением как Windows, так и Linux, поскольку не требует установленного Microsoft Office.

Способ 2: Использование COM-соединения (Microsoft Word как COM-сервер)

Этот классический метод позволяет управлять приложением Word напрямую через его объектную модель. Мы можем создавать абзацы, таблицы, вставлять изображения и менять стили оформления "на лету". Однако проанализируем важное ограничение: использование COMОбъект крайне не рекомендуется в регламентных заданиях на сервере. Это связано с тем, что Office не предназначен для работы в сессиях без графического интерфейса (Session 0) и может приводить к зависанию процессов WINWORD.EXE.

Если же задача выполняется на клиенте или сервер позволяет использовать COM, алгоритм выглядит следующим образом:


Попытка
    WordApp = Новый COMОбъект("Word.Application");
Исключение
    Сообщить("Microsoft Word не установлен!");
    Возврат;
КонецПопытки;

WordApp.Visible = Ложь; // Скрываем окно приложения
НовыйДок = WordApp.Documents.Add(); // Создаем новый документ
Selection = WordApp.Selection;

Selection.TypeText("Отчет по итогам работы задания");
Selection.TypeParagraph(); // Переход на новую строку
Selection.TypeText("Дата формирования: " + ТекущаяДата());

НовыйДок.SaveAs("C:\Reports\Report.docx");
WordApp.Quit();

Проанализируем ситуацию с безопасностью: при использовании этого метода всегда необходимо оборачивать создание объекта в блок Попытка...Исключение и обязательно закрывать приложение методом Quit(), иначе сервер быстро заполнится "зомби-процессами" Word.

Способ 3: Формирование HTML-документа с расширением .doc

Выясним причину популярности этого способа. Microsoft Word умеет открывать файлы в формате HTML и интерпретировать их разметку как родное форматирование. Для 1С это означает, что мы можем просто собрать длинную строку с HTML-тегами и сохранить ее в файл.

Разберем пример создания простого документа:


ТекстHTML = "<html><body>";
ТекстHTML = ТекстHTML + "<h1>Заголовок отчета</h1>";
ТекстHTML = ТекстHTML + "<p>Это текст, сформированный программно без макетов.</p>";
ТекстHTML = ТекстHTML + "<table border='1'>";
ТекстHTML = ТекстHTML + "<tr><td>Параметр</td><td>Значение</td></tr>";
// Здесь можно добавить строки таблицы в цикле
ТекстHTML = ТекстHTML + "</table>";
ТекстHTML = ТекстHTML + "</body></html>";

ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстHTML);
ТекстовыйДокумент.Записать("C:\Temp\Report.doc", КодировкаТекста.UTF8);

Важный момент: Хотя мы записываем файл с расширением .doc, внутри него находится HTML-код. Современные версии Word могут выдать предупреждение при открытии о несоответствии расширения содержимому, но после подтверждения документ откроется корректно со всеми стилями и таблицами.

Способ 4: Прямая работа со структурой DOCX (OpenXML)

Рассмотрим наиболее продвинутый метод, который подходит для формирования сложных документов. Формат .docx представляет собой ZIP-архив, внутри которого находятся XML-файлы с текстом и настройками. Мы можем программно манипулировать этим содержимым без использования Word.

Общая схема работы выглядит так:

  1. Подготавливаем в конфигурации "пустой" файл docx в качестве двоичных данных (это не макет 1С, а просто шаблонный файл).
  2. Используем объект ЧтениеZipФайла для распаковки архива во временную папку.
  3. Находим файл word/document.xml, в котором хранится основной текст.
  4. Используем ЧтениеXML и ЗаписьXML для модификации текста или добавления новых узлов (абзацев <w:p> и текстовых прогонов <w:r>).
  5. Запаковываем файлы обратно с помощью ЗаписьZipФайла.

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

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

Проанализировав все доступные варианты, мы можем сделать следующие выводы для выбора оптимального решения:

  1. Если вам нужно быстро реализовать задачу и достаточно простого табличного представления — используйте программное создание ТабличныйДокумент и метод Записать() в формате Docx. Это наиболее стабильный путь для регламентных заданий.
  2. Если требуется создать сложный текстовый документ с параграфами и особым форматированием, но без использования COM — формируйте HTML. Это даст гибкость в оформлении при минимальных затратах кода.
  3. Если вы работаете на Windows-сервере и нагрузка невелика (единичные отчеты), можно рассмотреть COM-объекты, но помните о рисках зависания процессов.
  4. Для высокопроизводительных систем лучшим выбором станет прямая манипуляция XML внутри ZIP-архива, что обеспечит максимальную чистоту формата и скорость работы.

Выбор конкретного метода зависит от требований к итоговому файлу и окружения, в котором будет выполняться код 1С.

← На главную