Как конвертировать документ Word в табличный документ 1С без искажения верстки?

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

При разработке интеграций и печатных форм часто возникает задача: взять готовый шаблон или анкету, созданную пользователем в формате Microsoft Word (DOC или DOCX), и преобразовать ее в объект ТабличныйДокумент в среде 1С. Обычно это требуется, когда в типовой конфигурации или модуле интеграции заложен механизм, который принимает на вход исключительно ТабличныйДокумент, формирует из него PDF и передает бинарные данные на веб-портал или внешним сервисам.

При попытке автоматической конвертации разработчики неизбежно сталкиваются с тем, что верстка «расползается», границы таблиц съезжают, а текст накладывается друг на друга. Разберем причины такого поведения платформы и рассмотрим рабочие способы решения этой задачи.

Почему Word невозможно автоматически преобразовать в табличный документ 1С?

Проанализируем архитектурные различия между форматами и ограничения платформы 1С:

  1. Разница моделей верстки: Документы Word используют потоковую модель разметки (абзацы, отступы, свободно плавающие блоки, обтекание графики текстом). Объект ТабличныйДокумент платформы 1С базируется на строгой координатной сетке ячеек (строки, колонки, объединения). При автоматическом преобразовании потокового текста в прямоугольную сетку невозможно точно рассчитать координаты и размеры элементов, что неизбежно приводит к искажению структуры.
  2. Ограничения методов платформы: Метод ТабличныйДокумент.Прочитать() на уровне платформы поддерживает форматы MXL, XLS, XLSX, HTML, MHTML, ODS и TXT. Прямой метод для чтения файлов DOC/DOCX в объектной модели 1С отсутствует.
  3. Проблемы с OLE-объектами: Вставка документа Word в макет 1С в виде OLE-объекта работает только на стороне толстого клиента под Windows. При формировании печатной формы на сервере (особенно под управлением Linux или в фоновом задании) генератор PDF не может визуализировать OLE-контейнер и выводит пустой белый квадрат.

Способ 1. Создание эталонного макета MXL непосредственно в 1С

Если механизм формирования строго требует на выходе объект ТабличныйДокумент и находится на типовой поддержке, наиболее надежным и отказоустойчивым решением является отказ от динамической конвертации Word в пользу создания макета в 1С.

Разберем по шагам, как перенести макет:

  1. Откроем конфигуратор и добавим новый макет с типом Табличный документ.
  2. Перенесем структуру анкеты из Word в макет 1С, настроив ширину колонок, высоту строк и объединение ячеек.
  3. Выделим смысловые части в именованные секции (например, Шапка, Строка, Подвал).
  4. В ячейках, куда должны подставляться данные с веб-страницы или портала, установим свойство Заполнение в значение Параметр или Шаблон и зададим имена параметров.

Посмотрим на пример программного заполнения такого макета:


Функция СформироватьАнкету(ДанныеАнкеты) Экспорт

    Макет = ПолучитьМакет("МакетАнкеты");
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Очистить();

    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка.Параметры.Заполнить(ДанныеАнкеты);
    ТабДок.Вывести(ОбластьШапка);

    Возврат ТабДок;

КонецФункции

Способ 2. Промежуточная конвертация через HTML

Если анкет много и ручная перерисовка макетов слишком трудоемка, можно использовать формат HTML в качестве промежуточного звена. Метод ТабличныйДокумент.Прочитать() корректно интерпретирует базовую HTML-разметку.

Рассмотрим порядок действий для конвертации:

  1. Исходный документ Word пересохраняем в формат веб-страницы (HTML или MHTML). Для минимизации искажений разметка исходного документа должна быть строго табличной (без плавающих фреймов и сложных списков).
  2. Очищаем полученный HTML от избыточных стилей Microsoft Word (теги со стилями mso-*), оставляя чистую структуру тегов table, tr, td.
  3. Загружаем файл в табличный документ 1С с помощью метода Прочитать().

Посмотрим на пример загрузки подготовленного HTML-файла:


ТабДок = Новый ТабличныйДокумент;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");

// После сохранения или генерации HTML-файла читаем его в ТабличныйДокумент
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
ТабДок.Записать(ПутьКФайлуPDF, ТипФайлаТабличногоДокумента.PDF);

Способ 3. Прямое заполнение DOCX и экспорт в PDF без Табличного документа

Если архитектура решения допускает модификацию цепочки формирования файла, оптимально отказаться от промежуточного перевода в ТабличныйДокумент и сразу формировать PDF из DOCX.

Файл формата DOCX представляет собой ZIP-архив с XML-документами внутри. Платформа 1С позволяет работать с ним встроенными средствами без использования сторонних офисных программ:

  1. Распаковываем шаблон DOCX с помощью объекта ЧтениеZipФайла.
  2. Считываем и модифицируем основной файл тела документа word/document.xml, заменяя текстовые метки (например, [ФИОКлиента]) на переданные с портала значения.
  3. Запаковываем измененные файлы обратно с помощью ЗаписьZipФайла.
  4. Вызываем консольную утилиту или офисный пакет в фоновом (headless) режиме для конвертации DOCX напрямую в PDF и отправляем полученный бинарный файл пользователю.

Выводы

Прямой и бесшовной автоматической конвертации произвольного файла Word в ТабличныйДокумент в 1С не существует из-за принципиальной разницы в моделях верстки. Для стабильной работы промышленных систем, отдающих документы на портал, рекомендуется однократно перерисовать шаблоны в макеты MXL или перестроить процесс на прямую генерацию PDF из шаблонов DOCX.

← На главную