Как правильно извлекать текст из файлов DOCX в 1С и какие есть подводные камни?

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

При работе с файлами формата DOCX в платформе 1С разработчики часто сталкиваются с ситуацией, когда объект ИзвлечениеТекста возвращает пустую строку или вызывает ошибку. Разберем, как работает этот механизм, какие существуют системные требования и как обойти основные ограничения.

Принцип работы и подводные камни объекта ИзвлечениеТекста

В операционной системе Windows объект ИзвлечениеТекста использует системный интерфейс Microsoft Search (IFilter). Это означает, что платформа 1С не разбирает содержимое DOCX напрямую через этот объект, а обращается к внешнему компоненту ОС.

Рассмотрим ключевые особенности и возможные причины проблем:

  1. Необходимость установки фильтра: На компьютере или сервере, где выполняется код, должен быть установлен пакет Microsoft Office Filter Pack или MS Office. Без установленного IFilter процедура извлечения текста не сработает.
  2. Соответствие разрядности: Разрядность пакета IFilter должна строго совпадать с разрядностью исполняемого процесса 1С. Для 64-разрядного сервера 1С требуется 64-битный IFilter, а для 32-разрядного процесса — 32-битный.
  3. Контекст исполнения: Если извлечение выполняется на сервере (в фоновом или регламентном задании), пакет фильтров должен быть установлен непосредственно на сервере 1С.
  4. Отсутствие форматирования: Объект возвращает сплошной неструктурированный текст. Форматирование, таблицы, стили и текст внутри графических объектов не сохраняются.

Проанализируем стандартный вариант безопасного вызова объекта в коде 1С:


Попытка
    Извлекатель = Новый ИзвлечениеТекста(ПутьКФайлу);
    ТекстДокумента = Извлекатель.ПолучитьТекст();
Исключение
    ЗаписьЖурналаРегистрации("Извлечение текста", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ТекстДокумента = "";
КонецПопытки;

Альтернативный вариант: прямой разбор ZIP и XML средствами 1С

Файл формата DOCX представляет собой обычный ZIP-архив с множеством XML-файлов внутри. Очищенный текст документа находится в файле word/document.xml внутри тегов <w:t>. Посмотрим, как прочитать текст напрямую без использования сторонних компонентом Windows.

Разберем алгоритм по шагам:

  1. Распаковать DOCX-файл во временный каталог с помощью ЧтениеZipФайла.
  2. Прочитать содержимое файла word/document.xml через ЧтениеXML.
  3. Считать текстовые узлы и собрать их в общую строку.

Рассмотрим пример реализации такого алгоритма:


Функция ИзвлечьТекстИзDocx(ПутьКФайлу)
    
    ВременнаяПапка = КаталогВременныхФайлов() + "DocxUnpack_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
    СоздатьКаталог(ВременнаяПапка);
    
    Zip = Новый ЧтениеZipФайла(ПутьКФайлу);
    Zip.ИзвлечьВсе(ВременнаяПапка, РежимВосстановленияПутейФайловZIP.Восстанавливать);
    Zip.Закрыть();
    
    ПутьКXml = ВременнаяПапка + "/word/document.xml";
    ФайлXml = Новый Файл(ПутьКXml);
    Если НЕ ФайлXml.Существует() Тогда
        УдалитьФайлы(ВременнаяПапка);
        Возврат "";
    КонецЕсли;
    
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ПутьКXml);
    
    РезультатТекст = Новый Массив;
    
    Пока Чтение.Прочитать() Цикл
        Если Чтение.Имя = "w:t" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Чтение.Прочитать();
            Если Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
                РезультатТекст.Добавить(Чтение.Значение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикл;
    
    Чтение.Закрыть();
    УдалитьФайлы(ВременнаяПапка);
    
    Возврат СтрСоединить(РезультатТекст, " ");
    
КонецФункции

Выяснив причины проблем, мы можем выбрать наиболее подходящее решение: установить корректный пакет IFilter нужной разрядности на сервер 1С либо применить кроссплатформенный разбор структуры XML средствами самой платформы.

← На главную