Как 1С 8.3 читает содержимое PDF и DOCX и находит по нему документы

· 9 мин

Содержание

Извлечение текста файлов для поиска в 1С 8.3 — это отдельный шаг перед индексацией: платформа объектом ИзвлечениеТекста достаёт из PDF, DOCX или XLSX обычный текст, программа сохраняет его в реквизит карточки файла, и уже этот реквизит попадает в индекс полнотекстового поиска. Без извлечения поиск видит только имя файла и описание, а содержимое вложений для него пустое.

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, Документооборот) включение делается флажками в разделе Администрирование → Общие настройки, а работу выполняют регламентные задания. В своей конфигурации тот же механизм собирается из трёх объектов платформы: ИзвлечениеТекста, реквизита с признаком полнотекстового поиска и ПолнотекстовыйПоиск.ОбновитьИндекс. Чаще всего поиск по содержимому не работает из-за отсутствия фильтра PDF на компьютере, где фактически идёт извлечение.

Как устроен полнотекстовый поиск и где в нём извлечение текста

Полнотекстовый поиск 1С работает не по таблицам базы напрямую, а по собственному индексу. Индекс — это словарь «слово → объекты, где оно встречается» с учётом морфологии русского языка. Поэтому запрос «договоров поставки» находит документ со словами «договор поставки».

Цепочка для присоединённого файла выглядит так:

  1. 📎 Пользователь прикладывает файл к документу или справочнику.
  2. 🔍 Регламентное задание извлечения текста берёт файлы со статусом «не извлечён» и получает из них текст.
  3. 💾 Текст записывается в служебный реквизит версии файла, у файла меняется статус.
  4. 📚 Задание обновления индекса добавляет новый текст в индекс полнотекстового поиска.
  5. ✅ Строка поиска в интерфейсе «Такси» находит файл по фразе из его содержимого.

Отсюда главное правило диагностики: если документ не находится, сначала проверьте, извлёкся ли текст, и только потом — актуален ли индекс. Это две разные операции, и ломаются они по-разному.

Индекс файловой базы лежит в каталоге базы, в папке 1Cv8FTxt. У клиент-серверной базы индекс хранится на сервере 1С в рабочем каталоге кластера, а не в СУБД. При переносе базы через .dt индекс не переносится и строится заново.

Какие форматы 1С извлекает и чем

Объект ИзвлечениеТекста сам не разбирает форматы. На Windows он обращается к фильтрам IFilter — тем же компонентам, которыми пользуется поиск Windows. Что умеет фильтр, то умеет и 1С.

ФорматЧем извлекается на WindowsЧто нужно установить
TXT, HTML, XMLвстроенные фильтры Windowsничего
DOC, XLS, PPTфильтр Microsoft OfficeMicrosoft Office или Office Filter Pack
DOCX, XLSX, PPTXфильтр Microsoft Officeто же, версии 2010 и новее
PDFсторонний PDF IFilterPDF IFilter (например, от Adobe или другого поставщика)
ODT, ODSфильтр OpenDocumentфильтр от LibreOffice или стороннего поставщика
Сканы JPG, TIFF, PDF без текстового слояне извлекаетсянужен отдельный OCR

На Linux системы IFilter нет. Там платформа обрабатывает собственными средствами ограниченный набор — в основном текстовые форматы и офисные файлы Open XML и ODF. Перед переводом сервера 1С на Linux прогоните на нём пробное извлечение по своим типам файлов, особенно по PDF.

Скан договора, сохранённый в PDF, — это картинка. Текста в нём нет, и никакой фильтр его не достанет. Такие файлы получают статус «извлечь не удалось» или пустой текст — это не ошибка настройки.

Важный нюанс про разрядность. Фильтр должен совпадать по разрядности с процессом, который извлекает текст: для 64-битного сервера 1С нужен 64-битный IFilter. Установленный 32-битный фильтр 64-битный процесс rphost просто не увидит.

Как включить полнотекстовый поиск и извлечение текста в типовой конфигурации

В конфигурациях на БСП настройка собрана в одном месте. Порядок для Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 одинаковый.

