При попытке загрузить файл формата .doc или .docx напрямую в объект ТабличныйДокумент с помощью метода Прочитать() разработчики 1С сталкиваются с ошибкой. В отличие от табличных файлов (XLS, XLSX, CSV, HTML), текстовые документы Word представляют собой файлы со сплошной (потоковой) версткой, и платформа 1С не предназначена для их прямого открытия в табличном документе.
Рассмотрим, почему возникает эта проблема, и разберем практические способы чтения и загрузки данных из файлов Word без привлечения COM-объектов (MS Office), что особенно актуально при работе на серверах под управлением Linux.
Выясним причину, по которой штатный метод Прочитать() объекта ТабличныйДокумент выдает ошибку при работе с документами Word:
Если задача заключается исключительно в получении простого текста из документа без сохранения сложного форматирования и сетки таблиц, разберем работу штатной функции платформы ИзвлечьТекст(). Данная функция работает нативно и не требует использования COM-соединения.
Посмотрим на пример использования:
ТекстДокумента = ИзвлечьТекст("C:\Docs\Contract.docx");
Сообщить(ТекстДокумента);
Данный подход отлично подходит для задач полнотекстового поиска, анализа содержимого или первичного парсинга текстовых данных.
Так как формат .docx является ZIP-архивом, мы можем распаковать его стандартными средствами 1С с помощью объекта ЧтениеZipФайла и прочитать основной файл с текстовым содержимым word/document.xml.
Разберем процесс по шагам:
.docx с помощью объекта ЧтениеZipФайла.word/document.xml во временный каталог.ЧтениеXML или ПостроительDOM.<w:tbl> — таблица документа;<w:tr> — строка таблицы;<w:tc> — ячейка таблицы;<w:t> — текстовое содержимое.ТабличныйДокумент или ТаблицаЗначений.Рассмотрим пример кода для извлечения основного XML-файла из архива DOCX:
КаталогВременныхФайлов = КаталогВременныхФайлов();
ИмяИсполняемогоФайла = "C:\Docs\TableData.docx";
ЧтениеZip = Новый ЧтениеZipФайла(ИмяИсполняемогоФайла);
Для Каждого ЭлементАрхива Из ЧтениеZip.Элементы Цикл
Если ЭлементАрхива.ПолноеИмя = "word/document.xml" Тогда
ЧтениеZip.Извлечь(ЭлементАрхива, КаталогВременныхФайлов, РежимВосстановленияПутейФайлов.НеВосстанавливать);
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеZip.Закрыть();
ПутьКXML = КаталогВременныхФайлов + "document.xml";
Если необходимо загрузить документ со сложной табличной структурой непосредственно в ТабличныйДокумент, проанализируем вариант с предварительной консольной конвертацией файла. Данный метод является кроссплатформенным и работает как на Windows, так и на Linux-серверах.
С помощью консольного режима LibreOffice (пакет soffice) документ конвертируется в формат HTML или XLSX, после чего платформа 1С легко считывает его штатным методом Прочитать().
Рассмотрим команду консольной конвертации:
soffice --headless --convert-to html "C:\Docs\Document.docx" --outdir "C:\Docs\Converted\"
После выполнения данной команды полученный HTML-файл можно беспрепятственно загрузить в 1С:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Docs\Converted\Document.html", СпособЧтенияТабличногоДокумента.HTML);
В «Библиотеке Стандартных Подсистем» (БСП) в подсистеме «Управление печатью» присутствуют готовые встроенные механизмы работы с макетами и файлами формата .docx. Если ваша конфигурация построена на базе БСП, рекомендуется проанализировать функции этой подсистемы — они позволяют формировать и обрабатывать документы Word без использования COM-объектов MS Office.