В процессе разработки интерфейсов на управляемых формах часто возникает задача создания удобного механизма поиска. Типичный сценарий: над табличной частью располагается текстовое поле, при вводе данных в которое список товаров или услуг мгновенно фильтруется, оставляя только подходящие позиции. В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем различные подходы и выберем оптимальный вариант в зависимости от объема данных.
Начнем с самого простого и быстрого в реализации метода — использования встроенного свойства элемента формы ОтборСтрок. Этот механизм позволяет визуально скрыть строки, которые не соответствуют заданному условию, не затрагивая при этом сами данные в объекте (например, в документе или обработке).
Рассмотрим, как это работает на практике. Допустим, у нас есть поле ввода на форме с именем СтрокаПоиска и табличная часть Товары. Проанализируем программный код, который необходимо разместить в обработчике события ПриИзменении для поля поиска:
&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
// Создаем структуру для фильтрации
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Наименование", СтрокаПоиска);
// Применяем отбор к элементу формы
// Важно: ОтборСтрок принимает ФиксированнуюСтруктуру
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(ПараметрыОтбора);
КонецПроцедуры
Важный нюанс: стандартный механизм ОтборСтрок работает по принципу полнотекстового соответствия или по началу строки. Если вам нужно найти слово "Ручка" в середине предложения (например, "Синяя Ручка 0.5мм"), обычный ОтборСтрок может не справиться без дополнительных манипуляций. Однако для простых задач поиска по артикулу или точному названию это самое производительное решение.
Чтобы сделать интерфейс более отзывчивым, мы можем настроить фильтрацию так, чтобы она срабатывала сразу во время набора текста, а не только после нажатия клавиши Enter. Однако, если выполнять поиск на каждое нажатие клавиши, система может начать «подтормаживать» при быстром вводе. Выясним, как избежать этой проблемы с помощью обработчика ожидания.
Разберем алгоритм по шагам:
АвтоПодбор или ИзменениеТекста мы будем отключать предыдущий обработчик и подключать новый.Пример кода для реализации такой задержки:
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекста(Элемент, Текст, СтандартнаяОбработка)
// Сохраняем введенный текст в переменную, так как в обработчике ожидания
// доступ к свойству Текст элемента может быть ограничен
ТекущийТекстПоиска = Текст;
// Подключаем обработчик с задержкой 0.5 сек.
// Если пользователь нажмет кнопку снова, старый обработчик будет заменен
ПодключитьОбработчикОжидания("ВыполнитьОтложенныйПоиск", 0.5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОтложенныйПоиск()
// Здесь вызываем логику фильтрации, описанную в предыдущем методе
ОбновитьОтборНаФорме(ТекущийТекстПоиска);
КонецПроцедуры
Если стоит задача найти вхождение подстроки в любом месте наименования (частичное совпадение), и при этом данных в таблице много, мы можем прибегнуть к использованию запросов. Рассмотрим этот продвинутый метод подробнее.
Проанализируем ситуацию: нам нужно найти все строки, где встречается слово "Ручка". Для этого в языке запросов 1С используется оператор ПОДОБНО с маской %.
Посмотрим на пример логики, которую можно реализовать на сервере:
ТаблицаЗначений.ГДЕ Наименование ПОДОБНО &ТекстПоиска, где параметр &ТекстПоиска равен "%" + ВведенныйТекст + "%".Этот метод гарантирует, что пользователь найдет товар, даже если он ввел только часть названия из середины строки.
Рассмотрим ситуацию, когда поиск должен вестись одновременно по нескольким полям: Артикул, Наименование и Описание. Постоянно перебирать все колонки в запросе или фильтре — трудозатратно для системы. Выясним причину замедления и способ оптимизации.
Решение: создание скрытой служебной колонки СтрокаДляПоиска.
При загрузке данных или при изменении значимых полей мы программно объединяем их в одну строку. Например: "00123;Ручка шариковая;Синяя;Parker". Теперь наш поиск будет работать только по одной этой колонке. Это значительно упрощает код фильтрации и ускоряет работу интерфейса, так как системе нужно сравнивать значение только в одном поле вместо четырех.
Иногда задача позволяет заменить обычную табличную часть на Динамический список. Посмотрим, какие преимущества это дает в контексте поиска:
УстановитьПараметрыПоиска.Если ваша таблица — это просто список выбора товаров из базы, использование Динамического списка будет наиболее профессиональным решением.
Подводя итог, мы проанализировали несколько способов реализации поиска. Для простых задач на небольших объемах данных идеально подходит ОтборСтрок. Если же требуется гибкий поиск "внутри" строки по нескольким полям, стоит реализовать механизм с использованием служебной колонки и обработчика ожидания. Выбор конкретного метода зависит от архитектуры вашей обработки и требований к удобству пользователя.