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