Как программно сделать недоступным отдельный пункт переключателя на управляемой форме 1С?

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

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

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

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

Проанализируем архитектуру элемента управления в управляемом интерфейсе:

  1. Элемент формы с видом Поле переключателя или Тумблер является единым неделимым элементом интерфейса.
  2. Набором доступных вариантов управляет коллекция СписокЗначений (свойство СписокВыбора).
  3. У объекта ЭлементСпискаЗначений отсутствует свойство Доступность. Задать свойство Доступность = Ложь платформа позволяет только для элемента формы целиком.

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

Способ 1. Создание нескольких элементов формы под один реквизит

Разберем основной и наиболее корректный способ, позволяющий сохранить стандартный визуальный вид переключателя (радиокнопки) с неактивными пунктами.

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

  1. В дереве элементов формы создаем группу без отображения (свойство Вид = ГруппаБезОтображения) и задаем ей группировку Горизонтальная или Вертикальная.
  2. Внутрь созданной группы добавляем несколько элементов с видом Поле переключателя (например, ПереключательВариант1, ПереключательВариант2, ПереключательВариант3).
  3. Для каждого из этих элементов указываем один и тот же реквизит формы в свойстве ПутьКДанным.
  4. В свойстве СписокВыбора каждого элемента оставляем ровно по одному значению, соответствующему нужному варианту.

Теперь каждый вариант выбора представляет собой самостоятельный элемент формы, и мы можем напрямую управлять его доступностью в программном коде модуля формы:


&НаКлиенте
Процедура УправлениеДоступностьюВариантов()

    // Блокируем второй вариант при определенном условии
    Если УсловиеБлокировки Тогда
        Элементы.ПереключательВариант2.Доступность = Ложь;
        
        // Если заблокированный вариант уже был выбран, переключаем на разрешенный
        Если Объект.РеквизитПереключателя = 2 Тогда
            Объект.РеквизитПереключателя = 1;
        КонецЕсли;
    Иначе
        Элементы.ПереключательВариант2.Доступность = Истина;
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Программный контроль в событии ПриИзменении

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

Разберем алгоритм реализации:

  1. В модуле формы заводим переменную или реквизит формы для хранения предыдущего корректного значения (например, ПредыдущееЗначениеПереключателя).
  2. Для заблокированного пункта программно меняем представление в СписокВыбора, добавляя суффикс (недоступно).
  3. В обработчике события ПриИзменении переключателя анализируем выбранный пункт.

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


&НаКлиенте
Процедура РеквизитПереключательПриИзменении(Элемент)

    Если Объект.РеквизитПереключатель = ЗапрещенноеЗначение Тогда
        ПоказатьПредупреждение(, "Выбранный вариант недоступен для выбора в текущем режиме.");
        
        // Возвращаем предыдущее допустимое значение
        Объект.РеквизитПереключатель = ПредыдущееЗначениеПереключателя;
    Иначе
        // Фиксируем новое валидное значение
        ПредыдущееЗначениеПереключателя = Объект.РеквизитПереключатель;
    КонецЕсли;

КонецПроцедуры

Альтернативные варианты интерфейса

Если переключатель не является жестким требованием макета, рассмотрим альтернативные элементы управления:

  1. Группа кнопок командной панели: создаем группу кнопок, привязанных к командам формы. Для визуализации выбора используем свойство кнопки Пометка = Истина, а для блокировки конкретной кнопки применяем Элементы.ИмяКнопки.Доступность = Ложь.
  2. Поле ввода со списком выбора: устанавливаем свойство РежимВыбораИзСписка = Истина. При динамическом изменении СпискаВыбора ранее выбранное значение остается видимым в поле, но исключается из выпадающего списка.
← На главную