Как настроить полнотекстовый поиск по содержимому PDF-файлов в 1С:Бухгалтерии и других конфигурациях?

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

Возможность быстро находить нужные документы по их внутреннему содержимому — одна из самых востребованных функций в современных учетных системах. Пользователи часто загружают в базу данных договоры, соглашения, акты и накладные в формате PDF. Однако стандартный полнотекстовый поиск (ППД) в «1С:Бухгалтерая» или других конфигурациях на базе БСП (Библиотеки стандартных подсистем) часто отказывается искать информацию внутри таких файлов, даже если регламентные задания по индексации работают без ошибок.

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

Теория: Как 1С работает с поиском по содержимому файлов

Прежде всего, давайте развеем популярное заблуждение о том, что поиск по содержимому PDF работает исключительно в «1С:Документообороте». Это не так. Любая типовая конфигурация (включая «1С:Бухгалтерию», «1С:ERP», «1С:Комплексную автоматизацию» и др.) использует стандартную подсистему БСП «Работа с файлами».

Процесс индексации файлов в 1С выглядит следующим образом:

  1. Пользователь загружает файл в систему.
  2. Специальное регламентное задание ИзвлечениеТекстаФайловДляПоиска обращается к платформенному объекту ИзвлечениеТекста.
  3. Платформа 1С пытается извлечь «сырой» текст из файла. Для простых форматов (например, .txt, .html) платформа делает это собственными силами. Для сложных форматов (таких как .pdf, .docx, .xlsx) 1С обращается к операционной системе Windows через стандартный программный интерфейс IFilter.
  4. Извлеченный текст записывается в специальное служебное поле базы данных.
  5. Регламентные задания ОбновлениеИндексаППД и СлияниеИндексаППД обрабатывают этот текст и добавляют его в общий индекс полнотекстового поиска.

Если на третьем шаге операционная система не смогла предоставить 1С нужный IFilter-плагин, то текст из файла просто не будет извлечен. В поисковый индекс попадет только имя файла и его реквизиты, а поиск по внутреннему содержимому работать не будет.

Различие между PDF с текстовым слоем и сканированным PDF

Для правильной настройки системы нам крайне важно различать два типа PDF-документов:

  1. PDF с текстовым слоем (векторный). Такие файлы создаются при сохранении документов напрямую из текстовых редакторов (Word, Excel) или при печати на виртуальном PDF-принтере. Текст в них можно выделить мышкой и скопировать. Для индексации таких файлов достаточно настроить системный плагин Adobe iFilter.
  2. Сканированный PDF (растровый). Такие файлы представляют собой просто набор картинок (сканы с МФУ). Выделить текст в них стандартными средствами невозможно. Чтобы искать по таким файлам, систему необходимо интегрировать со сторонними программами оптического распознавания символов (OCR), такими как Tesseract, Cuneiform или Abbyy FineReader. Такая интеграция «из коробки» реализована в «1С:Документообороте» (требует установки утилит Ghostscript, ImageMagick и Cuneiform/Tesseract на сервер), но отсутствует в стандартной «1С:Бухгалтерии» без доработки кода.

В рамках данной статьи мы сосредоточимся на наиболее частой задаче: настройке поиска в PDF-документах, содержащих текстовый слой.

Почему поиск не работает, даже если установлен Adobe iFilter?

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

А. Конфликт разрядности (Bitness)

Это самая распространенная ошибка администраторов. Платформа «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С есть важный параметр: «Извлекать тексты только на сервере».

Решение: Рекомендуется включить настройку «Извлекать тексты только на сервере» и производить все манипуляции по установке ПО только на сервере 1С.

В. Ограничения операционной системы Linux

Технология IFilter является проприетарной разработкой компании Microsoft и поддерживается только в операционных системах семейства Windows. Если ваш сервер «1С:Предприятия» работает под управлением Linux, стандартный вызов объекта ИзвлечениеТекста для файлов PDF работать не будет.

Решение для Linux: Потребуется кастомизация конфигурации через расширение. Необходимо перехватить процедуру извлечения текста и перенаправить ее на консольную утилиту pdftotext (входит в состав пакета poppler-utils для Linux). Утилита вызывается через встроенный язык 1С и возвращает извлеченный текст обратно в платформу.

Пошаговый алгоритм настройки и диагностики под Windows

Выполним последовательно шаги для настройки корректной работы поиска на сервере Windows.

Шаг 1. Установка правильного iFilter на сервере

Удалите старые версии Adobe Reader, если они были установлены некорректно. Скачайте дистрибутив Adobe PDF IFilter 64-bit и установите его на сервере приложений 1С. В качестве альтернативы (если официальный плагин от Adobe работает нестабильно в вашей серверной ОС) можно использовать стабильный коммерческий аналог — PDFlib TET PDF IFilter.

