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