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

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

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

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

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

Решение через событие НачалоВыбора

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

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

Давайте проанализируем практический пример кода, который позволяет реализовать данную задачу:


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

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

Как правильно установить отбор в форме выбора

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


Процедура ВыбратьОбъектУчетаНажатие(Элемент)
    // Получаем форму выбора конкретного справочника
    ФормаСписка = Справочники.ОбъектыУчетаСтороннихОрганизаций.ПолучитьФормуВыбора(, ЭтаФорма);
    
    // Устанавливаем необходимый отбор
    // Например, отбираем элементы по владельцу
    ФормаСписка.Отбор.Владелец.Установить(Контрагент, Истина);
    
    // Открываем форму для выбора
    Значение = ФормаСписка.ОткрытьМодально();
    
    // Если пользователь выбрал значение, присваиваем его в реквизит
    Если Значение <> Неопределено Тогда
        Элемент.Значение = Значение;
    КонецЕсли;
КонецПроцедуры

Почему важно не отключать стандартную обработку без необходимости

Многие разработчики стремятся сразу установить СтандартнаяОбработка = Ложь во всех событиях. Однако важно помнить: если вы отключаете стандартное поведение, вы берете на себя ответственность за реализацию всех стандартных функций системы: истории выбора, контекстного поиска и работы с типами. Если задача простая и не требует сложного отбора, лучше довериться платформе.

Используйте НачалоВыбора только тогда, когда вам нужно динамически влиять на условия отбора в зависимости от других данных формы. Это делает код более читаемым, а пользовательский интерфейс — предсказуемым. Всегда проверяйте ТипЗнч для того, чтобы корректно обрабатывать ситуацию, когда пользователь меняет тип значения прямо в поле ввода, если интерфейс это позволяет.

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

← На главную