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