Как настроить поиск и автоподбор данных при наборе текста в поле формы 1С?

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

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

Решение для обычных форм (1С 8.2 / Обычный интерфейс)

В обычных формах перехват ввода текста с клавиатуры и формирование индивидуального списка подстановки выполняется с помощью событий элемента формы АвтоПодборТекста и ОкончаниеВводаТекста.

Рассмотрим пример кода, в котором при наборе определенных символов переопределяется список подставляемых значений:


Процедура ПолеВвода1АвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
    Если Текст = "п" Тогда
        ТекстАвтоПодбора = "пункт";
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Процедура ПолеВвода1ОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
    Если Элемент = ЭлементыФормы.ПолеВвода1 Тогда
        Если Текст = "одежда" Тогда
            Значение = Новый СписокЗначений();
            Значение.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Рубашка"));
            Значение.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Брюки"));
            СтандартнаяОбработка = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В данном случае сброс флага СтандартнаяОбработка = Ложь отключает стандартный алгоритм поиска платформы и подставляет сформированный вручную СписокЗначений.

Решение для управляемых форм (1С 8.3 / Управляемый интерфейс)

В управляемом приложении сигнатура процедур и механизмы работы с данными отличаются. Попытка перенести код из обычных форм напрямую вызовет ошибку или выведет надпись «Нет в списке».

Выясним причину этой ошибки: в управляемых формах параметр Значение отсутствует, а вместо него используется параметр ДанныеВыбора. Кроме того, если реквизит имеет ссылочный тип (например, СправочникСсылка.Сотрудники), передавать в ДанныеВыбора нужно список ссылок на элементы базы данных, а не обычные текстовые строки.

Посмотрим, какие параметры принимает обработчик события в управляемой форме:


&НаКлиенте
Процедура ПолеВводаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    
    // Отключаем стандартный поиск платформы
    СтандартнаяОбработка = Ложь;
    
    // Получаем сформированный список значений с сервера
    ДанныеВыбора = ПолучитьСписокДляВыбораНаСервере(Текст);

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

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

КонецФункции

Также при кастомизации ввода текста в управляемых формах рекомендуется перехватывать событие ИзменениеТекстаРедактирования и отключать в нем СтандартнаяОбработка = Ложь, чтобы платформенный автоподбор не перекрывал пользовательские данные.

Штатные декларативные способы ограничения выбора

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

  1. Свойство ПараметрыВыбора: В палитре свойств элемента формы или реквизита объекта можно настроить фиксированный отбор (например, Отбор.Родитель или Отбор.ВидЗанятости). Платформа автоматически применит отбор как при поиске по строке, так и при открытии формы выбора.
  2. Свойство СвязиПараметровВыбора: Используется, когда отбор зависит от другого реквизита на форме (например, фильтрация номенклатуры по выбранной группе или сотрудников по организации).
  3. Обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера: Позволяет на уровне модуля справочника переопределить логику формирования списка подбора при вводе строки. В параметры процедуры передается введенная строка Параметры.СтрокаПоиска, а в ДанныеВыбора возвращается список ссылок.

Важно следить за тем, чтобы у элемента формы не стоял флаг РежимВыбораИзСписка = Истина, если список выбора не зафиксирован заранее в свойстве СписокВыбора, иначе платформа будет блокировать ввод значений, отсутствующих в этом списке.

← На главную