Почему не работает поиск в форме списка 1С 8.3 и как его настроить

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

При разработке конфигураций с нуля или доработке существующих управляемых форм разработчики часто сталкиваются с ситуацией, когда стандартный поиск в форме списка ведет себя неожиданно: при вводе текста с клавиатуры или нажатии горячих клавиш список полностью очищается и сообщает, что ничего не найдено. При этом поиск по конкретной колонке через комбинацию клавиш Alt + F продолжает успешно работать.

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

Принцип работы поиска в динамических списках

В платформе 1С:Предприятие 8.3 для динамических списков предусмотрено два принципиально разных механизма поиска:

  1. Полнотекстовый поиск по списку (Строка поиска): активируется при вводе текста с клавиатуры непосредственно в список, через поле «Поиск» в командной панели списка или по нажатию Ctrl + F (в зависимости от настроек формы). Этот механизм выполняет поиск сразу по всем колонкам основной таблицы динамического списка, используя встроенный полнотекстовый индекс платформы.
  2. Поиск по значению в текущей колонке: вызывается сочетанием клавиш Alt + F или через контекстное меню. Этот поиск не использует полнотекстовый индекс, а накладывает прямой отбор на уровне СУБД с условием равенства или вхождения подстроки.

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

Проанализируем основные причины, из-за которых строка поиска динамического списка мгновенно очищает список при вводе данных:

  1. Не обновлен индекс полнотекстового поиска: в самописных конфигурациях без внедренной Библиотеки Стандартных Подсистем (БСП) часто отсутствуют настроенные регламентные задания обслуживания индекса. Если индекс пуст или не содержит последних изменений, механизм поиска считает, что совпадений нет, и возвращает пустой результат.
  2. Отсутствует «Основная таблица» у динамического списка: если динамический список сформирован на основе произвольного запроса и у него в конфигураторе не указано свойство Основная таблица, полнотекстовый поиск по строкам списка работать не сможет.
  3. Поиск по полям из соединений: полнотекстовый поиск в динамическом списке индексирует только поля основной таблицы. Данные, полученные через левые соединения (LEFT JOIN), вложенные запросы или вычисляемые поля, в этот поиск не попадают.
  4. Ограничение длины поискового слова: по умолчанию механизм полнотекстового поиска платформы обрабатывает запросы длиной от 3 символов. Попытка найти объект по 1–2 символам (например, короткий код или префикс) через строку поиска не вернет результатов.
  5. Отключение поиска в метаданных: у конкретных реквизитов объекта свойство ПолнотекстовыйПоиск может быть установлено в значение Не использовать.

Решение 1. Отключение полнотекстового поиска в форме списка

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

Разберем по шагам, как отключить строку поиска в форме:

  1. Откроем форму списка в конфигураторе.
  2. В дереве элементов формы выделим элемент таблицы динамического списка (обычно Список).
  3. В палитре свойств найдем группу настроек отображения элементов поиска.
  4. Установим свойство Положение строки поиска в значение Нет.
  5. Дополнительно можно отключить связанные элементы, установив свойства Положение состояния просмотра и Положение управления поиском в значение Нет.

После отключения строки поиска платформа переключает поведение формы: стандартное нажатие Ctrl + F и ввод с клавиатуры начинают выполнять поиск по текущей колонке или колонке сортировки без обращения к полнотекстовому индексу.

Решение 2. Настройка обслуживания полнотекстового индекса

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

Для корректного функционирования индекса платформе требуются две процедуры, которые настраиваются через регламентные задания:

  1. Обновление индекса: добавляет все новые и измененные объекты во временный (дополнительный) индекс. Процедура должна выполняться с высокой частотой (каждые 1–5 минут).
  2. Слияние индексов: объединяет дополнительный индекс с основным. Процедура выполняется реже (например, один раз в сутки ночью), так как требует больше ресурсов сервера.

Посмотрим на пример серверного кода для вызова регламентных процедур:


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

// Процедура для ночного регламентного задания
Процедура РегламентноеСлияниеИндексовПП() Экспорт
    Если ПолнотекстовыйПоиск.ПолучитьРежимРазрешения() = РежимРазрешенияПолнотекстовогоПоиска.Разрешить Тогда
        ПолнотекстовыйПоиск.СлияниеИндексов();
    КонецЕсли;
КонецПроцедуры

Решение 3. Реализация быстрого поиска через отбор компоновки данных

Если требуется реализовать поиск по нескольким колонкам без использования полнотекстового индекса, можно добавить на форму собственное поле ввода строки поиска и программно накладывать отбор на динамический список с условием «ИЛИ».

Рассмотрим пример реализации в модуле управляемой формы:


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

&НаСервере
Процедура ПрименитьОтборПоискаНаСервере(Знач ТекстПоиска)
    
    // Находим или создаем группу отбора "ИЛИ"
    ГруппаПоиска = Неопределено;
    Для Каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
        Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") 
            И ЭлементОтбора.Представление = "БыстрыйПоиск" Тогда
            ГруппаПоиска = ЭлементОтбора;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если ГруппаПоиска = Неопределено И Не ПустаяСтрока(ТекстПоиска) Тогда
        ГруппаПоиска = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
        ГруппаПоиска.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
        ГруппаПоиска.Представление = "БыстрыйПоиск";
        ГруппаПоиска.Использование = Истина;
    КонецЕсли;
    
    Если ГруппаПоиска <> Неопределено Тогда
        ГруппаПоиска.Элементы.Очистить();
        
        Если ПустаяСтрока(ТекстПоиска) Тогда
            ГруппаПоиска.Использование = Ложь;
        Иначе
            ГруппаПоиска.Использование = Истина;
            
            // Добавляем условие "Содержит" для наименования
            ЭлементНаименование = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементНаименование.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
            ЭлементНаименование.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
            ЭлементНаименование.ПравоеЗначение = ТекстПоиска;
            ЭлементНаименование.Использование = Истина;
            
            // Добавляем условие "Содержит" для артикула или кода
            ЭлементКод = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементКод.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Код");
            ЭлементКод.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
            ЭлементКод.ПравоеЗначение = ТекстПоиска;
            ЭлементКод.Использование = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Управление глобальным поиском в заголовке приложения

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

← На главную