При разработке интерфейсов диалоговых форм в платформе 1С:Предприятие 7.7 нередко возникает задача организовать выбор взаимоисключающих опций. Например, требуется, чтобы при установке одного флажка второй автоматически снимался, либо чтобы пользователь мог оставить оба флажка выключенными. Рассмотрим несколько способов решения этой задачи: от лаконичных формул в свойствах элементов диалога до создания процедур-обработчиков и использования классических групп переключателей.
Проанализируем самый быстрый и компактный вариант, не требующий написания объемных процедур в модуле формы. В платформе 1С 7.7 у элементов управления типа «Флажок» есть свойство «Формула», код в котором выполняется при интерактивном нажатии на элемент.
Разберем по шагам, как настроить два взаимоисключающих флажка с именами Флажок1 и Флажок2:
Флажок1 и в поле «Формула» прописываем выражение сброса второго флага: Флажок2 = 0.Флажок2 и в поле «Формула» прописываем: Флажок1 = 0.В результате при установке первого флажка второй автоматически сбрасывается в 0, и наоборот. Если же пользователь повторно нажимает на уже активный флажок, тот снимается, что позволяет оставить оба флага выключенными. Программное изменение значения переменной не вызывает формулу связанного элемента повторно, поэтому зацикливания не происходит.
Рассмотрим более масштабируемый подход, который подходит для группы из трех и более флажков либо в случаях, когда при переключении необходимо выполнять дополнительную логику (например, блокировать другие реквизиты или менять печатную форму).
Создадим в модуле формы процедуру, принимающую номер или имя активированного флага в качестве параметра:
Процедура ПриВыбореФлага(НомерФлага)
Если НомерФлага = 1 Тогда
Если флФлаг1 = 1 Тогда
флФлаг2 = 0;
флФлаг3 = 0;
КонецЕсли;
ИначеЕсли НомерФлага = 2 Тогда
Если флФлаг2 = 1 Тогда
флФлаг1 = 0;
флФлаг3 = 0;
КонецЕсли;
ИначеЕсли НомерФлага = 3 Тогда
Если флФлаг3 = 1 Тогда
флФлаг1 = 0;
флФлаг2 = 0;
КонецЕсли;
КонецЕсли;
// При необходимости принудительно перерисовываем форму
Форма.Обновить();
КонецПроцедуры
В свойствах каждого флажка на форме в поле «Формула» прописываем вызов процедуры с соответствующим параметром:
флФлаг1: ПриВыбореФлага(1)флФлаг2: ПриВыбореФлага(2)флФлаг3: ПриВыбореФлага(3)Передача явного параметра через формулу надежнее, чем использование функции Форма.АктивныйЭлемент(), так как при быстром клике мыши фокус ввода может не успеть переключиться до старта выполнения кода.
Для ситуации, когда выбор одного из множества вариантов строго обязателен, можно применить компактную векторную установку через тернарный оператор ?():
Процедура ПриВыбореВарианта(НомерВарианта)
Вариант1 = ?(НомерВарианта = 1, 1, 0);
Вариант2 = ?(НомерВарианта = 2, 1, 0);
Вариант3 = ?(НомерВарианта = 3, 1, 0);
КонецПроцедуры
Выясним причину, почему классические переключатели часто вызывают сложности у разработчиков в 1С 7.7. Группировка радиокнопок работает не по их геометрическому расположению на форме, а строго на основе порядка обхода элементов диалога (Tab Order).
Разберем по шагам правильную настройку группы переключателей:
ВыбВариант) и устанавливаем флаг «Первый в группе».При выборе первого положения переменная ВыбВариант принимает значение 1, при выборе второго — 2 и так далее. Если требуется полностью отключить все переключатели группы, достаточно программно присвоить переменной значение 0:
// Сброс всех положений группы переключателей
ВыбВариант = 0;
Если вариантов выбора много или список формируется динамически, вместо создания множества флажков можно использовать другие стандартные элементы 1С 7.7:
Shift + F4.Таким образом, для простых бинарных переключений с возможностью полного снятия выбора оптимально подходит назначение формул сброса в свойствах флажков, а для жесткого взаимоисключающего выбора — штатная группа переключателей с настроенным порядком обхода.