Почему в автоподборе 1С появляются значения, которых нет в ДанныеВыбора?

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

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

Причина 1: История выбора при вводе

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

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

Причина 2: Игнорирование события АвтоПодбор

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

Разберем, как правильно переопределить поведение платформы. Мы должны сообщить системе, что стандартная логика нам не подходит, и передать свой список значений.

Реализация надежного автоподбора

Для того чтобы список выбора был консистентным, рекомендуется реализовать логику, которая принудительно устанавливает СтандартнаяОбработка = Ложь. Рассмотрим пример того, как это сделать правильно:

Шаг 1: Подготовка данных на сервере

Сначала напишем функцию для получения отфильтрованных данных. Важно использовать Запрос, чтобы сразу отсечь помеченные на удаление или неактуальные архивные объекты.


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

Шаг 2: Обработка события на клиенте

Теперь подключим эту функцию к событию элемента АвтоПодбор. Обратите внимание, что важно проверять, не является ли текст пустым, чтобы не перегружать систему лишними запросами.


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

Использование параметров выбора для жесткой фильтрации

В некоторых версиях платформы события АвтоПодбор могут вести себя нестабильно (особенно при переходе между формами элемента и формами списка). В таких случаях надежным решением является комбинация программного отключения стандартной обработки и установка ПараметровВыбора.

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


// Пример установки жесткого отбора
МассивСсылок = ПолучитьМассивДоступныхСсылок(Текст);
ПараметрВыбора = Новый ПараметрВыбора("Отбор.Ссылка", МассивСсылок);
мПараметры = Новый Массив;
мПараметры.Добавить(ПараметрВыбора);
Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(мПараметры);

Итоги и рекомендации

  1. Всегда проверяйте свойство ИсторияВыбораПриВводе (в этом поможет анализ конфигурации на ошибки) — это первая причина появления неожиданных данных.
  2. Для жесткой фильтрации используйте связку СтандартнаяОбработка = Ложь и ДанныеВыбора = ВашСписок.
  3. Если логика выборки сложная (как, например, флажок в динамическом списке), дублируйте логику фильтрации как в событии АвтоПодбор, так и в НачалоВыбора, чтобы пользователь получал одинаковый набор данных при любом сценарии взаимодействия.
  4. Используйте ПараметрыВыбора и методы доработки динамических списков для делегирования части логики самой платформе — это повышает производительность и стабильность кода.

Следуя этим правилам, вы сможете добиться идеальной работы автоподбора и избежать появления «фантомных» элементов в интерфейсе вашего приложения.

← На главную