Как реализовать поиск и фильтрацию в табличной части на управляемой форме 1С?

Программист IT и автоматизация бизнеса
← На главную

В процессе разработки интерфейсов на управляемых формах часто возникает задача создания удобного механизма поиска. Типичный сценарий: над табличной частью располагается текстовое поле, при вводе данных в которое список товаров или услуг мгновенно фильтруется, оставляя только подходящие позиции. В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем различные подходы и выберем оптимальный вариант в зависимости от объема данных.

Использование стандартного свойства ОтборСтрок

Начнем с самого простого и быстрого в реализации метода — использования встроенного свойства элемента формы ОтборСтрок. Этот механизм позволяет визуально скрыть строки, которые не соответствуют заданному условию, не затрагивая при этом сами данные в объекте (например, в документе или обработке).

Рассмотрим, как это работает на практике. Допустим, у нас есть поле ввода на форме с именем СтрокаПоиска и табличная часть Товары. Проанализируем программный код, который необходимо разместить в обработчике события ПриИзменении для поля поиска:


&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
    
    // Создаем структуру для фильтрации
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Наименование", СтрокаПоиска);
    
    // Применяем отбор к элементу формы
    // Важно: ОтборСтрок принимает ФиксированнуюСтруктуру
    Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(ПараметрыОтбора);
    
КонецПроцедуры

Важный нюанс: стандартный механизм ОтборСтрок работает по принципу полнотекстового соответствия или по началу строки. Если вам нужно найти слово "Ручка" в середине предложения (например, "Синяя Ручка 0.5мм"), обычный ОтборСтрок может не справиться без дополнительных манипуляций. Однако для простых задач поиска по артикулу или точному названию это самое производительное решение.

Реализация поиска «на лету» с обработчиком ожидания

Чтобы сделать интерфейс более отзывчивым, мы можем настроить фильтрацию так, чтобы она срабатывала сразу во время набора текста, а не только после нажатия клавиши Enter. Однако, если выполнять поиск на каждое нажатие клавиши, система может начать «подтормаживать» при быстром вводе. Выясним, как избежать этой проблемы с помощью обработчика ожидания.

Разберем алгоритм по шагам:

  1. В событии поля ввода АвтоПодбор или ИзменениеТекста мы будем отключать предыдущий обработчик и подключать новый.
  2. Система выждет небольшую паузу (например, 0.5 секунды) после последнего нажатия клавиши.
  3. Только после этого выполнится сама процедура фильтрации.

Пример кода для реализации такой задержки:


&НаКлиенте
Процедура СтрокаПоискаИзменениеТекста(Элемент, Текст, СтандартнаяОбработка)
    
    // Сохраняем введенный текст в переменную, так как в обработчике ожидания 
    // доступ к свойству Текст элемента может быть ограничен
    ТекущийТекстПоиска = Текст;
    
    // Подключаем обработчик с задержкой 0.5 сек.
    // Если пользователь нажмет кнопку снова, старый обработчик будет заменен
    ПодключитьОбработчикОжидания("ВыполнитьОтложенныйПоиск", 0.5, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОтложенныйПоиск()
    // Здесь вызываем логику фильтрации, описанную в предыдущем методе
    ОбновитьОтборНаФорме(ТекущийТекстПоиска);
КонецПроцедуры

Сложный поиск через временные таблицы и оператор ПОДОБНО

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

Проанализируем ситуацию: нам нужно найти все строки, где встречается слово "Ручка". Для этого в языке запросов 1С используется оператор ПОДОБНО с маской %.

Посмотрим на пример логики, которую можно реализовать на сервере:

  1. Выгружаем табличную часть в объект ТаблицаЗначений.
  2. Помещаем эту таблицу в запрос как временную таблицу.
  3. Выполняем запрос с условием: ГДЕ Наименование ПОДОБНО &ТекстПоиска, где параметр &ТекстПоиска равен "%" + ВведенныйТекст + "%".
  4. Получаем список идентификаторов или индексов строк, которые подошли.
  5. На клиенте скрываем ненужные строки или перезаполняем визуальное представление.

Этот метод гарантирует, что пользователь найдет товар, даже если он ввел только часть названия из середины строки.

Оптимизация для больших таблиц: Служебная колонка поиска

Рассмотрим ситуацию, когда поиск должен вестись одновременно по нескольким полям: Артикул, Наименование и Описание. Постоянно перебирать все колонки в запросе или фильтре — трудозатратно для системы. Выясним причину замедления и способ оптимизации.

Решение: создание скрытой служебной колонки СтрокаДляПоиска.

При загрузке данных или при изменении значимых полей мы программно объединяем их в одну строку. Например: "00123;Ручка шариковая;Синяя;Parker". Теперь наш поиск будет работать только по одной этой колонке. Это значительно упрощает код фильтрации и ускоряет работу интерфейса, так как системе нужно сравнивать значение только в одном поле вместо четырех.

Использование динамических списков вместо табличных частей

Иногда задача позволяет заменить обычную табличную часть на Динамический список. Посмотрим, какие преимущества это дает в контексте поиска:

Если ваша таблица — это просто список выбора товаров из базы, использование Динамического списка будет наиболее профессиональным решением.

Заключение

Подводя итог, мы проанализировали несколько способов реализации поиска. Для простых задач на небольших объемах данных идеально подходит ОтборСтрок. Если же требуется гибкий поиск "внутри" строки по нескольким полям, стоит реализовать механизм с использованием служебной колонки и обработчика ожидания. Выбор конкретного метода зависит от архитектуры вашей обработки и требований к удобству пользователя.

← На главную