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