Шаг 1. Включить сам поиск

  1. Откройте Администрирование → Общие настройки.
  2. Найдите группу «Полнотекстовый поиск» и установите флажок полнотекстового поиска данных.
  3. Перейдите по ссылке настройки рядом с флажком — откроется форма управления индексом и извлечением текстов.

Шаг 2. Включить автоматическое извлечение текста

В той же форме управления есть флажок автоматического извлечения текстов файлов. Он включает регламентное задание «Извлечение текста». Без него файлы так и останутся со статусом «не извлечён».

Шаг 3. Решить, где извлекать текст

Вариант базыГде идёт извлечениеГде ставить IFilter
Файловаяна компьютере, где запущено задание (обычно у пользователя)на этом компьютере
Клиент-серверная, сервер на Windowsна сервере 1Сна сервере 1С
Клиент-серверная, сервер на Linuxна сервере, средствами платформыфильтры не используются

В файловой базе регламентные задания выполняются в сеансе пользователя. Если фильтр PDF стоит только у бухгалтера, а задание отработало у кладовщика, PDF не извлечётся.

Шаг 4. Построить индекс и проверить

  1. В форме управления нажмите обновление индекса и дождитесь окончания.
  2. Проверьте дату актуальности индекса в той же форме.
  3. Приложите тестовый DOCX с редким словом, например «квазистационарный», подождите отработки заданий и найдите его через строку поиска.

Расписание заданий смотрите в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там видны «Извлечение текста», «Обновление индекса ППД» и «Слияние индекса ППД», их последний запуск и ошибки.

Код: извлечение текста через временный файл

Если конфигурация своя или нужно извлечь текст разово, хватит платформенных объектов. Файлы в базе хранятся как ДвоичныеДанные — в хранилище значения, в томе или в потоке. Конструктор ИзвлечениеТекста надёжнее всего кормить именем файла на диске, поэтому двоичные данные сначала записывают во временный файл.

&НаСервере
Функция ТекстИзДвоичныхДанных(ДвоичныеДанные, Расширение)

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ИмяВременногоФайла);

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

    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // файл мог остаться занят фильтром — удалится при очистке временного каталога
    КонецПопытки;

    Возврат Текст;

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

Расширение передавайте без точки: "pdf", "docx". По расширению Windows выбирает фильтр, поэтому файл без расширения не извлечётся, даже если внутри обычный документ Word.

Дальше текст кладут в реквизит, который участвует в полнотекстовом поиске. Если текст длинный, используют реквизит неограниченной строки или ХранилищеЗначения — в БСП текст файла хранится именно в хранилище значения.

Извлекайте текст в фоновом или регламентном задании, а не при записи файла. Разбор PDF на 300 страниц занимает секунды, и пользователь не должен ждать, пока закроется карточка.

Что включить в Конфигураторе, чтобы текст попал в индекс

Полнотекстовый поиск управляется свойствами метаданных. Если реквизит с текстом исключён из поиска, извлечение отработает, а находиться ничего не будет.

  1. Откройте объект метаданных — справочник или регистр, где лежит текст.
  2. На закладке «Прочее» или в палитре свойств найдите свойство «Полнотекстовый поиск» и выберите «Использовать».
  3. Откройте реквизит с текстом и проверьте у него то же свойство — оно задаётся отдельно для каждого реквизита.
  4. Сохраните и выполните Обновить конфигурацию базы данных.

Включить поиск для базы и обновить индекс можно и из кода:

ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(
    РежимПолнотекстовогоПоиска.Разрешить);

// Ложь — без слияния, Истина — порциями
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);

Проверка поиска:

Список = ПолнотекстовыйПоиск.СоздатьСписок("акт сверки поставщик", 50);
Список.ПерваяЧасть();
Сообщить("Найдено: " + Формат(Список.ПолноеКоличество(), "ЧГ=0"));
Для Каждого Элемент Из Список Цикл
    Сообщить(Элемент.Представление);
КонецЦикла;

В строке поиска работают операторы И, ИЛИ, НЕ, фраза в кавычках, звёздочка * для окончания слова и # для нечёткого поиска с опечатками. Пользователям полезно показать хотя бы *: запрос счет* найдёт и «счёт», и «счета-фактуры». Регистр букв при поиске не учитывается, а буквы «е» и «ё» лучше проверить на своей базе тестовым запросом.

