При разработке интеграций и печатных форм часто возникает задача: взять готовый шаблон или анкету, созданную пользователем в формате Microsoft Word (DOC или DOCX), и преобразовать ее в объект ТабличныйДокумент в среде 1С. Обычно это требуется, когда в типовой конфигурации или модуле интеграции заложен механизм, который принимает на вход исключительно ТабличныйДокумент, формирует из него PDF и передает бинарные данные на веб-портал или внешним сервисам.
При попытке автоматической конвертации разработчики неизбежно сталкиваются с тем, что верстка «расползается», границы таблиц съезжают, а текст накладывается друг на друга. Разберем причины такого поведения платформы и рассмотрим рабочие способы решения этой задачи.
Проанализируем архитектурные различия между форматами и ограничения платформы 1С:
ТабличныйДокумент платформы 1С базируется на строгой координатной сетке ячеек (строки, колонки, объединения). При автоматическом преобразовании потокового текста в прямоугольную сетку невозможно точно рассчитать координаты и размеры элементов, что неизбежно приводит к искажению структуры.ТабличныйДокумент.Прочитать() на уровне платформы поддерживает форматы MXL, XLS, XLSX, HTML, MHTML, ODS и TXT. Прямой метод для чтения файлов DOC/DOCX в объектной модели 1С отсутствует.Если механизм формирования строго требует на выходе объект ТабличныйДокумент и находится на типовой поддержке, наиболее надежным и отказоустойчивым решением является отказ от динамической конвертации Word в пользу создания макета в 1С.
Разберем по шагам, как перенести макет:
Шапка, Строка, Подвал).Посмотрим на пример программного заполнения такого макета:
Функция СформироватьАнкету(ДанныеАнкеты) Экспорт
Макет = ПолучитьМакет("МакетАнкеты");
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить();
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Заполнить(ДанныеАнкеты);
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
Если анкет много и ручная перерисовка макетов слишком трудоемка, можно использовать формат HTML в качестве промежуточного звена. Метод ТабличныйДокумент.Прочитать() корректно интерпретирует базовую HTML-разметку.
Рассмотрим порядок действий для конвертации:
mso-*), оставляя чистую структуру тегов table, tr, td.Прочитать().Посмотрим на пример загрузки подготовленного HTML-файла:
ТабДок = Новый ТабличныйДокумент;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");
// После сохранения или генерации HTML-файла читаем его в ТабличныйДокумент
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
ТабДок.Записать(ПутьКФайлуPDF, ТипФайлаТабличногоДокумента.PDF);
Если архитектура решения допускает модификацию цепочки формирования файла, оптимально отказаться от промежуточного перевода в ТабличныйДокумент и сразу формировать PDF из DOCX.
Файл формата DOCX представляет собой ZIP-архив с XML-документами внутри. Платформа 1С позволяет работать с ним встроенными средствами без использования сторонних офисных программ:
ЧтениеZipФайла.word/document.xml, заменяя текстовые метки (например, [ФИОКлиента]) на переданные с портала значения.ЗаписьZipФайла.Прямой и бесшовной автоматической конвертации произвольного файла Word в ТабличныйДокумент в 1С не существует из-за принципиальной разницы в моделях верстки. Для стабильной работы промышленных систем, отдающих документы на портал, рекомендуется однократно перерисовать шаблоны в макеты MXL или перестроить процесс на прямую генерацию PDF из шаблонов DOCX.