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