К статье
Практический материал

Разработка и Конфигурация · 9 мин

1С: как узнать, какая страница формы активна, и переключить её

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

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

Задача «какая страница активна» возникает в нескольких сценариях: валидация при записи документа, динамическая подгрузка данных только видимой вкладки, открытие формы сразу на нужной странице, а также отладка поведения формы. Во всех случаях работа ведётся через свойства и события панели страниц, и важно понимать, где доступен контекст — на клиенте или на сервере.

Где хранится признак активной страницы

Панель страниц в управляемой форме — это группа с видом «Страницы». Каждая вкладка внутри неё — отдельная группа с видом «Страница». У панели есть свойство ТекущаяСтраница, которое содержит ссылку на объект страницы, отображаемой в данный момент. Это не строка с именем, а именно элемент формы, поэтому сравнивать его нужно с элементом, а не с текстом.

Чтение свойства выглядит так:

АктивнаяСтраница = Элементы.СтраницыФормы.ТекущаяСтраница;

Если АктивнаяСтраница = Элементы.СтраницаТовары Тогда

// пользователь находится на вкладке «Товары»

КонецЕсли;

Если нужно получить именно имя страницы (например, для записи в журнал или сохранения настройки), используйте свойство Имя:

ИмяАктивной = Элементы.СтраницыФормы.ТекущаяСтраница.Имя;

Как программно переключить активную страницу

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

&НаКлиенте

Процедура ПоказатьОшибки(Команда)

Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаКонтрагенты;

КонецПроцедуры

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

Учтите: если страница скрыта (свойство Видимость = Ложь), присвоение её как текущей может не дать ожидаемого эффекта — поведение зависит от настроек отображения панели. Перед переключением убедитесь, что страница видима, либо сначала включите видимость.

Порядок действий
  1. 1
    Найдите в дереве элементов формы группу с видом «Страницы» и запомните её имя
  2. 2
    Определите имена дочерних страниц, между которыми нужно переключаться
  3. 3
    Для чтения активной вкладки используйте Элементы.Панель.ТекущаяСтраница
  4. 4
    Для переключения присвойте этому свойству нужную страницу
  5. 5
    Проверьте результат в режиме предприятия: вкладка должна смениться без перерисовки всей формы

Как открыть форму сразу на нужной странице

Частая задача — открыть документ или справочник так, чтобы пользователь сразу увидел конкретную вкладку. Для этого переключение выполняют в обработчике ПриОткрытии на клиенте:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Если Объект.ЕстьРасхождения Тогда

Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаРасхождения;

КонецЕсли;

КонецПроцедуры

Если условие выбора страницы известно заранее извне (например, форма открывается из разных мест), передайте его через параметры формы: в ПриСозданииНаСервере прочитайте параметр и установите ТекущаяСтраница там. Серверная установка на этапе создания надёжнее — она применяется до первого показа формы.

Не пытайтесь переключать страницу в ПриСозданииНаСервере через клиентские механизмы ожидания — это лишнее усложнение. Свойство доступно на сервере в полном объёме, пока форма формируется.

Как отследить переключение страницы пользователем

У панели страниц есть событие ПриСменеСтраницы. Оно вызывается, когда пользователь щёлкает по другой вкладке. В обработчике доступны параметры ТекущаяСтраница и НоваяСтраница, что позволяет отреагировать до или после смены:

&НаКлиенте

Процедура СтраницыФормыПриСменеСтраницы(Элемент, ТекущаяСтраница)

Если ТекущаяСтраница = Элементы.СтраницаИстория Тогда

ОбновитьИсторию();

КонецЕсли;

КонецПроцедуры

Типовой приём — ленивая загрузка данных: тяжёлые таблицы или отчёты заполняются только когда вкладка реально открыта. Это ускоряет открытие формы и снижает нагрузку на сервер. При таком подходе храните признак «данные уже загружены», чтобы не перечитывать их при каждом переключении.

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

Для ленивой загрузки удобно завести реквизит формы «ЗагруженныеСтраницы» типа Соответствие и отмечать в нём вкладки, данные которых уже получены. Тогда повторные переключения не порождают серверных вызовов.
ПЗ
Практическое замечание

Отличия для обычных форм и вложенных панелей

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

Если панелей несколько (вложенные вкладки внутри вкладки), у каждой панели своё свойство ТекущаяСтраница. Определяя «какая страница активна», уточняйте, о каком уровне идёт речь: внешняя панель может показывать страницу «Основное», а внутренняя — «По месяцам». Полный «путь» активной вкладки придётся собирать по каждой панели отдельно.

Для поиска страницы по имени внутри панели используйте коллекцию Страницы:

Найденная = Элементы.СтраницыФормы.Страницы.Найти("СтраницаОплата");

Если Найденная <> Неопределено Тогда

Элементы.СтраницыФормы.ТекущаяСтраница = Найденная;

КонецЕсли;

Типичные ошибки
01
Сравнение ТекущаяСтраница со строкой заголовка — условие никогда не сработает, сравнивайте с элементом страницы или её именем
02
Переключение на скрытую страницу без включения видимости — вкладка не появится, а пользователь ничего не увидит
03
Переключение страницы в серверной процедуре, вызванной с клиента, когда достаточно клиентского кода — лишний серверный вызов и задержка
04
Ожидание, что событие ПриСменеСтраницы гарантированно сработает при программном переключении — безопаснее вызвать обработчик явно

Как проверить результат и что делать при проблемах

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

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

Контрольные точки

Как проверить результат

Чтение активной страницы
Норма

Возвращается элемент страницы, имя совпадает с видимой вкладкой

Тревожный признак

Возвращается Неопределено или страница другой панели

Программное переключение
Норма

Вкладка меняется сразу после выполнения кода

Тревожный признак

Вкладка не меняется — проверьте видимость страницы и имя панели

Открытие формы на нужной вкладке
Норма

Форма сразу показывает заданную страницу

Тревожный признак

Показывается первая вкладка — установка выполнена не в том обработчике

Итог

Что важно запомнить

Активная вкладка определяется свойством ТекущаяСтраница панели страниц; читается и изменяется оно на клиенте и на сервере. Сравнивайте значение с элементом страницы, переключайте присваиванием, реагируйте на действия пользователя через событие ПриСменеСтраницы, а открытие формы на нужной вкладке настраивайте в ПриСозданииНаСервере или ПриОткрытии.

Частые вопросы

Можно ли узнать активную страницу вне формы, из другого объекта?

Нет. Состояние вкладок — это свойство конкретной открытой формы. Извне можно получить форму через ПолучитьФорму() или параметры оповещений, но напрямую читать её элементы из другого объекта не принято; передавайте нужные сведения через параметры и оповещения.

Почему сравнение ТекущаяСтраница = "Товары" не работает?

Свойство содержит объект страницы, а не строку. Сравнивайте с Элементы.СтраницаТовары или используйте Элементы.Панель.ТекущаяСтраница.Имя = "СтраницаТовары".

Как скрыть вкладку и не дать переключиться на неё?

Установите странице Видимость = Ложь. Если она в этот момент активна, сначала переключите панель на другую страницу, иначе поведение интерфейса может быть некорректным.

Срабатывает ли ПриСменеСтраницы при программном переключении?

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

Как сохранить активную вкладку между сеансами?

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

Работает ли это в веб-клиенте и мобильном клиенте?

Свойство ТекущаяСтраница и событие ПриСменеСтраницы доступны в веб-клиенте так же, как в тонком. В мобильном клиенте набор элементов формы ограничен, и поведение страниц отличается — проверяйте поддержку конкретных элементов в документации по мобильной платформе.