Возможность быстро находить нужные документы по их внутреннему содержимому — одна из самых востребованных функций в современных учетных системах. Пользователи часто загружают в базу данных договоры, соглашения, акты и накладные в формате PDF. Однако стандартный полнотекстовый поиск (ППД) в «1С:Бухгалтерая» или других конфигурациях на базе БСП (Библиотеки стандартных подсистем) часто отказывается искать информацию внутри таких файлов, даже если регламентные задания по индексации работают без ошибок.
В этой статье мы подробно разберем, как устроен механизм поиска по файлам в 1С, выясним основные технические причины, по которым система «не видит» текст внутри PDF, и пошагово настроим серверную инфраструктуру для решения этой проблемы.
Прежде всего, давайте развеем популярное заблуждение о том, что поиск по содержимому PDF работает исключительно в «1С:Документообороте». Это не так. Любая типовая конфигурация (включая «1С:Бухгалтерию», «1С:ERP», «1С:Комплексную автоматизацию» и др.) использует стандартную подсистему БСП «Работа с файлами».
Процесс индексации файлов в 1С выглядит следующим образом:
ИзвлечениеТекстаФайловДляПоиска обращается к платформенному объекту ИзвлечениеТекста..txt, .html) платформа делает это собственными силами. Для сложных форматов (таких как .pdf, .docx, .xlsx) 1С обращается к операционной системе Windows через стандартный программный интерфейс IFilter.ОбновлениеИндексаППД и СлияниеИндексаППД обрабатывают этот текст и добавляют его в общий индекс полнотекстового поиска.Если на третьем шаге операционная система не смогла предоставить 1С нужный IFilter-плагин, то текст из файла просто не будет извлечен. В поисковый индекс попадет только имя файла и его реквизиты, а поиск по внутреннему содержимому работать не будет.
Для правильной настройки системы нам крайне важно различать два типа PDF-документов:
В рамках данной статьи мы сосредоточимся на наиболее частой задаче: настройке поиска в PDF-документах, содержащих текстовый слой.
Рассмотрим основные причины, по которым установленный в системе фильтр не выполняет свою задачу, и разберем пути их устранения.
Это самая распространенная ошибка администраторов. Платформа «1С:Предприятие» обращается к интерфейсу IFilter из того процесса, в котором выполняется код извлечения текста. Если у вас используется 64-битный сервер 1С, то процесс rphost является 64-разрядным. Следовательно, ему требуется строго 64-битный плагин PDF iFilter.
Если на сервере установлен обычный пользовательский Adobe Acrobat Reader, то по умолчанию с ним устанавливается 32-битная версия iFilter. 64-битный процесс сервера 1С просто не сможет загрузить эту 32-битную DLL-библиотеку из реестра Windows.
Решение: Скачайте с официального сайта Adobe и установите специализированный пакет Adobe PDF iFilter v9 for 64-bit platforms (или более новую версию соответствующей разрядности).
В настройках подсистемы работы с файлами в 1С есть важный параметр: «Извлекать тексты только на сервере».
USR1CV8), должны быть полные права на чтение каталога с установленным фильтром и запуск его библиотек.Решение: Рекомендуется включить настройку «Извлекать тексты только на сервере» и производить все манипуляции по установке ПО только на сервере 1С.
Технология IFilter является проприетарной разработкой компании Microsoft и поддерживается только в операционных системах семейства Windows. Если ваш сервер «1С:Предприятия» работает под управлением Linux, стандартный вызов объекта ИзвлечениеТекста для файлов PDF работать не будет.
Решение для Linux: Потребуется кастомизация конфигурации через расширение. Необходимо перехватить процедуру извлечения текста и перенаправить ее на консольную утилиту pdftotext (входит в состав пакета poppler-utils для Linux). Утилита вызывается через встроенный язык 1С и возвращает извлеченный текст обратно в платформу.
Выполним последовательно шаги для настройки корректной работы поиска на сервере Windows.
Удалите старые версии Adobe Reader, если они были установлены некорректно. Скачайте дистрибутив Adobe PDF IFilter 64-bit и установите его на сервере приложений 1С. В качестве альтернативы (если официальный плагин от Adobe работает нестабильно в вашей серверной ОС) можно использовать стабильный коммерческий аналог — PDFlib TET PDF IFilter.
Для того чтобы убедиться, что Windows успешно зарегистрировала установленный фильтр для расширения .pdf, используйте бесплатную утилиту IFilter Explorer. Запустите ее на сервере. В списке зарегистрированных расширений найдите .pdf. Убедитесь, что система указывает на правильную 64-битную библиотеку (например, PDFFilter.dll из каталога Adobe).
Чтобы исключить влияние регламентных заданий и настроек ППД, проверим работу объекта платформы напрямую. Создайте внешнюю обработку и выполните следующий код на сервере (например, передав на вход путь к вашему тестовому PDF-файлу, содержащему текстовый слой):
&НаСервере
Процедура ПроверитьИзвлечениеТекстаНаСервере(ПутьКФайлу)
Попытка
Извлечение = Новый ИзвлечениеТекста(ПутьКФайлу);
ПолученныйТекст = Извлечение.ПолучитьТекст();
Если ПустаяСтрока(ПолученныйТекст) Тогда
Сообщить("Файл обработан, но текст пустой. Возможно, отсутствует текстовый слой.");
Иначе
Сообщить("Успешно извлечено символов: " + СтрДлина(ПолученныйТекст));
Сообщить("Фрагмент текста: " + Лев(ПолученныйТекст, 150));
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при извлечении текста: " + ОписаниеОшибки(), КатегорияСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Если данный код возвращает ошибку или извлекает пустую строку для заведомо текстового PDF-файла, проблема кроется в операционной системе: либо iFilter не зарегистрирован, либо у пользователя службы 1С нет к нему доступа.
Важно понимать: даже если мы идеально настроили IFilter, файлы, которые уже были загружены в базу ранее, автоматически не переиндексируются. Система 1С считает, что попытка извлечения текста для них уже была выполнена (пусть и неудачно), и больше к ним не возвращается.
Чтобы заставить систему заново прочитать старые PDF-файлы, выполним следующие действия:
Файлы (или соответствующем регистре сведений БСП). При перезаписи очистится признак успешного извлечения текста.Если наш сервер работает под управлением ОС Linux, нам потребуется переписать стандартный механизм извлечения. Проанализируем пример кода, который можно поместить в расширение для перехвата функции извлечения текста из PDF-файлов с использованием консольной утилиты pdftotext:
Функция ИзвлечьТекстPDF_Linux(ПутьКФайлуPDF) Экспорт
ИмяВременногоФайлаТекста = ПолучитьИмяВременногоФайла("txt");
// Формируем команду для pdftotext (пакет poppler-utils должен быть установлен в ОС)
// Параметр -layout пытается сохранить исходное форматирование колонок текста
КомандаЗапуска = "pdftotext -layout """ + ПутьКФайлуPDF + """ """ + ИмяВременногоФайлаТекста + """";
// Запускаем приложение на сервере в режиме ожидания завершения
ЗапуститьПриложение(КомандаЗапуска, , Истина);
ФайлРезультата = Новый Файл(ИмяВременногоФайлаТекста);
Если ФайлРезультата.Существует() Тогда
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.Прочитать(ИмяВременногоФайлаТекста, КодировкаТекста.UTF8);
Текст = ТекстовыйДок.ПолучитьТекст();
// Удаляем временный файл после чтения
Попытка
УдалитьФайлы(ИмяВременногоФайлаТекста);
Исключение
// Запись в журнал регистрации при невозможности удаления
КонецПопытки;
Возврат Текст;
КонецЕсли;
Возврат "";
КонецФункции
Используя этот подход, мы полностью избавляемся от привязки к технологиям Windows и обеспечиваем стабильное извлечение данных на любой Linux-системе.
Таким образом, правильная настройка разрядности плагинов, контроль прав учетной записи службы 1С и своевременная переиндексация базы данных гарантируют стабильную работу полнотекстового поиска по содержимому PDF-документов в любой конфигурации на платформе «1С:Предприятие».