Почему при автоподборе очищается введенный текст в поле формы 1С и как это исправить

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

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

Причины сброса текста при формировании списка выбора

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

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

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


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

&НаСервереБезКонтекста
Функция ПолучитьДанныеВыбораНаСервере(Знач СтрокаПоиска, Знач СписокВидовНоменклатуры, Знач Исполнитель)
    Отбор = Новый Структура;
    Отбор.Вставить("СписокВидовНоменклатуры", СписокВидовНоменклатуры);
    Отбор.Вставить("Исполнитель", Исполнитель);
    
    Параметры = Новый Структура;
    Параметры.Вставить("Отбор", Отбор);
    Параметры.Вставить("СтрокаПоиска", СтрокаПоиска);
    
    Возврат Справочники.Номенклатура.ПолучитьДанныеВыбора(Параметры);
КонецФункции

Способ 1. Изменение свойства «ОбновлениеТекстаРедактирования»

Самое быстрое и прямое решение проблемы в рамках существующего кода на форме — отключить автоматическую синхронизацию вводимого текста с выпадающим списком.

  1. Откроем форму в конфигураторе и выделим проблемное поле ввода.
  2. В палитре свойств найдем группу свойств Использование и параметр ОбновлениеТекстаРедактирования (или Обновление текста при редактировании).
  3. Установим для этого свойства значение Не использовать (РежимОбновленияТекстаРедактирования.НеИспользовать).

В этом режиме платформа перестает принудительно перезаписывать введенную пользователем строку представлениями найденных объектов при перерисовке выпадающего списка, и набранный текст (например, "137") остается в поле в неизменном виде.

Способ 2. Перенос логики фильтрации в модуль менеджера объекта (Рекомендуемый подход)

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

Рассмотрим, как реализовать этот подход. На форме полностью очищаем или удаляем клиентский обработчик АвтоПодбор, а в модуль менеджера справочника (например, Справочник.Номенклатура) добавляем процедуру:


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

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

При таком подходе платформа самостоятельно управляет асинхронными запросами к серверу, сохраняет набранный текст в поле ввода, контролирует фокус и минимизирует объем передаваемых данных по сети.

Способ 3. Использование связей и параметров выбора в свойствах поля

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

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

Важное примечание: при программном заполнении списка через событие АвтоПодбор всегда рекомендуется проверять минимальную длину набранной строки с помощью условия СтрДлина(СокрЛП(Текст)) >= 3, чтобы не перегружать сервер пустыми выборками при начале ввода.

← На главную