Многие технические специалисты и пользователи сталкиваются с парадоксальной ситуацией: в конфигурациях на базе платформы 1С:Предприятие 8.3 (например, в «Бухгалтерии предприятия 3.0» или «ERP») полнотекстовый поиск (ППС) начинает выдавать результаты только тогда, когда запущена процедура обновления индекса. Как только регламентное задание завершается и система сообщает, что индекс актуален, поиск перестает находить данные. Разберем детально механизмы работы этого инструмента, выясним истинные причины такого поведения и рассмотрим способы окончательного решения проблемы.
Для начала проанализируем, как именно платформа 1С обрабатывает поисковые запросы. Когда пользователь вводит текст в строку глобального поиска, система может использовать один из двух алгоритмов:
Рассмотрим ситуацию, описанную в теме: пользователь очистил индекс и запустил обновление. В этот момент поисковый движок понимает, что актуального индекса нет. Чтобы не оставлять пользователя без результатов, платформа «фолбэчится» (откатывается) к стандартному поиску по полям SQL. Поскольку этот метод не зависит от файлов индекса, он выдает результаты. Как только обновление индекса завершается, система считает его «готовым» и переключает поиск на движок ППС. Если файлы индекса при этом созданы некорректно или повреждены, поиск перестает возвращать данные. Таким образом, мы имеем дело не с «рабочим поиском во время обновления», а с работоспособным стандартным механизмом и сломанным полнотекстовым индексом.
Выясним причины, по которым штатный механизм ППС (версии 1.0) может выходить из строя. В версиях платформы 8.3.23 и выше участились случаи деградации этого механизма. Рассмотрим основные факторы:
Повреждение кэша и файлов данных. Обычная кнопка «Очистить индекс» в пользовательском интерфейсе не всегда физически удаляет проблемные файлы на диске. Часто в каталоге базы данных (для файловых баз) или в каталоге сервера 1С (для клиент-серверных) остаются поврежденные фрагменты индекса, которые блокируют корректную работу.
Проблемы с фоновыми заданиями. Полнотекстовый поиск опирается на два ключевых регламентных задания: ОбновлениеИндексаПолнотекстовогоПоиска и СлияниеИндексаПолнотекстовогоПоиска. Зачастую обновление проходит успешно, но слияние (процесс объединения порций новых данных с основным массивом) зависает или завершается с ошибкой. В итоге система рапортует об успехе, но индекс остается «разреженным» и не выдает данные.
Блокировки антивирусом. На серверных операционных системах антивирусное ПО может блокировать доступ службы ragent к временным файлам индекса в момент их интенсивной перезаписи, что приводит к нарушению логической целостности данных ППС.
Если стандартная процедура обновления через «Администрирование — Обслуживание — Управление полнотекстовым поиском» не помогает, выполним глубокую очистку. Проанализируем шаги для клиент-серверного варианта:
srvinfo (обычно это C:\Program Files\1cv8\srvinfo).index.index.Для файловых баз достаточно удалить папку Index внутри каталога, где лежит файл 1Cv8.1CD.
Наиболее современным и рекомендуемым решением является переход на механизм FTS 2.0. Начиная с платформы 8.3.23, 1С внедрила обновленный движок, который стабильнее работает с морфологией и большими объемами данных. Разберем, как его включить.
В большинстве современных конфигураций (БП 3.0, ERP 2.5, ЗУП 3.1) настройка доступна в разделе Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском. Там может присутствовать флаг или кнопка «Использовать новую версию полнотекстового поиска». Если же в интерфейсе такой настройки нет, ее можно включить программно.
Посмотрим на пример кода, который позволяет переключить версию поиска через консоль кода или внешнюю обработку:
// Переключение на полнотекстовый поиск версии 2.0
ПараметрыППС = ПолнотекстовыйПоиск.ПолучитьПараметры();
ПараметрыППС.Версия = ВерсияПолнотекстовогоПоиска.Версия2;
ПолнотекстовыйПоиск.УстановитьПараметры(ПараметрыППС);
После выполнения этого кода необходимо обязательно запустить полную переиндексацию. Новый механизм использует иную структуру хранения данных на диске, поэтому старые индексы будут проигнорированы.
Чтобы окончательно убедиться, что проблема решена, проанализируем ситуацию с помощью программного вызова поиска. Мы можем написать небольшой фрагмент кода в консоли запросов или обработке, чтобы проверить, возвращает ли движок хоть что-то, минуя интерфейсные ограничения:
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("Аванс", 10);
СписокПоиска.ПерваяЧасть();
Если СписокПоиска.Количество() > 0 Тогда
Сообщить("Поиск работает! Найдено объектов: " + СписокПоиска.ПолноеКоличество());
Иначе
Сообщить("Индекс по-прежнему пуст или не работает.");
КонецЕсли;
Использование метода ПолнотекстовыйПоиск.СоздатьСписок позволяет нам понять, выдает ли результат сам движок платформы. Если этот код возвращает результаты, а глобальный поиск в интерфейсе — нет, значит, проблема в настройках самой конфигурации или кэше пользователя.
Если поиск настроен и работает, важно обеспечить его актуальность. Проанализируем настройки регламентных заданий. Рекомендуется установить следующий график:
Если вы заметили, что поиск снова начал работать «из рук вон плохо», первым делом проверьте состояние задания СлияниеИндексаПолнотекстовогоПоиска в консоли регламентных заданий. Если оно завершается с ошибкой «Недостаточно памяти» или «Ошибка файловой операции», это верный признак того, что пора переходить на версию 2.0, которая гораздо менее требовательна к непрерывному объему оперативной памяти при слиянии.
Рассмотренные нами методы позволяют не только восстановить работоспособность поиска, но и повысить общую стабильность системы за счет перехода на современные алгоритмы индексации данных.