Как сделать, чтобы поле справочника автоматически выбирало запись при вводе без показа списка выбора?

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

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

Использование обработчика ОбработкаПолученияДанныхВыбора

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

Разберем по шагам, как реализовать этот подход:

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

Посмотрим на пример реализации кода:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    // Отключаем стандартный алгоритм поиска
    СтандартнаяОбработка = Ложь;
    
    // Создаем свой список значений
    Список = Новый СписокЗначений;
    
    // Выполняем поиск по введенной пользователем строке
    НайденнаяСсылка = Справочники.АГ_НомераИсполнителей.НайтиПоНаименованию(Параметры.СтрокаПоиска);
    
    // Если элемент найден, добавляем его в список
    Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
        Список.Добавить(НайденнаяСсылка);
    КонецЕсли;
    
    // Передаем наш список в параметр ДанныеВыбора
    ДанныеВыбора = Список;
КонецПроцедуры

Почему возникают проблемы с поиском (например, «9» и «999»)?

Иногда при использовании НайтиПоНаименованию платформа ведет себя непредсказуемо. Это происходит потому, что встроенные механизмы 1С пытаются выполнить «нечеткий» поиск. Если в базе есть похожие записи, система может подставить наиболее вероятный, по ее мнению, вариант.

Чтобы избежать такой «мистики», рекомендуем следовать правилам:

Альтернативный вариант: событие ОкончаниеВводаТекста

Если вам нужно, чтобы выбор срабатывал именно после нажатия клавиши Enter или при потере фокуса полем, можно использовать клиентское событие ОкончаниеВводаТекста. Это полезно, когда пользователь сканирует штрихкод, который автоматически дополняется символом переноса строки.

Рассмотрим пример кода для формы:


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

Практические советы для стабильной работы

Для того чтобы система работала как часы, проанализируем настройки элемента формы:

  1. Установите свойство РежимВыбораИзСписка в значение Истина. Это заставит платформу игнорировать попытки «догадок» и использовать только тот список, который вы подготовили вручную.
  2. Если вы используете сканер штрихкодов, старайтесь обрабатывать данные через ВнешнееСобытие. Это позволит избежать накладок с «окончанием ввода», так как код сработает непосредственно в момент поступления данных от сканера.
  3. Всегда проверяйте результат поиска на ЗначениеЗаполнено(), чтобы избежать передачи пустых ссылок в поле, что может привести к ошибкам в дальнейшей логике документа или формы.

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

← На главную