Полнотекстовый поиск в 1С 8.3: механизмы и настройка

· 9 мин

Содержание

Строка глобального поиска в 1С работает поверх полнотекстового индекса: вы вводите слово, платформа ищет его не в самих таблицах базы, а в заранее построенном индексе и возвращает ссылки на документы, справочники и регистры, где это слово встречается. Отсюда два следствия: поиск не находит то, что ещё не попало в индекс, и для реквизитов, не помеченных к индексации, он тоже ничего не покажет.

Чтобы строка поиска искала по всей базе, нужны три вещи: режим полнотекстового поиска включён, нужные объекты и реквизиты помечены в конфигураторе, а индекс регулярно обновляется. Ниже — как каждый из этих механизмов устроен в 1С 8.3 и что настроить, чтобы поиск находил свежие данные быстро.

Как устроен полнотекстовый индекс

Полнотекстовый поиск — отдельная подсистема платформы, а не фильтр по строке. Платформа разбирает текстовые значения реквизитов на слова, приводит их к начальной форме (учитывает морфологию) и складывает в индекс: слово → ссылки на объекты, где оно есть.

Когда пользователь набирает запрос в строке поиска, платформа обращается к индексу, а не перебирает записи. Поэтому поиск по десяткам тысяч документов срабатывает за доли секунды — но только если индекс построен и актуален.

Индекс учитывает словоформы. Запрос договор найдёт «договором», «договоров», «договору» — морфология работает по умолчанию. Это ключевое отличие от обычного отбора списка по подстроке, который ищет точное вхождение символов.

В индекс попадают не все слова подряд. Служебные слова — предлоги, союзы, частицы — и слишком короткие фрагменты платформа пропускает: они встречаются почти везде и для поиска бесполезны. Поэтому запрос из одного короткого служебного слова ничего осмысленного не вернёт — это не сбой, а устройство индекса.

Результаты глобального поиска платформа показывает списком со ссылками, сгруппированными по типам объектов, и подсвечивает найденное слово в контексте. Вы сразу видите, в документе это, справочнике или регистре, и переходите по ссылке в нужный объект.

Глобальный поиск вызывается значком лупы в правой части панели системных команд — рядом с меню функций и именем пользователя. Он ищет сразу по всем разделам программы, в отличие от строки поиска внутри конкретного списка, которая фильтрует только открытый список.

Не путайте два разных механизма:

  • 🔍 Глобальный поиск (значок лупы) — ищет по всей базе через полнотекстовый индекс.
  • 📄 Поиск в списке (поле над таблицей) — отбирает строки открытого списка по вхождению текста, индекс ему не нужен.

Эта статья — про первый, полнотекстовый.

Что попадает в индекс: настройка в конфигураторе

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

У большинства объектов (справочников, документов, регистров) есть свойство Полнотекстовый поиск со значениями Использовать и Не использовать. То же свойство есть у отдельных реквизитов. Если объект помечен Использовать, в индекс попадают его реквизиты, у которых поиск тоже разрешён.

Порядок настройки в конфигураторе:

  1. Откройте дерево конфигурации, найдите нужный объект (например, справочник «Контрагенты»).
  2. В палитре свойств найдите свойство Полнотекстовый поиск и поставьте Использовать.
  3. Раскройте состав реквизитов, у каждого реквизита, который должен искаться, проверьте то же свойство.
  4. Обновите конфигурацию базы данных (F7), чтобы изменения вступили в силу.

В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) состав индексируемых объектов уже настроен разработчиком — для рядовых справочников и документов всё помечено. Менять настройки в конфигураторе нужно, только если вы дорабатываете конфигурацию собственными объектами и хотите, чтобы они тоже искались.

Правка свойств полнотекстового поиска — это изменение конфигурации. Для типового решения оно переведёт конфигурацию в режим с изменениями и усложнит обновление. Для своих объектов используйте расширение конфигурации, а не правку типовой.

После того как объекты помечены, индекс нужно построить — одна отметка в конфигураторе поиск ещё не включает.

Включение режима и обновление индекса

Второй механизм — режим полнотекстового поиска и обновление индекса. Режим можно включать и выключать на лету, в пользовательском режиме, без конфигуратора.

В типовых решениях на БСП управление вынесено в раздел Администрирование → Обслуживание (название группы настроек может отличаться по релизу — ищите пункт со словами «полнотекстовый поиск» или «поиск данных»). Там режим включают, видят, актуален ли индекс, и запускают обновление вручную.

Через встроенный язык режим задаётся так:

// Включить полнотекстовый поиск
УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить);

// Обновить индекс (в основном потоке, не прерывать при ошибке)
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь);

// Проверить, актуален ли индекс
Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
    ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь);
КонецЕсли;

Индекс обновляется порциями: платформа добирает в него данные, изменившиеся с прошлого обновления, а не строит его заново. Поэтому первое построение на большой базе идёт долго, а последующие обновления — быстро.

За регулярное обновление отвечает регламентное задание (в типовых оно называется примерно «Обновление индекса полнотекстового поиска »). Оно запускается по расписанию и держит индекс свежим без ручного вмешательства. Проверить и настроить расписание можно в разделе администрирования, в списке регламентных и фоновых заданий.

Первый параметр метода ОбновитьИндекс управляет тем, как идёт обновление. Значение Ложь запускает обновление отдельным потоком, не блокируя текущий сеанс; Истина — в основном потоке, с ожиданием завершения. В регламентном задании типовой конфигурации всё это уже настроено, и вручную вызывать метод из консоли обычно не нужно — достаточно проверить, что задание включено и отрабатывает.

