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

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

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

Разберем, почему возникает такая проблема, как правильно инициализировать реквизит формы и в чем заключается главная ошибка при работе с элементами управления.

Причина ошибки и различие между реквизитом и элементом формы

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


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));

Ограничение = Новый ОписаниеТипов(МассивТипов);
ЭлементыФормы.ИсточникВыплат.ОграничениеТипа = Ограничение;

// Ошибка: попытка записи в элемент формы!
ЭлементыФормы.ИсточникВыплат = Справочники.ФизическиеЛица.ПустаяСсылка();

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

Решение 1: Прямое присвоение пустой ссылки реквизиту

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

Рассмотрим правильный вариант кода для обычных форм:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));

// 1. Ограничиваем список типов для элемента управления
ОписаниеОграничения = Новый ОписаниеТипов(МассивТипов);
ЭлементыФормы.ИсточникВыплат.ОграничениеТипа = ОписаниеОграничения;

// 2. Записываем пустую ссылку в РЕКВИЗИТ формы (без 'ЭлементыФормы.')
ИсточникВыплат = Справочники.ФизическиеЛица.ПустаяСсылка();

Решение 2: Использование метода ПривестиЗначение() и отключение выбора типа

Выясним более универсальный способ, который позволяет обнулить или задать тип реквизита с помощью метода ПривестиЗначение() объекта ОписаниеТипов. Этот метод автоматически преобразует текущее значение (включая Неопределено) к первому допустимому типу из описания.

Также важно учесть поведение формы при очистке поля кнопкой «крестик». Если пользователь очистит поле, его значение снова станет Неопределено. Чтобы избежать повторного появления окна выбора типа, необходимо отключить свойство ВыбиратьТип.

Разберем по шагам создание такой логики:

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

МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));

ОписаниеОграничения = Новый ОписаниеТипов(МассивТипов);

// Задаем ограничение типа для элемента формы
ЭлементыФормы.ИсточникВыплат.ОграничениеТипа = ОписаниеОграничения;

// Запрещаем платформе показывать диалог выбора типа при очистке поля
ЭлементыФормы.ИсточникВыплат.ВыбиратьТип = Ложь;

// Приводим реквизит к первому типу из ОписанияТипов
ИсточникВыплат = ОписаниеОграничения.ПривестиЗначение(ИсточникВыплат);

Особенности для управляемых форм

Если аналогичная задача решается на управляемых формах, принципы остаются теми же, но меняется синтаксис обращения к элементам и серверным контекстам:


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

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

← На главную