Полнотекстовый поиск
Полнотекстовый поиск данных — это инструмент «1С:Шины», позволяющий выполнять поиск записей в базе данных по их текстовым представлениям.
Механизм полнотекстового поиска включает:
- программные средства для формирования полнотекстового индекса и его периодического обновления;
- программные средства для поиска по полнотекстовому индексу и оформления результатов поиска;
- полнотекстовый индекс, содержащий текстовые представления всех записей базы данных.
Для полноценной работы полнотекстового поиска в приложении необходимо включить настройку Автозапуск запланированных заданий:

По умолчанию «1С:Шина» индексирует следующие объекты:
- планы обмена,
- регистры сведений,
- хранимые структуры,
- файлы хранилища двоичных данных:
- офисные документы (doc, docx, pdf, odt, rtf, ...),
- простой текст (txt, md, csv, ...),
- электронные таблицы (xls, xlsx, ods, ...),
- презентации (ppt, pptx, odp, ...),
- архивы (zip, rar, 7z, ...).
 
Для каждого объекта вы можете указать, нужно ли учитывать его данные при индексировании. Для этого ис пользуйте следующие свойства:
- для реквизитов сущностей — ИспользоватьВПолнотекстовомПоиске,
- для файлов двоичного хранилища — ДвоичныйОбъект.Свойства.ИспользованиеПолнотекстовогоПоиска.
Выполнение полнотекстового поиска
Для работы с функциями полнотекстового поиска во встроенном языке используется тип-одиночка ПолнотекстовыйПоиск. Методы данного типа позволяют выполнить все необходимые операции по управлению и использованию полнотекстового поиска: проверить актуальность поискового индекса, получить количество непроиндексированных изменений, перестроить индекс и вызвать функцию поиска.
Для выполнения полнотекстов ого поиска вызовите метод Искать() и укажите поисковое выражение в виде строки или экземпляра структуры ЗапросПолнотекстовогоПоиска. Вы также можете настроить результаты поиска и задать область поиска.
Пример поиска по справочнику Сотрудники:
@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(СтрокаПоиска: Строка): ЧитаемыйМассив<Сущность.К люч>
    возврат ПолнотекстовыйПоиск.Искать(ПоисковыйЗапрос = СтрокаПоиска, ИндексСтраницы = 0, 
                                       РазмерСтраницы= 50, ОбластьПоиска = [Тип<Сотрудники.Ссылка>])
;
Настройки результатов полнотекстового поиска
Чтобы настроить результаты поиска, используйте свойства типа НастройкиРезультатаПолнотекстовогоПоиска:
- ПолучатьЗаголовки— указывает, нужно ли возвращать заголовки (краткое представление) по каждой найденной записи.
- ПолучатьФрагменты— указывает, нужно ли возвращать фрагменты текста с подсветкой найденных вхождений. Для получения оформленного набора фрагментов используйте метод- ЭлементРезультатаПолнотекстовогоПоиска.Представление().
- ПолучатьФрагментыПоСвойствам— указывает, нужно ли заполнять массив- ЭлементРезультатаПолнотекстовогоПоиска.ФрагментыПоСвойствам, в котором фрагменты текста разделены по свойствам. Используйте данный режим, если вам требуется получить метаданные по свойствам и информацию по каждому фрагменту в контексте свойства.
- НастройкиФрагментов— позволяет настроить представление найденных фрагментов текста.
@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
    // Настройка результатов полнотекстового поиска
    знч НастройкиРезультата = новый НастройкиРезультатаПолнотекстовогоПоиска(
                    ПолучатьЗаголовки = Истина,
                    ПолучатьФрагменты = Истина,
                    НастройкиФрагментов = новый НастройкиФрагментовПолнотекстовогоПоиска(
                        ВидФрагмента = ВидФрагментаПолнотекстовогоПоиска.Html,
                        МаксимальноеКоличествоФрагментов = 10,
                        РазмерФрагмента = 150,
                        ОткрывающийТег = "<strong>",
                        ЗакрывающийТег = "</strong>"))
    знч МассивФрагментовТекста = <Строка>[]
    
    // Выполнение поиска с заданными настройками
    знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
                новый ЗапросПолнотекстовогоПоиска(
                    Запрос = Запрос,
                    ИндексСтраницы = 0,
                    РазмерСтраницы = 50),
                НастройкиРезультата)
    
    // Заполнение массива найденных фрагментов текста
    для Элемент из РезультатПоиска.Порция
        МассивФрагментовТекста.Добавить(Элемент.Представление())
    ;
    
    возврат МассивФрагментовТекста
