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