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