Разработчики и администраторы систем на платформе «1С:Предприятие 8.3» часто сталкиваются с ситуацией, когда стандартный поиск в динамическом списке (например, в подборе номенклатуры или списке документов) внезапно перестает работать, выдает пустые результаты или функционирует некорректно — ищет только по числовым реквизитам вроде остатков, полностью игнорируя наименование или текстовые поля. Давайте подробно разберем, как устроена логика поиска на платформе «под капотом», почему возникают подобные сбои и какими методами можно восстановить корректную работу системы.
Для того чтобы эффективно решать проблемы с поиском, нам необходимо понять базовую логику работы платформы 1С. Поиск в динамических списках использует гибридный алгоритм, состоящий из двух ключевых режимов:
ПОДОБНО "%Текст%" (конструкция LIKE). Такие запросы приводят к полному сканированию таблиц (Full Table Scan) и игнорируют стандартные индексы СУБД, что на базах среднего и большого объема вызывает катастрофическое падение производительности и длительные зависания интерфейса у пользователей.Именно поэтому для корректной и быстрой работы поиска в динамических списках критически важно иметь правильно настроенный и регулярно обновляемый полнотекстовый поиск. В качестве альтернативы штатному подстрочному механизму можно использовать расширение для семантического поиска по справочникам.
Выясним причину, почему поиск по текстовым полям (например, по наименованию номенклатуры) может не работать в новой или самописной конфигурации. Если для реквизитов справочника включено свойство «Индексировать», но полнотекстовый поиск в базе отключен на уровне всей системы, платформа не сможет построить быстрый поисковый индекс.
Для решения этой проблемы выполним следующие шаги по шагам:
После включения этой опции платформа начнет использовать встроенные механизмы индексации для поиска данных. Для централизованного контроля этих параметров подойдёт обработка для управления полнотекстовым поиском.
Важно понимать ключевую особенность ППД: новые данные, введенные пользователями, не попадают в результаты поиска мгновенно. Они станут доступны для поиска только после того, как будет обновлен индекс полнотекстового поиска. Если данные вводятся непрерывно, индекс быстро теряет актуальность.
Для автоматизации этого процесса нам необходимо настроить регламентные задания. Платформа 1С предоставляет для работы с ППД объект ПолнотекстовыйПоиск и его ключевой метод ОбновитьИндекс(). Рассмотрим подробнее синтаксис этого метода:
ПолнотекстовыйПоиск.ОбновитьИндекс(<РазрешитьСлияние>, <Порциями>)
Истина запускает слияние, что требует времени, но повышает производительность поиска. Значение Ложь обновляет только частичный индекс.Истина, обновление происходит небольшими порциями (по 10 тысяч объектов за один вызов метода). Это позволяет не блокировать систему на долгое время при регулярных запусках.Рекомендуется настроить два регламентных задания в системе:
Задание №1: Регулярное частичное обновление индекса (запускается каждые 1–5 минут в зависимости от интенсивности работы пользователей):
Процедура ОбновлениеИндексаППД() Экспорт
// Обновляем индекс порциями без слияния, чтобы быстро зарегистрировать новые объекты
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);
КонецПроцедуры
Задание №2: Слияние индексов (выполняется один раз в сутки, как правило, в ночное время):
Процедура СлияниеИндексаППД() Экспорт
// Производим полное слияние индексов для оптимизации структуры файлов поиска
ПолнотекстовыйПоиск.ОбновитьИндекс(Истина);
КонецПроцедуры
Особенность работы в файловом варианте базы данных: Обратите внимание, что в файловых базах данных регламентные задания не выполняются в фоновом режиме автоматически, если в базе нет активных сеансов. Для корректной работы регламентных заданий в файловом режиме требуется либо запущенный выделенный сеанс, выполняющий роль планировщика задач, либо регулярная неявная инициализация заданий при работе пользователей.
Бывают ситуации, когда поиск в динамическом списке внезапно перестает работать корректно, выдавая пустые результаты или находя данные только по коротким обрывкам слов (в 3-4 символа), даже несмотря на успешное выполнение регламентных заданий обновления. Это свидетельствует о деградации или повреждении файлов индекса полнотекстового поиска.
Обычное слияние или частичное обновление в таком случае не поможет. Нам необходимо выполнить полную очистку индекса и перестроить его заново с нуля. Проанализируем, как сделать это программно и интерактивно.
Для интерактивной очистки зайдем в стандартную панель «Управление полнотекстовым поиском», нажмем кнопку «Очистить индекс», а затем запустим процесс кнопкой «Обновить индекс».
Для программной реализации этой административной процедуры мы можем использовать следующий код:
Процедура ОчиститьИПолностьюПерестроитьИндекс() Экспорт
// Полностью удаляем индексные файлы с диска
ПолнотекстовыйПоиск.ОчиститьИндекс();
// Запускаем процесс индексации всей базы данных с нуля
ПолнотекстовыйПоиск.ОбновитьИндекс(Истина);
КонецПроцедуры
Учитывайте, что полное индексирование крупной информационной базы может занять продолжительное время (от нескольких десятков минут до нескольких часов), поэтому данную операцию следует проводить в периоды минимальной активности пользователей.
Часто разработчики упускают из виду чисто интерфейсные настройки динамического списка, которые напрямую влияют на доступность полей для поиска:
Справочник.Номенклатура). Если это свойство оставлено пустым, платформа не сможет корректно сопоставить строки списка с метаданными и полнотекстовыми индексами, что приведет к блокировке стандартных механизмов поиска и отбора.Если вы проверили все настройки полнотекстового поиска, убедились в актуальности индексов и настроили видимость колонок, но поиск в динамическом списке все равно работает крайне медленно или приводит к зависанию сеанса, возможно, вы столкнулись с зарегистрированной ошибкой платформы.
В частности, широко известна ошибка платформы за номером 10177038. Суть проблемы заключалась в том, что при поиске в динамическом списке (особенно в клиент-серверном режиме работы при отключенном или неотвечающем полнотекстовом поиске) система генерировала тяжелые, неоптимальные SQL-запросы к СУБД. Это приводило к колоссальной нагрузке на сервер БД и критическим блокировкам. Данная проблема была полностью устранена в релизе платформы 8.3.10.2375 и более поздних версиях.
Если вы работаете на устаревших релизах платформы линейки 8.3.7 - 8.3.10, настоятельно рекомендуется обновить технологическую платформу до актуальной поддерживаемой версии, чтобы исключить влияние системных ошибок на работу ваших пользователей.