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