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

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

В процессе разработки на платформе 1С часто возникают ситуации, когда необходимо предоставить пользователю возможность выбирать данные из нескольких типов — например, справочники или документы. Мы настраиваем ПолеВвода с составным типом данных, но сталкиваемся с технической трудностью: как именно программно зафиксировать, какой именно тип выбрал пользователь в диалоговом окне выбора типов?

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

Понимание природы события выбора

Важно уяснить принципиальную разницу: выбор типа — это не то же самое, что выбор значения. Когда пользователь нажимает кнопку выбора в пустом поле с составным типом, он инициирует процесс настройки структуры самого поля. В этот момент конкретное значение еще не выбрано (поле может содержать Неопределено).

Событие ОбработкаВыбора, на которое многие разработчики возлагают надежды, срабатывает только тогда, когда мы выбираем конкретный объект (ссылку). Если же мы только меняем «режим» поля, выбирая, что в нем можно хранить, это событие не вызывается. Поэтому нам необходимо переключить внимание на другие механизмы.

Использование события «ПриИзменении»

Наиболее надежным способом отследить факт того, что тип данных в поле был изменен (или выбран), является событие ПриИзменении. Рассмотрим, как программно определить, что именно сейчас находится в поле.

Когда пользователь выбирает тип, а затем (или одновременно) задает значение, или просто переключает тип для пустого поля, мы можем проанализировать содержимое через функцию ТипЗнч(). Давайте проанализируем пример кода для обработки этой ситуации:


&НаКлиенте
Процедура МоеПолеПриИзменении(Элемент)
    ТекущееЗначение = Элемент.Значение;
    Если ТекущееЗначение = Неопределено Тогда
        // Пользователь очистил поле или сбросил выбор
        Возврат;
    КонецЕсли;

    ВыбранныйТип = ТипЗнч(ТекущееЗначение);
    Сообщить("Выбран тип: " + Строка(ВыбранныйТип));
    
    // Дальнейшая логика обработки
КонецПроцедуры

Нюансы работы с составными типами

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

Если ваша задача — принудительно задать тип, который может выбрать пользователь, воспользуйтесь программным управлением свойством ОграничениеТипа:

  1. Создайте объект ОписаниеТипов, включив в него необходимые вам типы данных.
  2. Присвойте этот объект свойству ОграничениеТипа вашего элемента формы.
  3. Помните, что ПривестиЗначение() поможет вам программно «загнать» данные в нужный формат, если это требуется бизнес-логикой.

Рекомендации по реализации

Для корректной работы с выбором типа следуйте этим правилам:

  1. Анализируйте тип только после изменения данных: Используйте ПриИзменении, так как оно срабатывает гарантированно после того, как значение или тип поля были зафиксированы платформой.
  2. Проверяйте на «Неопределено»: Всегда учитывайте, что пользователь может нажать кнопку очистки или просто сменить тип, оставив значение пустым. Проверка ТекущееЗначение = Неопределено убережет ваш код от ошибок исполнения.
  3. Используйте ТипЗнч(): Это наиболее простой и эффективный способ получить метаданные о том, какой тип объекта сейчас «лежит» в реквизите.

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

← На главную