Метод ИндексАктуален() — это способ понять, нужно ли обновление: он возвращает Истина, если с момента последнего построения данные не менялись. На нём же строится индикатор актуальности индекса в интерфейсе администрирования.

Проверка перед жалобой «поиск не находит»
Выполнено: 0 / 5

Операторы запроса: маски, фразы, исключения

Строка поиска понимает не только отдельные слова. Язык запросов позволяет сузить выдачу, и это сильно экономит время на большой базе.

ПриёмКак писатьЧто делает
Несколько словпоставка материалынаходит объекты, где есть оба слова
Точная фраза"акт сверки"ищет слова именно подряд
Маска окончаниядоговор*все слова, начинающиеся на «договор»
Исключениесчёт НЕ авансовыйесть «счёт», но нет «авансовый»
Вариантынакладная ИЛИ актлюбое из слов

По умолчанию несколько слов через пробел трактуются как «И» — должны присутствовать все. Морфология включена, поэтому точную словоформу подбирать не нужно.

Маска * ставится в конце слова и заметно расширяет выдачу: контраг* найдёт и «контрагент», и «контрагенты», и «контрагентский». Это удобно, когда вы не уверены в точной форме.

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

На практике логика запроса почти всегда укладывается в три приёма: сузить выдачу вторым словом, зафиксировать порядок слов кавычками, отсечь лишнее через НЕ. Маску * держите про запас — она помогает, когда точная форма слова неизвестна, но расширяет выдачу и замедляет её просмотр глазами.

Как ускорить поиск и держать индекс свежим

Сам поиск по готовому индексу быстрый. Тормозит обычно не поиск, а обновление индекса, если его запускают редко и большими пачками. Несколько приёмов:

  • ⏱ Частое обновление небольшими порциями — лучше, чем редкое и тяжёлое. Регламентное задание с коротким интервалом добирает мало данных за раз.
  • 🗂 Не индексируйте лишнее — если в свой объект попадают длинные текстовые поля, которые искать не нужно, снимите у них отметку полнотекстового поиска. Меньше данных в индексе — быстрее обновление.
  • 🧹 Полная переиндексация после массовой загрузки — после разовой загрузки больших объёмов (перенос данных, обмен) имеет смысл запустить полное обновление вручную, не дожидаясь расписания.

В клиент-серверной базе обновление выполняет серверный процесс, и оно не блокирует работу пользователей. В файловой базе обновление выполняет клиентский сеанс, поэтому на крупных файловых базах оно заметнее сказывается на отзывчивости.

Индекс занимает место на диске — его размер растёт вместе с объёмом индексируемых данных. В файловой базе это каталог внутри папки информационной базы; при резервном копировании базы он копируется вместе с ней. Если индекс повредился (поиск выдаёт ошибку или заведомо неполный результат), помогает не точечная правка, а полное перестроение: оно создаёт индекс заново по текущим данным.

Полное построение индекса на большой базе — ресурсоёмкая операция. Запускайте её в нерабочее время, чтобы не замедлять работу пользователей.

Почему поиск не находит нужное

Чаще всего строка поиска молчит не из-за сбоя, а по понятной причине. Разберём по симптомам.

Диагностика: выберите симптом

Отдельно про пользователей: если сотрудник не видит часть результатов, которые видите вы, дело обычно в правах доступа (RLS). Полнотекстовый поиск отдаёт только те объекты, на которые у пользователя есть права на просмотр, — это нормальное поведение, а не ошибка индекса.

Поиск в файловой и клиент-серверной базе

Механизм один, но хранение и обновление индекса различаются, и это влияет на выбор режима для большой базы.

ПараметрФайловая базаКлиент-серверная база
Где хранится индексв каталоге информационной базына стороне сервера 1С
Кто обновляетклиентский сеанссерверный процесс
Нагрузка при обновленииложится на клиентане мешает пользователям
Подходит длянебольших и средних базбольших многопользовательских баз

Практический вывод: пока база небольшая и работает несколько человек, файлового варианта достаточно. Когда база растёт и обновление индекса начинает подтормаживать клиент, это один из аргументов за переход на клиент-серверный вариант — там индекс обслуживает сервер.

В клиент-серверном режиме расписание регламентного задания обновления индекса тоже задаётся в базе, а выполняется заданием на сервере. Следить за тем, что задание реально отрабатывает, стоит через список фоновых заданий в администрировании.

Частые вопросы

Нужно ли перезапускать 1С после включения полнотекстового поиска?
Нет. Режим включается в пользовательском режиме и начинает действовать после построения индекса. Перезапуск нужен только если вы меняли состав индексируемых объектов в конфигураторе — тогда требуется обновление конфигурации базы.
Как часто обновлять индекс?
Зависит от интенсивности ввода данных. Для активной базы разумно каждые несколько минут небольшими порциями через регламентное задание. Для редко меняющейся базы хватит обновления раз в час или по расписанию в начале дня.
Почему морфология находит лишние словоформы?
Это задумано: полнотекстовый поиск приводит слова к начальной форме. Чтобы искать точное сочетание, возьмите фразу в кавычки — "акт сверки".
Можно ли искать по номеру документа?
Да, если номер попадает в индексируемые реквизиты. Короткие и чисто числовые фрагменты ищутся хуже — добавьте к номеру ещё одно слово из документа или уточните запрос маской.
Поиск нашёл документ, но при открытии прав нет — почему он в выдаче?
В корректно настроенном решении полнотекстовый поиск уважает права доступа и такого быть не должно. Если это происходит, проверьте настройку прав и ограничений на уровне записей для роли пользователя.