Как реализовать поисковое поле с выпадающим списком товаров в 1С 8.3 по аналогии с маркетплейсами?

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

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

В чем заключается ошибка при использовании стандартной строки поиска таблицы?

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

Если пользователь вводит текст в такое поле и нажимает Enter, фокус управления передается в саму таблицу (ТЧ), и если соответствий не найдено, таблица просто оказывается пустой. Этот механизм не предназначен для обращения к базе данных и поиска новых элементов, которых еще нет в вашей таблице. Для реализации полноценного поиска нам потребуется создать отдельный элемент управления.

Способ 1. Использование события «АвтоПодбор» (рекомендуемый метод)

Рассмотрим самый простой и эффективный способ создания выпадающего списка. Для этого нам понадобится обычное поле ввода на форме, связанное с реквизитом типа СправочникСсылка.Номенклатура или просто строковым реквизитом.

Разберем по шагам логику работы события АвтоПодбор:

  1. Создадим на форме реквизит СтрокаПоискаТоваров (тип: Строка).
  2. Вынесем его на форму и в свойствах элемента найдем событие АвтоПодбор.
  3. В обработчике этого события мы будем программно формировать список подсказок.

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


&НаСервере
Процедура СтрокаПоискаТоваровАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Если введено меньше 3 символов, поиск не запускаем для экономии ресурсов
    Если СтрДлина(Текст) < 3 Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.Наименование КАК Представление
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Наименование ПОДОБНО &ТекстПоиска";
    
    Запрос.УстановитьПараметр("ТекстПоиска", "%" + Текст + "%");
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        ДанныеВыбора = Новый СписокЗначений;
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

При таком подходе, как только пользователь начнет вводить текст, система будет предлагать список из 10 подходящих товаров. Выбор из этого списка автоматически заполнит поле ввода.

Способ 2. Реализация через событие «ИзменениеТекста»

Если нам нужно сделать интерфейс еще более динамичным (например, отображать дополнительные данные в списке: цену или остаток), проанализируем использование события ИзменениеТекста. В отличие от автоподбора, это событие срабатывает при каждом нажатии клавиши.

Важный нюанс: чтобы не «спамить» запросами к базе данных на каждую букву, рекомендуется использовать параметр Ожидание или проверять длину введенной строки. Для вывода кастомного списка мы будем использовать метод ПоказатьВыборИзСписка.

Рассмотрим пример реализации:


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

Способ 3. Полнотекстовый поиск (умный поиск)

Если база товаров огромная и нам нужно учитывать опечатки, морфологию или искать по свойствам (как на Wildberries), выясним причину, по которой обычный ПОДОБНО может не подойти. В таких случаях следует использовать встроенный механизм Полнотекстового поиска (ППД).

Метод ПолнотекстовыйПоиск.СоздатьСписок() позволяет искать данные с высокой скоростью. Выясним, как это работает программно:

  1. Система обращается к заранее построенному индексу.
  2. Метод возвращает коллекцию объектов, соответствующих запросу.
  3. Мы преобразуем эти данные в СписокЗначений для отображения пользователю.

Использование ППД позволяет находить «Молоко 3.2%», даже если пользователь ввел «малоко», при условии правильной настройки поискового индекса в конфигурации.

Работа с поиском внутри табличных частей

Если задача стоит именно в том, чтобы сделать поиск удобным при заполнении строк документа (внутри ТЧ), разберем следующие инструменты:

Подведем итоги

Мы выяснили, что «Строка поиска» у таблицы — это лишь инструмент фильтрации текущего экрана. Для создания настоящего поискового окна необходимо:

1. Использовать отдельный реквизит формы.
2. Обрабатывать событие АвтоПодбор для формирования списка подсказок.
3. При необходимости сложной логики (поиск по артикулу, бренду и остаткам одновременно) задействовать Запрос или ПолнотекстовыйПоиск на сервере.

Такой подход сделает работу пользователя с программой максимально комфортной и соответствующей современным стандартам веб-интерфейсов.

← На главную