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

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

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

Многие разработчики пытаются решить эту задачу привычным способом — вызовом функции СтатусВозврата(0) внутри процедуры-формулы элемента диалога. Однако переключатель всё равно визуально и программно меняет свое значение. Разберем по шагам, почему так происходит и как правильно организовать возврат к предыдущему значению.

Почему СтатусВозврата(0) не работает в формуле элемента управления

Проанализируем механику работы события и функции СтатусВозврата() в платформе 1С 7.7:

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

Решение: Программное восстановление предыдущего значения

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

Рассмотрим подробнее реализацию этого алгоритма по шагам:

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

Посмотрим на пример реализации в модуле формы:


Пере ПрежнееЗначениеПереключателя;

Процедура ПриОткрытии()
    // Фиксируем исходное состояние переключателя при открытии формы
    ПрежнееЗначениеПереключателя = ВыбПереключатель;
КонецПроцедуры

Процедура ПриИзмененииПереключателя()
    // Если значение не поменялось, ничего не делаем
    Если ВыбПереключатель = ПрежнееЗначениеПереключателя Тогда
        Возврат;
    КонецЕсли;
    
    // Задаем вопрос или проверяем условие выполнения операции
    Если Вопрос("Смена режима приведет к очистке данных. Продолжить?", "Да+Нет") = "Нет" Тогда
        // Пользователь отказался: возвращаем старое значение
        ВыбПереключатель = ПрежнееЗначениеПереключателя;
        
        // Принудительно обновляем элементы диалога
        Форма.Обновить(0);
        Возврат;
    КонецЕсли;
    
    // Если пользователь согласился — выполняем операцию и запоминаем новое значение
    ОчиститьДанные();
    ПрежнееЗначениеПереключателя = ВыбПереключатель;
КонецПроцедуры

Особенности визуального обновления и фокуса

Выясним причину, почему после программного присвоения значения рекомендуется вызывать Форма.Обновить(0):

В некоторых конфигурациях и релизах платформы 7.7 при программной смене значения переменной диалога графический фокус (пунктирная рамка или точка выбора радиокнопки) может остаться на отклоненном элементе до следующего клика мыши. Вызов Форма.Обновить(0) гарантирует немедленную синхронизацию визуального отображения переключателей диалога с фактическими значениями переменных.

Если после отмены переключения требуется дополнительно вернуть фокус ввода на конкретный элемент, используем метод формы Форма.Активизировать("ИмяРеквизита").

Альтернативный подход: Управление доступностью

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


// Блокируем элемент управления, чтобы исключить случайное нажатие
Форма.ВыбПереключатель.Доступность(0);

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

← На главную