Полнотекстовый поиск в 1С 8.3: механизмы и настройка
Содержание
Строка глобального поиска в 1С работает поверх полнотекстового индекса: вы вводите слово, платформа ищет его не в самих таблицах базы, а в заранее построенном индексе и возвращает ссылки на документы, справочники и регистры, где это слово встречается. Отсюда два следствия: поиск не находит то, что ещё не попало в индекс, и для реквизитов, не помеченных к индексации, он тоже ничего не покажет.
Чтобы строка поиска искала по всей базе, нужны три вещи: режим полнотекстового поиска включён, нужные объекты и реквизиты помечены в конфигураторе, а индекс регулярно обновляется. Ниже — как каждый из этих механизмов устроен в 1С 8.3 и что настроить, чтобы поиск находил свежие данные быстро.
Как устроен полнотекстовый индекс
Полнотекстовый поиск — отдельная подсистема платформы, а не фильтр по строке. Платформа разбирает текстовые значения реквизитов на слова, приводит их к начальной форме (учитывает морфологию) и складывает в индекс: слово → ссылки на объекты, где оно есть.
Когда пользователь набирает запрос в строке поиска, платформа обращается к индексу, а не перебирает записи. Поэтому поиск по десяткам тысяч документов срабатывает за доли секунды — но только если индекс построен и актуален.
Индекс учитывает словоформы. Запрос договор найдёт «договором», «договоров», «договору» — морфология работает по умолчанию. Это ключевое отличие от обычного отбора списка по подстроке, который ищет точное вхождение символов.
В индекс попадают не все слова подряд. Служебные слова — предлоги, союзы, частицы — и слишком короткие фрагменты платформа пропускает: они встречаются почти везде и для поиска бесполезны. Поэтому запрос из одного короткого служебного слова ничего осмысленного не вернёт — это не сбой, а устройство индекса.
Результаты глобального поиска платформа показывает списком со ссылками, сгруппированными по типам объектов, и подсвечивает найденное слово в контексте. Вы сразу видите, в документе это, справочнике или регистре, и переходите по ссылке в нужный объект.
Глобальный поиск вызывается значком лупы в правой части панели системных команд — рядом с меню функций и именем пользователя. Он ищет сразу по всем разделам программы, в отличие от строки поиска внутри конкретного списка, которая фильтрует только открытый список.
Не путайте два разных механизма:
- 🔍 Глобальный поиск (значок лупы) — ищет по всей базе через полнотекстовый индекс.
- 📄 Поиск в списке (поле над таблицей) — отбирает строки открытого списка по вхождению текста, индекс ему не нужен.
Эта статья — про первый, полнотекстовый.
Что попадает в индекс: настройка в конфигураторе
Полнотекстовый поиск индексирует не всё подряд, а только то, что разработчик конфигурации пометил к индексации. Настройка живёт в конфигураторе, на уровне объектов метаданных и их реквизитов.
У большинства объектов (справочников, документов, регистров) есть свойство Полнотекстовый поиск со значениями Использовать и Не использовать. То же свойство есть у отдельных реквизитов. Если объект помечен Использовать, в индекс попадают его реквизиты, у которых поиск тоже разрешён.
Порядок настройки в конфигураторе:
- Откройте дерево конфигурации, найдите нужный объект (например, справочник «Контрагенты»).
- В палитре свойств найдите свойство
Полнотекстовый поиски поставьтеИспользовать. - Раскройте состав реквизитов, у каждого реквизита, который должен искаться, проверьте то же свойство.
- Обновите конфигурацию базы данных (
F7), чтобы изменения вступили в силу.
В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) состав индексируемых объектов уже настроен разработчиком — для рядовых справочников и документов всё помечено. Менять настройки в конфигураторе нужно, только если вы дорабатываете конфигурацию собственными объектами и хотите, чтобы они тоже искались.
Правка свойств полнотекстового поиска — это изменение конфигурации. Для типового решения оно переведёт конфигурацию в режим с изменениями и усложнит обновление. Для своих объектов используйте расширение конфигурации, а не правку типовой.
После того как объекты помечены, индекс нужно построить — одна отметка в конфигураторе поиск ещё не включает.
Включение режима и обновление индекса
Второй механизм — режим полнотекстового поиска и обновление индекса. Режим можно включать и выключать на лету, в пользовательском режиме, без конфигуратора.
В типовых решениях на БСП управление вынесено в раздел Администрирование → Обслуживание (название группы настроек может отличаться по релизу — ищите пункт со словами «полнотекстовый поиск» или «поиск данных»). Там режим включают, видят, актуален ли индекс, и запускают обновление вручную.
Через встроенный язык режим задаётся так:
// Включить полнотекстовый поиск
УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить);
// Обновить индекс (в основном потоке, не прерывать при ошибке)
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь);
// Проверить, актуален ли индекс
Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь);
КонецЕсли;
Индекс обновляется порциями: платформа добирает в него данные, изменившиеся с прошлого обновления, а не строит его заново. Поэтому первое построение на большой базе идёт долго, а последующие обновления — быстро.
За регулярное обновление отвечает регламентное задание (в типовых оно называется примерно «Обновление индекса полнотекстового поиска »). Оно запускается по расписанию и держит индекс свежим без ручного вмешательства. Проверить и настроить расписание можно в разделе администрирования, в списке регламентных и фоновых заданий.
Первый параметр метода ОбновитьИндекс управляет тем, как идёт обновление. Значение Ложь запускает обновление отдельным потоком, не блокируя текущий сеанс; Истина — в основном потоке, с ожиданием завершения. В регламентном задании типовой конфигурации всё это уже настроено, и вручную вызывать метод из консоли обычно не нужно — достаточно проверить, что задание включено и отрабатывает.
Метод ИндексАктуален() — это способ понять, нужно ли обновление: он возвращает Истина, если с момента последнего построения данные не менялись. На нём же строится индикатор актуальности индекса в интерфейсе администрирования.
Операторы запроса: маски, фразы, исключения
Строка поиска понимает не только отдельные слова. Язык запросов позволяет сузить выдачу, и это сильно экономит время на большой базе.
| Приём | Как писать | Что делает |
|---|---|---|
| Несколько слов | поставка материалы | находит объекты, где есть оба слова |
| Точная фраза | "акт сверки" | ищет слова именно подряд |
| Маска окончания | договор* | все слова, начинающиеся на «договор» |
| Исключение | счёт НЕ авансовый | есть «счёт», но нет «авансовый» |
| Варианты | накладная ИЛИ акт | любое из слов |
По умолчанию несколько слов через пробел трактуются как «И» — должны присутствовать все. Морфология включена, поэтому точную словоформу подбирать не нужно.
Маска * ставится в конце слова и заметно расширяет выдачу: контраг* найдёт и «контрагент», и «контрагенты», и «контрагентский». Это удобно, когда вы не уверены в точной форме.
Платформа поддерживает и более тонкие приёмы — например, нечёткий поиск с учётом опечаток и поиск слов, стоящих рядом. Если сомневаетесь в синтаксисе конкретного оператора, начните с простого запроса из одного-двух слов и уточняйте его масками и исключениями — этого хватает в подавляющем большинстве задач.
На практике логика запроса почти всегда укладывается в три приёма: сузить выдачу вторым словом, зафиксировать порядок слов кавычками, отсечь лишнее через НЕ. Маску * держите про запас — она помогает, когда точная форма слова неизвестна, но расширяет выдачу и замедляет её просмотр глазами.
Как ускорить поиск и держать индекс свежим
Сам поиск по готовому индексу быстрый. Тормозит обычно не поиск, а обновление индекса, если его запускают редко и большими пачками. Несколько приёмов:
- ⏱ Частое обновление небольшими порциями — лучше, чем редкое и тяжёлое. Регламентное задание с коротким интервалом добирает мало данных за раз.
- 🗂 Не индексируйте лишнее — если в свой объект попадают длинные текстовые поля, которые искать не нужно, снимите у них отметку полнотекстового поиска. Меньше данных в индексе — быстрее обновление.
- 🧹 Полная переиндексация после массовой загрузки — после разовой загрузки больших объёмов (перенос данных, обмен) имеет смысл запустить полное обновление вручную, не дожидаясь расписания.
В клиент-серверной базе обновление выполняет серверный процесс, и оно не блокирует работу пользователей. В файловой базе обновление выполняет клиентский сеанс, поэтому на крупных файловых базах оно заметнее сказывается на отзывчивости.
Индекс занимает место на диске — его размер растёт вместе с объёмом индексируемых данных. В файловой базе это каталог внутри папки информационной базы; при резервном копировании базы он копируется вместе с ней. Если индекс повредился (поиск выдаёт ошибку или заведомо неполный результат), помогает не точечная правка, а полное перестроение: оно создаёт индекс заново по текущим данным.
Полное построение индекса на большой базе — ресурсоёмкая операция. Запускайте её в нерабочее время, чтобы не замедлять работу пользователей.
Почему поиск не находит нужное
Чаще всего строка поиска молчит не из-за сбоя, а по понятной причине. Разберём по симптомам.
Отдельно про пользователей: если сотрудник не видит часть результатов, которые видите вы, дело обычно в правах доступа (RLS). Полнотекстовый поиск отдаёт только те объекты, на которые у пользователя есть права на просмотр, — это нормальное поведение, а не ошибка индекса.
Поиск в файловой и клиент-серверной базе
Механизм один, но хранение и обновление индекса различаются, и это влияет на выбор режима для большой базы.
| Параметр | Файловая база | Клиент-серверная база |
|---|---|---|
| Где хранится индекс | в каталоге информационной базы | на стороне сервера 1С |
| Кто обновляет | клиентский сеанс | серверный процесс |
| Нагрузка при обновлении | ложится на клиента | не мешает пользователям |
| Подходит для | небольших и средних баз | больших многопользовательских баз |
Практический вывод: пока база небольшая и работает несколько человек, файлового варианта достаточно. Когда база растёт и обновление индекса начинает подтормаживать клиент, это один из аргументов за переход на клиент-серверный вариант — там индекс обслуживает сервер.
В клиент-серверном режиме расписание регламентного задания обновления индекса тоже задаётся в базе, а выполняется заданием на сервере. Следить за тем, что задание реально отрабатывает, стоит через список фоновых заданий в администрировании.
Частые вопросы
Нужно ли перезапускать 1С после включения полнотекстового поиска?
Как часто обновлять индекс?
Почему морфология находит лишние словоформы?
"акт сверки".