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

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

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

Понимание проблемы

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

Способ 1: Использование обработчика события «АвтоПодбор» в форме

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

Разберем реализацию по шагам:

  1. Откройте форму, на которой расположен реквизит.
  2. Перейдите к свойствам элемента формы и найдите событие АвтоПодбор.
  3. Создайте обработчик события на клиенте и добавьте в него логику отключения стандартной обработки.

Пример программного кода для реализации:


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

Важно помнить, что функция ПоискСотрудникаПоТексту должна выполняться на сервере и возвращать массив ссылок. В ней вы можете добавить жесткое условие: ГДЕ ПометкаУдаления = ЛОЖЬ.

Способ 2: Настройка в модуле менеджера справочника

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

В этом событии вы можете:

Разберем логику формирования запроса:


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

Рекомендации по реализации

Чтобы ваша система работала быстро и надежно, придерживайтесь следующих правил:

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

← На главную