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

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

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

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

Выясним причины возникновения проблемы

Такое поведение связано с особенностями совместной работы управляемых форм, динамических списков и механизма полнотекстового поиска данных (ППД):

  1. Использование полнотекстового поиска строкой динамического списка. По умолчанию стандартная строка поиска в управляемой форме обращается к полнотекстовому индексу информационной базы. Если индекс еще не обновлен, новые и измененные записи не попадают в выдачу, несмотря на то, что они уже физически записаны в базу данных.
  2. Особенности регламентных заданий в файловом режиме. В файловой базе данных регламентные задания (включая задание обновления индекса ППД) не выполняются сервером автоматически в фоновом режиме, если не запущен специальный выделенный сеанс для обработки регламентных заданий. Поэтому автоматическое фоновое обновление индекса каждые несколько секунд в файловом варианте не происходит.
  3. Ошибки контекста вызова серверных методов. Метод ПолнотекстовыйПоиск.ОбновитьИндекс() доступен только на стороне сервера. При попытке вызвать его напрямую из клиентского кода или через общий модуль без признака «Вызов сервера» обновление не выполняется.

Способ 1. Отключение полнотекстового поиска для динамического списка

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

Разберем порядок действий:

  1. Откроем форму списка в конфигураторе.
  2. В дереве элементов и реквизитов формы выделим основной реквизит формы с типом ДинамическийСписок (обычно это Список).
  3. В палитре свойств найдем свойство «Режим полнотекстового поиска» (FullTextSearchMode).
  4. Установим значение в «Не использовать» (НеИспользовать).

В этом режиме строка поиска динамического списка начинает выполнять поиск прямым запросом к таблице базы данных (через строковое условие ПОДОБНО), и все вновь созданные объекты находятся пользователем мгновенно сразу после записи.

Способ 2. Отключение полнотекстового поиска на уровне конфигурации или объектов

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

Рассмотрим варианты отключения:

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

ПолнотекстовыйПоиск.УстановитьРежимИспользованияПолнотекстовогоПоиска(РежимИспользованияПолнотекстовогоПоиска.НеИспользовать);

Способ 3. Программный вызов обновления индекса на сервере

Если полнотекстовый поиск необходим для работы, но в файловой базе регламентные задания не настроены, можно вызвать обновление индекса программно после записи нового объекта.

Посмотрим на пример правильной реализации с разделением контекста:

  1. Создадим общий модуль (например, ПолнотекстовыйПоискСервер) и установим в его свойствах флаги «Сервер» и «Вызов сервера».
  2. Опишем в модуле процедуру обновления индекса:

Процедура ОбновитьИндексПолнотекстовогоПоиска() Экспорт
    // Первый параметр - разрешить слияние порций индекса
    // Второй параметр - выполнять не непрерывно (до полного завершения)
    ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь);
КонецПроцедуры

После этого процедуру можно вызывать из формы объекта или списка после выполнения записи элемента:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОбновитьИндексНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбновитьИндексНаСервере()
    ПолнотекстовыйПоискСервер.ОбновитьИндексПолнотекстовогоПоиска();
КонецПроцедуры

Обратите внимание: частый вызов метода ОбновитьИндекс() в многопользовательском режиме может приводить к временным блокировкам файлов индекса, поэтому данный способ рекомендуется применять только при невысокой интенсивности создания записей.

Способ 4. Организация поиска через стандартные отборы и ввод по строке

Для быстрого поиска объектов в списках и полях ввода без использования полнотекстового индекса применяются следующие механизмы платформы:

  1. Настройка ввода по строке: в свойствах справочника укажем реквизиты в свойстве «Ввод по строке» (например, Наименование, Код, ИНН). Это обеспечивает моментальный автоподбор при вводе в поле выбора.
  2. Пользовательские отборы списка: добавление на форму поля отбора со сравнением «Содержит» по нужному реквизиту (наименованию, контрагенту или комментарию). Такой отбор работает напрямую через запрос динамического списка и не зависит от состояния полнотекстового индекса.
← На главную