При разработке регламентных заданий или автоматизированных систем формирования отчетов часто возникает задача: сохранить данные в формате Microsoft Word, не прибегая к созданию статичных макетов в конфигураторе. Это может быть связано с тем, что структура документа слишком динамична или требуется полная независимость от предопределенных печатных форм. В данной статье мы разберем несколько эффективных способов реализации этой задачи, проанализируем их плюсы и минусы, а также учтем специфику работы на стороне сервера в фоновых процессах.
Это самый надежный и нативный метод для платформы 1С:Предприятие 8.3. Несмотря на то что автор темы хотел избежать "печатных форм", техническое использование объекта ТабличныйДокумент без обращения к объекту метаданных Макет является легитимным и эффективным решением. Начиная с версии 8.3.6, платформа позволяет сохранять табличные документы напрямую в формат .docx.
Рассмотрим по шагам, как это реализовать программно:
ТабличныйДокумент в коде.Записать() с указанием соответствующего типа файла.Пример реализации на встроенном языке:
ТабДок = Новый ТабличныйДокумент;
// Обращаемся к конкретной ячейке программно
Ячейка = ТабДок.Область("R1C1");
Ячейка.Текст = "Результаты регламентного задания";
Ячейка.Шрифт = Новый Шрифт(,,Истина); // Делаем жирным
// Добавляем данные в цикле
Для Каждого СтрокаДанных Из РезультатыЗадания Цикл
ТекущаяСтрока = ТабДок.ВысотаТаблицы + 1;
ТабДок.Область("R" + ТекущаяСтрока + "C1").Текст = СтрокаДанных.Наименование;
ТабДок.Область("R" + ТекущаяСтрока + "C2").Текст = СтрокаДанных.Значение;
КонецЦикла;
// Сохраняем в формат DOCX
ПутьКФайлу = "C:\Reports\Result.docx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.Docx);
Преимущество метода: полная кроссплатформенность. Этот код будет работать на сервере под управлением как Windows, так и Linux, поскольку не требует установленного Microsoft Office.
Этот классический метод позволяет управлять приложением 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.
Выясним причину популярности этого способа. 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 могут выдать предупреждение при открытии о несоответствии расширения содержимому, но после подтверждения документ откроется корректно со всеми стилями и таблицами.
Рассмотрим наиболее продвинутый метод, который подходит для формирования сложных документов. Формат .docx представляет собой ZIP-архив, внутри которого находятся XML-файлы с текстом и настройками. Мы можем программно манипулировать этим содержимым без использования Word.
Общая схема работы выглядит так:
docx в качестве двоичных данных (это не макет 1С, а просто шаблонный файл).ЧтениеZipФайла для распаковки архива во временную папку.word/document.xml, в котором хранится основной текст.ЧтениеXML и ЗаписьXML для модификации текста или добавления новых узлов (абзацев <w:p> и текстовых прогонов <w:r>).ЗаписьZipФайла.Этот метод гарантирует отсутствие проблем с совместимостью и работает максимально быстро, так как 1С просто обрабатывает текстовые XML-данные и упаковывает их. Это "профессиональный" стандарт для высоконагруженных серверных систем.
Проанализировав все доступные варианты, мы можем сделать следующие выводы для выбора оптимального решения:
ТабличныйДокумент и метод Записать() в формате Docx. Это наиболее стабильный путь для регламентных заданий.Выбор конкретного метода зависит от требований к итоговому файлу и окружения, в котором будет выполняться код 1С.