Без доработок индексом можно управлять вручную: Все функции → Стандартные → Управление полнотекстовым поиском. Если пункта «Все функции» нет в меню, включите его в параметрах программы.

Почему не находится содержимое файла: ошибки и их устранение

Диагностика: выберите симптом

Очистку и полную перестройку индекса делайте вне рабочего времени. Пока индекс строится, поиск в базе неполный, а на базе с сотнями тысяч объектов построение занимает от десятков минут до нескольких часов. В файловой базе удаление папки 1Cv8FTxt вручную возможно только когда все пользователи вышли из программы — иначе файлы заняты и сеансы получат ошибки.

Если не помогло

  • 🧪 Проверьте фильтр без 1С: положите тот же PDF в папку, которую индексирует поиск Windows, и найдите его по слову из текста. Не находит Windows — не найдёт и 1С.
  • 🧾 Посмотрите журнал регистрации с отбором по событию фонового или регламентного задания — там будет текст исключения фильтра.
  • 👤 Проверьте права учётной записи, от которой работает служба сервера 1С, на временный каталог: временный файл создаётся там.
  • 🔁 После установки фильтра перезапустите службу сервера 1С, чтобы рабочие процессы подхватили его. Перезапуск оборвёт сеансы всех пользователей — делайте это после предупреждения или вечером.

Как ускорить извлечение текста и индекс на больших объёмах

На базе с 50–100 тысячами вложений «включить и забыть» не работает: первое извлечение может идти сутками, а индекс разрастается до гигабайт.

  • ⏱ Разнесите задания по времени. Извлечение текста грузит процессор, обновление индекса — диск. Пусть первое работает ночью, второе — каждые 10–15 минут днём, слияние — раз в сутки.
  • ✂️ Исключите лишнее из индекса. Снимите свойство «Полнотекстовый поиск» с реквизитов, по которым никто не ищет: технических строк, GUID, сумм. Это уменьшит индекс и ускорит обновление.
  • 🧩 Обновляйте порциями. Второй параметр ОбновитьИндекс (Истина) обрабатывает данные частями и не держит задание часами.
  • 🔗 Не забывайте про слияние. Новые данные копятся во вспомогательном индексе; слияние переносит их в основной. Без слияния поиск постепенно замедляется.
  • 💽 Держите индекс на быстром диске. Для серверной базы это диск с рабочим каталогом кластера, для файловой — диск с каталогом базы. SSD заметно сокращает время слияния.
  • 🗂 Разгрузите первое извлечение. Если файлов много, сначала дайте заданию отработать по свежим вложениям, а архив прошлых лет оставьте на выходные.
ДействиеКогда нужноЧем рискуете
Обновление индексапостоянно, по расписаниюничем
Слияние индексараз в сутки или при замедлении поискакороткая нагрузка на диск
Очистка и перестройкапосле сбоя, при ошибках поискапоиск неполный до конца построения
Повторное извлечение текстовпосле установки нового фильтранагрузка на сервер на часы

Частые вопросы об извлечении текста

Можно ли извлечь текст из архива ZIP или RAR?
Только если на компьютере, где идёт извлечение, установлен IFilter для архивов. Без него архив получит статус «извлечь не удалось». Проще прикладывать документы без упаковки.
Сколько места занимает извлечённый текст?
Текст весит в разы меньше исходного файла: из DOCX на 2 МБ с картинками обычно получается 20–50 КБ текста. Основной рост базы дают сами вложения, а не извлечённый текст.
Можно ли искать по тексту файла, не включая полнотекстовый поиск всей базы?
Нет. Поиск по содержимому вложений работает только через общий индекс полнотекстового поиска. Отдельного индекса для файлов в платформе нет.
Нужно ли извлекать текст заново после смены версии файла?
Да, у новой версии файла статус извлечения сбрасывается, и задание обработает её при следующем запуске. Вручную ничего делать не нужно.
Почему поиск находит документ по слову, которого нет в его реквизитах?
Слово есть в присоединённом файле. Результат поиска показывает владельца файла, поэтому кажется, что найден сам документ.