При работе в режиме пользовательского интерфейса 1С:Предприятие 8 часто возникает вопрос: почему спецсимволы и операторы полнотекстового поиска (такие как !, *, #, "") не срабатывают при вводе в стандартную строку поиска над списком справочника или документа?
Рассмотрим типичную ситуацию. В свойствах справочника (например, СправочникСсылка.Номенклатура) включена опция «Полнотекстовый поиск при вводе по строке». Однако при попытке найти элементы с использованием спецсимвола синонимов !красный или маски доку* в поисковой строке динамического списка, программа возвращает пустой результат или воспринимает введенный спецсимвол как буквальный символ поиска.
Проанализируем архитектуру поиска в платформе 1С:Предприятие 8. В платформе разделены два абсолютно разных механизма поиска:
ПОДОБНО '%текст%' или по началу строки. Он работает с таблицами базы данных напрямую, не обращаясь к полнотекстовому индексу. При вводе операторов вроде ! или * в эту строку система пытается найти совпадение буквально с этими символами в наименовании или коде.!, групповые символы *, неточные совпадения # и фразовый поиск в кавычках).Разберем, за что отвечает свойство метаданных «Полнотекстовый поиск при вводе по строке» в свойствах справочников и документов. Это свойство управляет исключительно автоподбором и выпадающим списком при наборе текста в поле ввода объекта (например, когда пользователь в документе выбирает номенклатуру в реквизите ссылочного типа).
При включении данного свойства платформа задействует полнотекстовый индекс для построения выпадающего списка подбора. Это позволяет быстро находить элементы при наборе слов в произвольном порядке, а также с учетом словоформ. Данное свойство не включает полнотекстовый поиск внутри табличных частей и динамических списков форм.
Выясним, где именно в 1С можно интерактивно использовать полнотекстовый поиск с операторами:
Рассмотрим примеры использования поисковых операторов в глобальном поиске:
! (поиск синонимов): синтаксис !красный. Ищет слова, являющиеся синонимами с точки зрения платформенного словаря (например, найдет алый, коралловый). Пробел между восклицательным знаком и словом ставить нельзя.* (маска/замена окончания): синтаксис доку*. Находит объекты, содержащие слова документ, документировать, документальный. Должно быть введено более одного значащего символа.Если требуется реализовать полнотекстовый поиск прямо на форме с выводом результатов в динамический список или таблицу, необходимо применить объект ПолнотекстовыйПоиск из встроенного языка 1С.
Разберем по шагам пример программного вызова полнотекстового поиска:
// Формируем поиск по введенной пользователем строке
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска);
СписокПоиска.ПерваяЧасть();
// Проверяем наличие результатов
Если СписокПоиска.ПолноеКоличество() > 0 Тогда
МассивНайденныхСсылок = Новый Массив;
Для Каждого ЭлементРезультата Из СписокПоиска Цикл
МассивНайденныхСсылок.Добавить(ЭлементРезультата.Значение);
КонецЦикла;
// Применяем отбор к динамическому списку формы
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = МассивНайденныхСсылок;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
Для корректной работы полнотекстового поиска необходимо следить за состоянием индекса. Если в метаданных справочника или его реквизитов свойство «Полнотекстовый поиск» установлено в значение Не использовать, данные объекты не будут индексироваться.
Обновление индекса выполняется в интерактивном режиме через меню «Все функции» (или «Функции для специалиста») — Управление полнотекстовым поиском, либо автоматически с помощью регламентных заданий Обновление индекса ППД и Слияние индексов ППД.