Почему не работают операторы полнотекстового поиска в списке справочника 1С и как правильно использовать данный механизм?

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

Введение и суть проблемы

При работе в режиме пользовательского интерфейса 1С:Предприятие 8 часто возникает вопрос: почему спецсимволы и операторы полнотекстового поиска (такие как !, *, #, "") не срабатывают при вводе в стандартную строку поиска над списком справочника или документа?

Рассмотрим типичную ситуацию. В свойствах справочника (например, СправочникСсылка.Номенклатура) включена опция «Полнотекстовый поиск при вводе по строке». Однако при попытке найти элементы с использованием спецсимвола синонимов !красный или маски доку* в поисковой строке динамического списка, программа возвращает пустой результат или воспринимает введенный спецсимвол как буквальный символ поиска.

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

Проанализируем архитектуру поиска в платформе 1С:Предприятие 8. В платформе разделены два абсолютно разных механизма поиска:

  1. Поиск в списке формы (динамический список / строка поиска списка): данный поиск выполняет прямые запросы к СУБД с использованием оператора SQL ПОДОБНО '%текст%' или по началу строки. Он работает с таблицами базы данных напрямую, не обращаясь к полнотекстовому индексу. При вводе операторов вроде ! или * в эту строку система пытается найти совпадение буквально с этими символами в наименовании или коде.
  2. Полнотекстовый поиск (ППД): специализированный платформенный механизм, поиск в котором выполняется по собственному полнотекстовому индексу. Именно этот механизм поддерживает операторы языка поисковых запросов (синонимы !, групповые символы *, неточные совпадения # и фразовый поиск в кавычках).

Назначение свойства «Полнотекстовый поиск при вводе по строке»

Разберем, за что отвечает свойство метаданных «Полнотекстовый поиск при вводе по строке» в свойствах справочников и документов. Это свойство управляет исключительно автоподбором и выпадающим списком при наборе текста в поле ввода объекта (например, когда пользователь в документе выбирает номенклатуру в реквизите ссылочного типа).

При включении данного свойства платформа задействует полнотекстовый индекс для построения выпадающего списка подбора. Это позволяет быстро находить элементы при наборе слов в произвольном порядке, а также с учетом словоформ. Данное свойство не включает полнотекстовый поиск внутри табличных частей и динамических списков форм.

Где и как работают операторы полнотекстового поиска в пользовательском режиме

Выясним, где именно в 1С можно интерактивно использовать полнотекстовый поиск с операторами:

  1. Глобальная строка «Поиск по данным»: расположена в заголовке программы или вызывается через главное меню. В этой строке можно использовать все операторы языка поисковых запросов.
  2. Поле ввода ссылочного типа: при заполнении реквизита прямо в документе или другом объекте при включенном свойстве полнотекстового поиска при вводе по строке.

Рассмотрим примеры использования поисковых операторов в глобальном поиске:

  1. Оператор ! (поиск синонимов): синтаксис !красный. Ищет слова, являющиеся синонимами с точки зрения платформенного словаря (например, найдет алый, коралловый). Пробел между восклицательным знаком и словом ставить нельзя.
  2. Оператор * (маска/замена окончания): синтаксис доку*. Находит объекты, содержащие слова документ, документировать, документальный. Должно быть введено более одного значащего символа.

Программный поиск с использованием средств встроенного языка

Если требуется реализовать полнотекстовый поиск прямо на форме с выводом результатов в динамический список или таблицу, необходимо применить объект ПолнотекстовыйПоиск из встроенного языка 1С.

Разберем по шагам пример программного вызова полнотекстового поиска:


// Формируем поиск по введенной пользователем строке
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска);
СписокПоиска.ПерваяЧасть();

// Проверяем наличие результатов
Если СписокПоиска.ПолноеКоличество() > 0 Тогда
    МассивНайденныхСсылок = Новый Массив;
    Для Каждого ЭлементРезультата Из СписокПоиска Цикл
        МассивНайденныхСсылок.Добавить(ЭлементРезультата.Значение);
    КонецЦикла;
    
    // Применяем отбор к динамическому списку формы
    ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбора.ПравоеЗначение = МассивНайденныхСсылок;
    ЭлементОтбора.Использование = Истина;
КонецЕсли;

Администрирование и актуализация полнотекстового индекса

Для корректной работы полнотекстового поиска необходимо следить за состоянием индекса. Если в метаданных справочника или его реквизитов свойство «Полнотекстовый поиск» установлено в значение Не использовать, данные объекты не будут индексироваться.

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

← На главную