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

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

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

В платформе 1С:Предприятие для элемента управления группы страниц отсутствует предопределенное событие вида ПередСменойСтраницы, в котором можно было бы установить параметр Отказ = Истина. Единственным штатным событием является ПриСменеСтраницы, срабатывающее уже после фактического переключения вкладки. Кроме того, установка свойства Доступность = Ложь для подчиненной страницы на десктопном клиенте блокирует клик по закладке, а в мобильном клиенте при жестовом управлении (свайпах) страница все равно может открываться для просмотра, блокируя лишь ввод внутри нее. Проанализируем корректные варианты обхода этих ограничений.

Вариант 1. Программный возврат на исходную страницу в событии ПриСменеСтраницы

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

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

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

Посмотрим на пример кода клиентского модуля формы:


&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
    Если ТекущаяСтраница = Элементы.Страница2 И НЕ ДействиеВыполнено Тогда
        // Возвращаем пользователя обратно на первую страницу
        Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Страница1;
        
        // Оповещаем о необходимости заполнения данных
        ПоказатьОповещениеПользователя("Внимание", , "Для перехода на следующую страницу сначала выполните действие на первой вкладке!");
    КонецЕсли;
КонецПроцедуры

Этот способ прост в реализации и сохраняет видимость структуры закладок для пользователя, при этом гарантируя возврат фокуса.

Вариант 2. Организация пошагового мастера (интерфейс «Визард»)

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

Разберем последовательность настройки формы:

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

Посмотрим на пример реализации логики перехода по кнопке:


&НаКлиенте
Процедура КомандаДалее(Команда)
    // Выполняем проверку корректности заполнения текущего шага
    Если НЕ ПроверитьЗаполнениеДанныхШага1() Тогда
        ПоказатьОповещениеПользователя("Ошибка валидации", , "Заполните все обязательные реквизиты!");
        Возврат;
    КонецЕсли;
    
    // Переключаем страницу программно
    Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Страница2;
КонецПроцедуры

&НаКлиенте
Функция ПроверитьЗаполнениеДанныхШага1()
    // Проверяем заполнение реквизитов формы
    Если ПустаяСтрока(Объект.Организация) Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Возврат Истина;
КонецФункции

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

Вариант 3. Динамическое управление видимостью страниц

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

Проанализируем пример управления доступностью и видимостью при изменении ключевых полей:


&НаКлиенте
Процедура РеквизитШага1ПриИзменении(Элемент)
    ОбновитьДоступностьВкладок();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДоступностьВкладок()
    УсловиеВыполнено = ЗначениеЗаполнено(Объект.ОсновнойРеквизит);
    
    // Включаем отображение страницы только при соблюдении условий
    Элементы.Страница2.Видимость = УсловиеВыполнено;
КонецПроцедуры

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

← На главную