Современные конфигурации 1С предлагают пользователям мощные инструменты поиска, которые позволяют находить данные даже при наличии ошибок в запросе или частичном совпадении слов. В отличие от стандартных отборов в списках, работающих по принципу прямого сравнения, полнотекстовый поиск (ПП) использует предварительно подготовленные индексы. В этой статье мы подробно разберем, как программно задействовать эти механизмы в своих разработках, проанализируем синтаксис запросов и выясним, как избежать типичных проблем с актуальностью данных.
Для реализации поиска в коде используется глобальный менеджер ПолнотекстовыйПоиск. Основным инструментом взаимодействия является объект СписокПоискаПолнотекстовогоПоиска. Рассмотрим пример реализации поиска, который позволяет получить результаты с учетом нечеткости (ошибок в написании).
Разберем по шагам типовой алгоритм:
// 1. Создаем список поиска. Параметры: строка поиска и количество результатов на порцию
ТекстПоиска = "нужный артикул";
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(ТекстПоиска, 10);
// 2. Настраиваем параметры вывода
СписокПоиска.ПолучатьОписание = Истина; // Позволяет получить фрагмент текста с выделенным совпадением
// 3. Устанавливаем порог нечеткости
// Значение от 0 до 100 определяет процент допустимых различий.
// Например, 25 позволяет допустить одну ошибку в слове из 4 букв.
СписокПоиска.ПорогНечеткости = 25;
// 4. Выполняем поиск
СписокПоиска.ПерваяЧасть();
// 5. Проверяем результаты
Если СписокПоиска.ПолноеКоличество() = 0 Тогда
Сообщить("Ничего не найдено!");
Иначе
Для Каждого Результат Из СписокПоиска Цикл
// Обработка найденного объекта
Сообщить("Найдено в: " + Строка(Результат.Значение));
// Результат.Описание содержит фрагмент текста с подсветкой
КонецЦикла;
КонецЕсли;
Проанализируем ситуацию: использование метода ПерваяЧасть() инициирует обращение к индексу. Если данных слишком много, система может вернуть флаг СлишкомМногоРезультатов(), что следует учитывать при проектировании интерфейса, чтобы не перегружать пользователя лишней информацией.
Одной из самых прекрасных особенностей полнотекстового поиска является поддержка специальных операторов прямо в строке запроса. Мы можем предоставить пользователю возможность использовать следующие конструкции:
|. Запрос "монитор | клавиатура" найдет документы, содержащие хотя бы одно из этих слов.!. Запрос "процессор !intel" выведет все процессоры, кроме тех, где встречается упоминание Intel.*. Если мы введем "арт*", система найдет и «артикул», и «артист», и «артель».~. Прямо в строке можно указать "молоко~1", что будет означать поиск слова «молоко» с одной возможной опечаткой.Важно помнить, что поиск работает не «магически» по всей базе. Чтобы программный код выдавал результаты, необходимо убедиться, что соответствующие объекты включены в индекс. Проверим следующие настройки в конфигураторе:
Использовать.Не использовать, данные по нему не попадут в поисковую выдачу.Как отмечают опытные разработчики, полнотекстовый поиск может быть «капризным». Основная причина недовольства пользователей («вчера находило, сегодня — нет») кроется в неактуальности индекса. Рассмотрим разницу между двумя ключевыми операциями:
Обновление индекса: это быстрая операция добавления данных о последних изменениях. Рекомендуется выполнять ее часто (раз в несколько минут) с помощью регламентного задания.
Слияние индекса: процесс оптимизации, при котором множество мелких файлов индекса объединяются в один большой. Без слияния поиск начинает существенно тормозить. Эту операцию лучше проводить в часы минимальной нагрузки на сервер (ночью).
Для программной проверки состояния индекса используем метод ПолнотекстовыйПоиск.ПолучитьСостояние(). Если индекс в состоянии ТребуетсяОбновление, результаты поиска могут быть неполными.
При использовании ПолнотекстовыйПоиск.СоздатьСписок() система автоматически применяет механизмы RLS (Restriction Level Security). Это означает, что если пользователю запрещен доступ к определенной организации или складу, объекты по этой организации никогда не появятся в его результатах поиска. Это избавляет разработчика от необходимости вручную фильтровать результаты на предмет прав доступа.
Иногда после аварийного завершения работы сервера 1С данные в SQL-базе и файлы индекса (находящиеся в папке FTxt) рассинхронизируются. В этом случае поиск может выдавать пустые результаты или ошибки. Выясним причину и исправим ситуацию: единственным надежным способом является полная очистка и перестроение индекса.
// Программная очистка индекса (внимание: на больших базах выполнение займет долгое время)
ПолнотекстовыйПоиск.Очистить();
ПолнотекстовыйПоиск.Обновить(Истина); // Истина означает полное перестроение
Подводя итог, можно сказать, что программное использование полнотекстового поиска значительно повышает удобство работы пользователя, особенно при поиске по «кривым» артикулам или длинным наименованиям. Однако этот инструмент требует грамотной настройки регламентных заданий по обновлению и слиянию индекса для обеспечения стабильной и быстрой работы.