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

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

При разработке и доработке документов часто возникает задача ограничить выбор элементов справочника — например, запретить пользователю выбирать контрагентов или номенклатуру, помеченные на удаление. Разработчики часто пытаются решить эту задачу через событие НачалоВыбора поля ввода, однако созданная форма либо открывается без отбора, либо выбранное значение не возвращается обратно в документ. Разберем детально, почему это происходит и как правильно организовать выбор данных как в обычных, так и в управляемых формах.

Почему не работает отбор в событии НачалоВыбора: типичные ошибки

Проанализируем типовую ситуацию: в коде обработчика события НачалоВыбора создается форма выбора и накладывается отбор на реквизит ПометкаУдаления, но список по-прежнему отображает все записи. Выясним главные причины такого поведения:

  1. Не отключена стандартная обработка: Параметр СтандартнаяОбработка по умолчанию равен Истина. Если не присвоить ему Ложь, платформа проигнорирует созданную в коде форму и откроет штатную системную форму без каких-либо фильтров.
  2. Не указан владелец формы выбора: При программном получении формы через ПолучитьФормуВыбора вторым параметром необходимо передавать элемент управления (поле ввода). Без указания владельца форма не знает, куда именно вернуть выбранное значение после двойного клика или нажатия кнопки «Выбрать».
  3. Форма открыта в режиме просмотра: Если открывается произвольная форма списка вместо специализированной формы выбора, ее свойство РежимВыбора может быть установлено в Ложь, что блокирует возвращение результата.

Решение для обычных форм (толстый клиент)

Рассмотрим рекомендуемый и наиболее надежный способ переопределения формы выбора в обычном приложении. Для автоматической подстановки выбранного контрагента в реквизит документа передадим ссылку на элемент управления (параметр Элемент) вторым аргументом метода ПолучитьФормуВыбора.

Посмотрим на пример кода в модуле формы документа:


Процедура КонтрагентНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // 1. Обязательно отключаем штатное открытие формы платформой
    СтандартнаяОбработка = Ложь;
    
    // 2. Получаем форму выбора, указывая текущий элемент в качестве владельца
    ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора("ФормаВыбора", Элемент);
    
    // 3. Устанавливаем параметры отбора
    ФормаВыбора.Отбор.ПометкаУдаления.Значение = Ложь;
    ФормаВыбора.Отбор.ПометкаУдаления.Использование = Истина;
    ФормаВыбора.Отбор.ПометкаУдаления.ВидСравнения = ВидСравнения.Равно;
    
    // 4. Позиционируем список на уже выбранном значении (при наличии)
    ФормаВыбора.НачальноеЗначениеВыбора = Элемент.Значение;
    
    // 5. Открываем форму в обычном режиме
    ФормаВыбора.Открыть();
    
КонецПроцедуры

Если требуется выполнить дополнительную обработку выбранного значения (например, заполнить связанные реквизиты, перезаполнить договор или выполнить пересчет сумм), в качестве владельца формы выбора можно передать саму форму документа (ЭтаФорма). В этом случае результат выбора будет перехвачен в процедуре ОбработкаВыбора(ЗначениеВыбора, ИсточникВыбора) формы документа.

Решение для управляемых форм (тонкий клиент)

В управляемом интерфейсе прямое обращение к свойству Отбор динамического списка формы недоступно на клиенте. Рассмотрим два способа реализации фильтрации.

Способ 1. Программное открытие через метод ОткрытьФорму

В обработчике события НачалоВыбора сформируем структуру параметров формы и передадим поле ввода третьим аргументом для автоматического помещения результата:


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

Способ 2. Использование свойства «Параметры выбора» элемента формы

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ПометкаУдаления", Ложь));
    
    Элементы.Контрагент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
    
КонецПроцедуры

Ограничение автоподбора и ввода по строке

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

Чтобы исключить удаленные элементы из быстрого поиска глобально по всей конфигурации, переопределим обработчик в модуле менеджера справочника:


// Модуль менеджера справочника Контрагенты
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
    
КонецПроцедуры

Такой подход обеспечивает комплексную фильтрацию данных как в интерактивных формах выбора, так и при контекстном вводе с клавиатуры.

← На главную