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