При разработке конфигураций с нуля или доработке существующих управляемых форм разработчики часто сталкиваются с ситуацией, когда стандартный поиск в форме списка ведет себя неожиданно: при вводе текста с клавиатуры или нажатии горячих клавиш список полностью очищается и сообщает, что ничего не найдено. При этом поиск по конкретной колонке через комбинацию клавиш Alt + F продолжает успешно работать.
Разберем подробно, как устроены механизмы поиска в динамических списках управляемого интерфейса 1С:Предприятия 8.3, почему поведение поиска напрямую зависит от полнотекстового индекса и какими способами можно настроить удобный поиск для пользователей.
В платформе 1С:Предприятие 8.3 для динамических списков предусмотрено два принципиально разных механизма поиска:
Проанализируем основные причины, из-за которых строка поиска динамического списка мгновенно очищает список при вводе данных:
Основная таблица, полнотекстовый поиск по строкам списка работать не сможет.LEFT JOIN), вложенные запросы или вычисляемые поля, в этот поиск не попадают.ПолнотекстовыйПоиск может быть установлено в значение Не использовать.Если в базе данных не планируется администрировать полнотекстовый поиск или форма содержит множество колонок, самым простым и надежным решением является отключение встроенной строки поиска. В этом случае поиск вернется к классической работе по колонкам.
Разберем по шагам, как отключить строку поиска в форме:
Список).Нет.Нет.После отключения строки поиска платформа переключает поведение формы: стандартное нажатие Ctrl + F и ввод с клавиатуры начинают выполнять поиск по текущей колонке или колонке сортировки без обращения к полнотекстовому индексу.
Если требуется сохранить возможность сквозного поиска по всем полям списка, необходимо обеспечить регулярную актуализацию полнотекстового индекса базы данных.
Для корректного функционирования индекса платформе требуются две процедуры, которые настраиваются через регламентные задания:
Посмотрим на пример серверного кода для вызова регламентных процедур:
// Процедура для частого регламентного задания (раз в 1-5 минут)
Процедура РегламентноеОбновлениеИндексаПП() Экспорт
Если ПолнотекстовыйПоиск.ПолучитьРежимРазрешения() = РежимРазрешенияПолнотекстовогоПоиска.Разрешить Тогда
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);
КонецЕсли;
КонецПроцедуры
// Процедура для ночного регламентного задания
Процедура РегламентноеСлияниеИндексовПП() Экспорт
Если ПолнотекстовыйПоиск.ПолучитьРежимРазрешения() = РежимРазрешенияПолнотекстовогоПоиска.Разрешить Тогда
ПолнотекстовыйПоиск.СлияниеИндексов();
КонецЕсли;
КонецПроцедуры
Если требуется реализовать поиск по нескольким колонкам без использования полнотекстового индекса, можно добавить на форму собственное поле ввода строки поиска и программно накладывать отбор на динамический список с условием «ИЛИ».
Рассмотрим пример реализации в модуле управляемой формы:
&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
ПрименитьОтборПоискаНаСервере(СтрокаПоиска);
КонецПроцедуры
&НаСервере
Процедура ПрименитьОтборПоискаНаСервере(Знач ТекстПоиска)
// Находим или создаем группу отбора "ИЛИ"
ГруппаПоиска = Неопределено;
Для Каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
И ЭлементОтбора.Представление = "БыстрыйПоиск" Тогда
ГруппаПоиска = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЦикла;
Если ГруппаПоиска = Неопределено И Не ПустаяСтрока(ТекстПоиска) Тогда
ГруппаПоиска = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаПоиска.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
ГруппаПоиска.Представление = "БыстрыйПоиск";
ГруппаПоиска.Использование = Истина;
КонецЕсли;
Если ГруппаПоиска <> Неопределено Тогда
ГруппаПоиска.Элементы.Очистить();
Если ПустаяСтрока(ТекстПоиска) Тогда
ГруппаПоиска.Использование = Ложь;
Иначе
ГруппаПоиска.Использование = Истина;
// Добавляем условие "Содержит" для наименования
ЭлементНаименование = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементНаименование.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементНаименование.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементНаименование.ПравоеЗначение = ТекстПоиска;
ЭлементНаименование.Использование = Истина;
// Добавляем условие "Содержит" для артикула или кода
ЭлементКод = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементКод.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Код");
ЭлементКод.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементКод.ПравоеЗначение = ТекстПоиска;
ЭлементКод.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Помимо поиска в списках, в командной панели интерфейса управляемого приложения присутствует поле глобального поиска. Если полнотекстовый поиск в конфигурации не используется и поле в шапке программы не требуется, его можно полностью отключить в свойствах конфигурации: для этого в корневом узле дерева метаданных конфигуратора необходимо установить свойство Использовать глобальный поиск в значение Не использовать.