Как программно переключить страницу на управляемой форме в 1С и почему не срабатывает событие ПриСменеСтраницы?

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

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

Особенности события ПриСменеСтраницы

Главная архитектурная особенность события ПриСменеСтраницы заключается в том, что платформа 1С вызывает его исключительно при интерактивном переключении вкладок пользователем (кликом мыши или переходом с клавиатуры).

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

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

Посмотрим на пример правильной организации кода при программной смене страницы:


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

&НаКлиенте
Процедура ПанельОрганизацииПриСменеСтраницы(Элемент, ТекущаяСтраница)
    // Обработчик интерактивного клика пользователем
    ОбновитьДанныеТекущейСтраницы(ТекущаяСтраница);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеТекущейСтраницы(ВыбраннаяСтраница)
    УстановитьОтборПоОрганизации(ВыбраннаяСтраница);
КонецПроцедуры

Правильное обращение к элементам страниц

Рассмотрим, как правильно адресовать страницу в программном коде. В управляемых формах все элементы формы (включая группы, страницы и подчиненные поля) доступны напрямую через коллекцию Элементы. Конструкция вида Элементы.Панель.ПодчиненныеЭлементы.ИмяСтраницы является избыточной.

Сравним синтаксис:


// Рекомендуемый и наиболее лаконичный вариант:
Элементы.ПанельОрганизации.ТекущаяСтраница = Элементы.Организация2;

// Избыточный вариант (хотя и рабочий в некоторых контекстах):
// Элементы.ПанельОрганизации.ТекущаяСтраница = Элементы.ПанельОрганизации.ПодчиненныеЭлементы.Организация2;

Где и как устанавливать начальную страницу при открытии формы

Проанализируем сценарий, когда определенную страницу необходимо сделать активной сразу при открытии формы (например, в зависимости от прав доступа или переданных параметров):

  1. Установка на сервере в ПриСозданииНаСервере: Это наиболее надежный и производительный способ. Форма сразу формируется с нужной активной страницей, исключая мерцание интерфейса на клиенте и избавляя от необходимости использовать искусственные обработчики ожидания.
  2. Установка на клиенте в ПриОткрытии: Если выбор страницы зависит от клиентских данных или диалогов с пользователем, установку можно производить в клиентском обработчике ПриОткрытии.

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


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

Почему страница может не переключаться: чек-лист для проверки

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

  1. Видимость страницы: Если у целевой страницы установлено свойство Видимость = Ложь (в палитре свойств, программно или через функциональные опции), платформа проигнорирует команду установки ТекущаяСтраница без генерации ошибки.
  2. Конфликт с фокусом ввода: Если после смены страницы в коде вызывается установка ТекущийЭлемент на поле, находящееся на другой вкладке, платформа автоматически сделает активной ту вкладку, где расположен элемент в фокусе.
  3. Привязка обработчика к событию: Процедура в модуле формы должна быть явно привязана к событию ПриСменеСтраницы в свойствах группы страниц (вкладка «События»), либо назначена через УстановитьДействие(). Простое совпадение имени процедуры с шаблоном не связывает ее с событием.
  4. Проблемы отладки и кэша: Точки останова в процедурах с директивой &НаКлиенте могут не срабатывать, если не подключен соответствующий предмет отладки тонкого клиента, либо после динамического обновления в сеансе используется устаревший кэш модуля. В таких случаях помогает полный перезапуск сеанса «1С:Предприятия» или очистка локального кэша.
← На главную