Разберем распространенную ситуацию при разработке конфигураций на платформе 1С:Предприятие 8.3: пользователь создает новый элемент справочника или документ, закрывает форму, пытается найти созданный объект через стандартную строку поиска в динамическом списке, но поиск ничего не находит. При этом после перезапуска клиентского сеанса или переиндексации объект начинает отображаться.
Проанализируем причины такого поведения платформы и рассмотрим по шагам, как исправить эту проблему.
Такое поведение связано с особенностями совместной работы управляемых форм, динамических списков и механизма полнотекстового поиска данных (ППД):
ПолнотекстовыйПоиск.ОбновитьИндекс() доступен только на стороне сервера. При попытке вызвать его напрямую из клиентского кода или через общий модуль без признака «Вызов сервера» обновление не выполняется.Если для конкретного списка требуется мгновенный поиск по строке без необходимости постоянной фоновой индексации, наиболее эффективным решением является отключение режима полнотекстового поиска в свойствах динамического списка.
Разберем порядок действий:
ДинамическийСписок (обычно это Список).FullTextSearchMode).НеИспользовать).В этом режиме строка поиска динамического списка начинает выполнять поиск прямым запросом к таблице базы данных (через строковое условие ПОДОБНО), и все вновь созданные объекты находятся пользователем мгновенно сразу после записи.
Если в конфигурации полнотекстовый поиск не используется вообще, его можно полностью отключить, чтобы снизить накладные расходы и избежать проблем с неактуальными индексами.
Рассмотрим варианты отключения:
ПолнотекстовыйПоиск.УстановитьРежимИспользованияПолнотекстовогоПоиска(РежимИспользованияПолнотекстовогоПоиска.НеИспользовать);
Если полнотекстовый поиск необходим для работы, но в файловой базе регламентные задания не настроены, можно вызвать обновление индекса программно после записи нового объекта.
Посмотрим на пример правильной реализации с разделением контекста:
ПолнотекстовыйПоискСервер) и установим в его свойствах флаги «Сервер» и «Вызов сервера».
Процедура ОбновитьИндексПолнотекстовогоПоиска() Экспорт
// Первый параметр - разрешить слияние порций индекса
// Второй параметр - выполнять не непрерывно (до полного завершения)
ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь);
КонецПроцедуры
После этого процедуру можно вызывать из формы объекта или списка после выполнения записи элемента:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ОбновитьИндексНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбновитьИндексНаСервере()
ПолнотекстовыйПоискСервер.ОбновитьИндексПолнотекстовогоПоиска();
КонецПроцедуры
Обратите внимание: частый вызов метода ОбновитьИндекс() в многопользовательском режиме может приводить к временным блокировкам файлов индекса, поэтому данный способ рекомендуется применять только при невысокой интенсивности создания записей.
Для быстрого поиска объектов в списках и полях ввода без использования полнотекстового индекса применяются следующие механизмы платформы:
Наименование, Код, ИНН). Это обеспечивает моментальный автоподбор при вводе в поле выбора.