;
Представление результатов полнотекстов ого поиска
Найденные в результате поиска фрагменты текста могут быть представлены следующими способами:
- 
Собраны в стандартное представление с помощью метода Представление()типаЭлементРезультатаПолнотекстовогоПоиска. По умолчанию составной фрагмент оформляется так:- Все разрывы фрагментов обозначаются троеточием ....
- Табличные части выводятся в сокращенном виде: Представление: ...Вхождение1... ...Вхождение2....
- Если запись найдена по основному тексту, среди фрагментов будут свойства с выделенными (подсвеченными) вхождениями.
- Если запись найдена не по основному тексту, тогда выводятся несколько первых наиболее приоритетных свойств без выделения вхождений.
 
- Все разрывы фрагментов обозначаются троеточием 
- 
Разделены по свойств ам: будет заполнен массив ЭлементРезультатаПолнотекстовогоПоиска.ФрагментыПоСвойствам. В одном свойстве может быть более одного текстового фрагмента. Фрагмент может быть полным значением свойства. Вместе с фрагментом также предоставляется список вхождений.
- 
Собраны в одно представление с помощью метода ПостроитьПредставление()типаРезультатПолнотекстовогоПоиска. Используйте данный метод, если вам требуется настроить вывод результатов поиска. Вы можете указать разделитель свойств и символы для разрыва текста слева, справа и в середине; включить в представление дополнительные свойства; вывести фрагменты по табличным частям в упрощенном виде. Пример:@НаСервере @ДоступноСКлиента
 статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
 знч МассивФрагментовТекста = <Строка>[]
 
 // Выполнение поиска
 знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
 новый ЗапросПолнотекстовогоПоиска(
 Запрос = Запрос,
 ИндексСтраницы = 0,
 РазмерСтраницы = 50)
 )
 
 // Заполнение массива найденных фрагментов текста
 // c настройкой их представления
 для Элемент из РезультатПоиска.Порция
 знч Представление = РезультатПолнотекстовогоПоиска.ПостроитьПредставление(
 ИсточникФрагментов = Элемент,
 РазрывТекстаВСередине = "...",
 РазделительСвойств = "<br/>")
 МассивФрагментовТекста.Добавить(Представление)
 ;
 
 возврат МассивФрагментовТекста
 ;
Поддержка актуальности индекса полнотекстового поиска
Чтобы поиск работал корректно, необходимо поддерживать индекс полнотекстового поиска в актуальном состоянии. Для этого необходимо добавлять в индекс новую информацию (новые объекты информационной базы), удалять устаревшие данные (которые располагались в удаленных объектах) и обновлять сведения об измененных объектах информационной базы.
Для работы с полнотекстовым индексом в «1С:Шине» предусмотрены следующие методы типа ПолнотекстовыйПоиск:
- ИндексАктуален()— возвращает- Истина, если поисковый индекс актуален, то есть он существует, полностью построен и соответствует текущему состоянию данных приложения.
- ИндексБылАктуален()— возвращает- Истина, если были проиндексированы данные хотя бы по одному событию, которое появилось в логе изменений за последний период. Данный метод рекомендуется использовать, если поисковый индекс меняется слишком часто.
- КоличествоИзменений()— возвращает количество непроиндексированных изменений на текущий момент времени.
- ПерестроитьИндекс()— запускает фоновое задание для полного перестроения поискового индекса.
- ПолучитьТекущуюТочкуИзменений()— возвращает точку в логе изменений полнотекстового поиска на текущий момент времени.
- ЖдатьЗавершенияОбновленияИндекса()— ожидает обновления индексной базы до момента, обозначенного параметром- ТочкаИзменений.
Пример 1. Перестроение индекса полнотекстового поиска:
@НаСервере @ДоступноСКлиента
статический метод ПерестроитьПолнотекстовыйИндекс()
    ПолнотекстовыйПоиск.ПерестроитьИндекс()
;
Пример 2. Полное обновление индекса полнотекстового поиска:
@НаСервере @ДоступноСКлиента
статический метод ОбновитьПолнотекстовыйИндекс()
    знч Точка = ПолнотекстовыйПоиск.ПолучитьТекущуюТочкуИзменений()
    пока не ПолнотекстовыйПоиск.ЖдатьЗавершенияОбновленияИндекса(Точка, 5с)
    ;
;
По умолчанию обновление полнотекстового индекса происходит автоматически при внесении изменений в приложение. Ручное обновление индекса может потребоваться, если, например, в кластере серверов запрещен автозапуск фоновых заданий.