Шаг 2. Проверка регистрации фильтра в системе

Для того чтобы убедиться, что Windows успешно зарегистрировала установленный фильтр для расширения .pdf, используйте бесплатную утилиту IFilter Explorer. Запустите ее на сервере. В списке зарегистрированных расширений найдите .pdf. Убедитесь, что система указывает на правильную 64-битную библиотеку (например, PDFFilter.dll из каталога Adobe).

Шаг 3. Программная проверка работоспособности извлечения в 1С

Чтобы исключить влияние регламентных заданий и настроек ППД, проверим работу объекта платформы напрямую. Создайте внешнюю обработку и выполните следующий код на сервере (например, передав на вход путь к вашему тестовому PDF-файлу, содержащему текстовый слой):


&НаСервере
Процедура ПроверитьИзвлечениеТекстаНаСервере(ПутьКФайлу)
    
    Попытка
        Извлечение = Новый ИзвлечениеТекста(ПутьКФайлу);
        ПолученныйТекст = Извлечение.ПолучитьТекст();
        
        Если ПустаяСтрока(ПолученныйТекст) Тогда
            Сообщить("Файл обработан, но текст пустой. Возможно, отсутствует текстовый слой.");
        Иначе
            Сообщить("Успешно извлечено символов: " + СтрДлина(ПолученныйТекст));
            Сообщить("Фрагмент текста: " + Лев(ПолученныйТекст, 150));
        КонецЕсли;
    Исключение
        Сообщить("Произошла ошибка при извлечении текста: " + ОписаниеОшибки(), КатегорияСообщения.Важное);
    КонецПопытки;
    
КонецПроцедуры

Если данный код возвращает ошибку или извлекает пустую строку для заведомо текстового PDF-файла, проблема кроется в операционной системе: либо iFilter не зарегистрирован, либо у пользователя службы 1С нет к нему доступа.

Шаг 4. Решение проблемы со старыми файлами (Переиндексация)

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

Чтобы заставить систему заново прочитать старые PDF-файлы, выполним следующие действия:

  1. Запустите обработку, которая программно перезапишет (обновит версии) существующих файлов в справочнике Файлы (или соответствующем регистре сведений БСП). При перезаписи очистится признак успешного извлечения текста.
  2. Перейдите в раздел Администрирование — Общие настройки — Полнотекстовый поиск.
  3. Нажмите кнопку Очистить индекс.
  4. Дождитесь выполнения регламентных заданий по извлечению текста и обновлению индекса, либо запустите их принудительно.
  5. Нажмите кнопку Обновить индекс.

Пример реализации для Linux-серверов

Если наш сервер работает под управлением ОС Linux, нам потребуется переписать стандартный механизм извлечения. Проанализируем пример кода, который можно поместить в расширение для перехвата функции извлечения текста из PDF-файлов с использованием консольной утилиты pdftotext:


Функция ИзвлечьТекстPDF_Linux(ПутьКФайлуPDF) Экспорт
    
    ИмяВременногоФайлаТекста = ПолучитьИмяВременногоФайла("txt");
    
    // Формируем команду для pdftotext (пакет poppler-utils должен быть установлен в ОС)
    // Параметр -layout пытается сохранить исходное форматирование колонок текста
    КомандаЗапуска = "pdftotext -layout """ + ПутьКФайлуPDF + """ """ + ИмяВременногоФайлаТекста + """";
    
    // Запускаем приложение на сервере в режиме ожидания завершения
    ЗапуститьПриложение(КомандаЗапуска, , Истина);
    
    ФайлРезультата = Новый Файл(ИмяВременногоФайлаТекста);
    Если ФайлРезультата.Существует() Тогда
        ТекстовыйДок = Новый ТекстовыйДокумент;
        ТекстовыйДок.Прочитать(ИмяВременногоФайлаТекста, КодировкаТекста.UTF8);
        Текст = ТекстовыйДок.ПолучитьТекст();
        
        // Удаляем временный файл после чтения
        Попытка
            УдалитьФайлы(ИмяВременногоФайлаТекста);
        Исключение
            // Запись в журнал регистрации при невозможности удаления
        КонецПопытки;
        
        Возврат Текст;
    КонецЕсли;
    
    Возврат "";
КонецФункции

Используя этот подход, мы полностью избавляемся от привязки к технологиям Windows и обеспечиваем стабильное извлечение данных на любой Linux-системе.

Таким образом, правильная настройка разрядности плагинов, контроль прав учетной записи службы 1С и своевременная переиндексация базы данных гарантируют стабильную работу полнотекстового поиска по содержимому PDF-документов в любой конфигурации на платформе «1С:Предприятие».

← На главную