Как реализовать взаимоисключающие флажки или настроить переключатели на форме в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Способ 1. Прямой сброс через свойство «Формула» элементов формы

Проанализируем самый быстрый и компактный вариант, не требующий написания объемных процедур в модуле формы. В платформе 1С 7.7 у элементов управления типа «Флажок» есть свойство «Формула», код в котором выполняется при интерактивном нажатии на элемент.

Разберем по шагам, как настроить два взаимоисключающих флажка с именами Флажок1 и Флажок2:

  1. Открываем свойства элемента диалога Флажок1 и в поле «Формула» прописываем выражение сброса второго флага: Флажок2 = 0.
  2. Открываем свойства элемента диалога Флажок2 и в поле «Формула» прописываем: Флажок1 = 0.

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

Способ 2. Централизованная процедура обработки событий флажков

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

Создадим в модуле формы процедуру, принимающую номер или имя активированного флага в качестве параметра:


Процедура ПриВыбореФлага(НомерФлага)
    Если НомерФлага = 1 Тогда
        Если флФлаг1 = 1 Тогда
            флФлаг2 = 0;
            флФлаг3 = 0;
        КонецЕсли;
    ИначеЕсли НомерФлага = 2 Тогда
        Если флФлаг2 = 1 Тогда
            флФлаг1 = 0;
            флФлаг3 = 0;
        КонецЕсли;
    ИначеЕсли НомерФлага = 3 Тогда
        Если флФлаг3 = 1 Тогда
            флФлаг1 = 0;
            флФлаг2 = 0;
        КонецЕсли;
    КонецЕсли;
    
    // При необходимости принудительно перерисовываем форму
    Форма.Обновить();
КонецПроцедуры

В свойствах каждого флажка на форме в поле «Формула» прописываем вызов процедуры с соответствующим параметром:

  1. Для флФлаг1: ПриВыбореФлага(1)
  2. Для флФлаг2: ПриВыбореФлага(2)
  3. Для флФлаг3: ПриВыбореФлага(3)

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

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


Процедура ПриВыбореВарианта(НомерВарианта)
    Вариант1 = ?(НомерВарианта = 1, 1, 0);
    Вариант2 = ?(НомерВарианта = 2, 1, 0);
    Вариант3 = ?(НомерВарианта = 3, 1, 0);
КонецПроцедуры

Способ 3. Использование штатных групп переключателей (Radio buttons)

Выясним причину, почему классические переключатели часто вызывают сложности у разработчиков в 1С 7.7. Группировка радиокнопок работает не по их геометрическому расположению на форме, а строго на основе порядка обхода элементов диалога (Tab Order).

Разберем по шагам правильную настройку группы переключателей:

  1. Размещаем на форме необходимое количество элементов типа «Переключатель».
  2. Настраиваем порядок обхода диалога так, чтобы элементы переключателя следовали в списке строго друг за другом без посторонних элементов между ними.
  3. Открываем свойства самого первого переключателя в этой цепочке: указываем ему имя переменной (например, ВыбВариант) и устанавливаем флаг «Первый в группе».
  4. Остальным переключателям группы идентификатор (имя переменной) не задаем, флаг «Первый в группе» для них должен быть снят.

При выборе первого положения переменная ВыбВариант принимает значение 1, при выборе второго — 2 и так далее. Если требуется полностью отключить все переключатели группы, достаточно программно присвоить переменной значение 0:


// Сброс всех положений группы переключателей
ВыбВариант = 0;

Способ 4. Альтернативные варианты интерфейса

Если вариантов выбора много или список формируется динамически, вместо создания множества флажков можно использовать другие стандартные элементы 1С 7.7:

  1. Поле со списком (комбобокс): выпадающий список со строковыми или ссылочными значениями, в котором также предусмотрена пустая строка для отмены выбора. Очистить поле пользователь может нажатием комбинации клавиш Shift + F4.
  2. Элемент управления «СписокЗначений»: список с включенными пометками. В формуле списка можно программно снимать пометки со всех строк, кроме текущей, организуя режим одиночного выбора.

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

← На главную