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