Как 1С 8.3 читает содержимое PDF и DOCX и находит по нему документы
Содержание
Извлечение текста файлов для поиска в 1С 8.3 — это отдельный шаг перед индексацией: платформа объектом ИзвлечениеТекста достаёт из PDF, DOCX или XLSX обычный текст, программа сохраняет его в реквизит карточки файла, и уже этот реквизит попадает в индекс полнотекстового поиска. Без извлечения поиск видит только имя файла и описание, а содержимое вложений для него пустое.
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, Документооборот) включение делается флажками в разделе Администрирование → Общие настройки, а работу выполняют регламентные задания. В своей конфигурации тот же механизм собирается из трёх объектов платформы: ИзвлечениеТекста, реквизита с признаком полнотекстового поиска и ПолнотекстовыйПоиск.ОбновитьИндекс. Чаще всего поиск по содержимому не работает
из-за отсутствия фильтра PDF на компьютере, где фактически идёт извлечение.
Как устроен полнотекстовый поиск и где в нём извлечение текста
Полнотекстовый поиск 1С работает не по таблицам базы напрямую, а по собственному индексу. Индекс — это словарь «слово → объекты, где оно встречается» с учётом морфологии русского языка. Поэтому запрос «договоров поставки» находит документ со словами «договор поставки».
Цепочка для присоединённого файла выглядит так:
- 📎 Пользователь прикладывает файл к документу или справочнику.
- 🔍 Регламентное задание извлечения текста берёт файлы со статусом «не извлечён» и получает из них текст.
- 💾 Текст записывается в служебный реквизит версии файла, у файла меняется статус.
- 📚 Задание обновления индекса добавляет новый текст в индекс полнотекстового поиска.
- ✅ Строка поиска в интерфейсе «Такси» находит файл по фразе из его содержимого.
Отсюда главное правило диагностики: если документ не находится, сначала проверьте, извлёкся ли текст, и только потом — актуален ли индекс. Это две разные операции, и ломаются они по-разному.
Индекс файловой базы лежит в каталоге базы, в папке 1Cv8FTxt. У клиент-серверной базы индекс хранится на сервере 1С в рабочем каталоге кластера, а не в СУБД. При переносе базы через .dt индекс не переносится и строится заново.
Какие форматы 1С извлекает и чем
Объект ИзвлечениеТекста сам не разбирает форматы. На Windows он обращается к фильтрам IFilter — тем же компонентам, которыми пользуется поиск Windows. Что умеет фильтр, то умеет и 1С.
| Формат | Чем извлекается на Windows | Что нужно установить |
|---|---|---|
| TXT, HTML, XML | встроенные фильтры Windows | ничего |
| DOC, XLS, PPT | фильтр Microsoft Office | Microsoft Office или Office Filter Pack |
| DOCX, XLSX, PPTX | фильтр Microsoft Office | то же, версии 2010 и новее |
| сторонний PDF IFilter | PDF 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. Включить сам поиск
- Откройте
Администрирование → Общие настройки. - Найдите группу «Полнотекстовый поиск» и установите флажок полнотекстового поиска данных.
- Перейдите по ссылке настройки рядом с флажком — откроется форма управления индексом и извлечением текстов.
Шаг 2. Включить автоматическое извлечение текста
В той же форме управления есть флажок автоматического извлечения текстов файлов. Он включает регламентное задание «Извлечение текста». Без него файлы так и останутся со статусом «не извлечён».
Шаг 3. Решить, где извлекать текст
| Вариант базы | Где идёт извлечение | Где ставить IFilter |
|---|---|---|
| Файловая | на компьютере, где запущено задание (обычно у пользователя) | на этом компьютере |
| Клиент-серверная, сервер на Windows | на сервере 1С | на сервере 1С |
| Клиент-серверная, сервер на Linux | на сервере, средствами платформы | фильтры не используются |
В файловой базе регламентные задания выполняются в сеансе пользователя. Если фильтр PDF стоит только у бухгалтера, а задание отработало у кладовщика, PDF не извлечётся.
Шаг 4. Построить индекс и проверить
- В форме управления нажмите обновление индекса и дождитесь окончания.
- Проверьте дату актуальности индекса в той же форме.
- Приложите тестовый DOCX с редким словом, например «квазистационарный», подождите отработки заданий и найдите его через строку поиска.
Расписание заданий смотрите в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там видны «Извлечение текста», «Обновление индекса ППД» и «Слияние индекса ППД», их последний запуск и ошибки.
Код: извлечение текста через временный файл
Если конфигурация своя или нужно извлечь текст разово, хватит платформенных объектов. Файлы в базе хранятся как ДвоичныеДанные — в хранилище значения, в томе или в потоке. Конструктор ИзвлечениеТекста надёжнее всего кормить именем файла на диске, поэтому двоичные данные сначала записывают во временный файл.
&НаСервере
Функция ТекстИзДвоичныхДанных(ДвоичныеДанные, Расширение)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Текст = "";
Попытка
Извлечение = Новый ИзвлечениеТекста(ИмяВременногоФайла);
Текст = Извлечение.ПолучитьТекст();
Исключение
ЗаписьЖурналаРегистрации("ИзвлечениеТекста",
УровеньЖурналаРегистрации.Предупреждение, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// файл мог остаться занят фильтром — удалится при очистке временного каталога
КонецПопытки;
Возврат Текст;
КонецФункции
Расширение передавайте без точки: "pdf", "docx". По расширению Windows выбирает фильтр, поэтому файл без расширения не извлечётся, даже если внутри обычный документ Word.
Дальше текст кладут в реквизит, который участвует в полнотекстовом поиске. Если текст длинный, используют реквизит неограниченной строки или ХранилищеЗначения — в БСП текст файла хранится именно в хранилище значения.
Извлекайте текст в фоновом или регламентном задании, а не при записи файла. Разбор PDF на 300 страниц занимает секунды, и пользователь не должен ждать, пока закроется карточка.
Что включить в Конфигураторе, чтобы текст попал в индекс
Полнотекстовый поиск управляется свойствами метаданных. Если реквизит с текстом исключён из поиска, извлечение отработает, а находиться ничего не будет.
- Откройте объект метаданных — справочник или регистр, где лежит текст.
- На закладке «Прочее» или в палитре свойств найдите свойство «Полнотекстовый поиск» и выберите «Использовать».
- Откройте реквизит с текстом и проверьте у него то же свойство — оно задаётся отдельно для каждого реквизита.
- Сохраните и выполните
Обновить конфигурацию базы данных.
Включить поиск для базы и обновить индекс можно и из кода:
ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(
РежимПолнотекстовогоПоиска.Разрешить);
// Ложь — без слияния, Истина — порциями
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);
Проверка поиска:
Список = ПолнотекстовыйПоиск.СоздатьСписок("акт сверки поставщик", 50);
Список.ПерваяЧасть();
Сообщить("Найдено: " + Формат(Список.ПолноеКоличество(), "ЧГ=0"));
Для Каждого Элемент Из Список Цикл
Сообщить(Элемент.Представление);
КонецЦикла;
В строке поиска работают операторы И, ИЛИ, НЕ, фраза в кавычках, звёздочка * для окончания слова и # для нечёткого поиска с опечатками. Пользователям полезно показать хотя бы *: запрос счет* найдёт и «счёт», и «счета-фактуры». Регистр букв при поиске не учитывается, а буквы «е» и «ё» лучше проверить на своей базе тестовым запросом.
Без доработок индексом можно управлять вручную: Все функции → Стандартные → Управление полнотекстовым поиском. Если пункта «Все функции» нет в меню, включите его в параметрах программы.
Почему не находится содержимое файла: ошибки и их устранение
Очистку и полную перестройку индекса делайте вне рабочего времени. Пока индекс строится, поиск в базе неполный, а на базе с сотнями тысяч объектов построение занимает от десятков минут до нескольких часов. В файловой базе удаление папки 1Cv8FTxt вручную возможно только когда все пользователи вышли из программы — иначе файлы заняты и сеансы получат ошибки.
Если не помогло
- 🧪 Проверьте фильтр без 1С: положите тот же PDF в папку, которую индексирует поиск Windows, и найдите его по слову из текста. Не находит Windows — не найдёт и 1С.
- 🧾 Посмотрите журнал регистрации с отбором по событию фонового или регламентного задания — там будет текст исключения фильтра.
- 👤 Проверьте права учётной записи, от которой работает служба сервера 1С, на временный каталог: временный файл создаётся там.
- 🔁 После установки фильтра перезапустите службу сервера 1С, чтобы рабочие процессы подхватили его. Перезапуск оборвёт сеансы всех пользователей — делайте это после предупреждения или вечером.
Как ускорить извлечение текста и индекс на больших объёмах
На базе с 50–100 тысячами вложений «включить и забыть» не работает: первое извлечение может идти сутками, а индекс разрастается до гигабайт.
- ⏱ Разнесите задания по времени. Извлечение текста грузит процессор, обновление индекса — диск. Пусть первое работает ночью, второе — каждые 10–15 минут днём, слияние — раз в сутки.
- ✂️ Исключите лишнее из индекса. Снимите свойство «Полнотекстовый поиск» с реквизитов, по которым никто не ищет: технических строк, GUID, сумм. Это уменьшит индекс и ускорит обновление.
- 🧩 Обновляйте порциями. Второй параметр
ОбновитьИндекс(Истина) обрабатывает данные частями и не держит задание часами. - 🔗 Не забывайте про слияние. Новые данные копятся во вспомогательном индексе; слияние переносит их в основной. Без слияния поиск постепенно замедляется.
- 💽 Держите индекс на быстром диске. Для серверной базы это диск с рабочим каталогом кластера, для файловой — диск с каталогом базы. SSD заметно сокращает время слияния.
- 🗂 Разгрузите первое извлечение. Если файлов много, сначала дайте заданию отработать по свежим вложениям, а архив прошлых лет оставьте на выходные.
| Действие | Когда нужно | Чем рискуете |
|---|---|---|
| Обновление индекса | постоянно, по расписанию | ничем |
| Слияние индекса | раз в сутки или при замедлении поиска | короткая нагрузка на диск |
| Очистка и перестройка | после сбоя, при ошибках поиска | поиск неполный до конца построения |
| Повторное извлечение текстов | после установки нового фильтра | нагрузка на сервер на часы |