Разработка и Конфигурация · 12 мин
Как определить текущую страницу на форме 1С
Как программно определить текущую страницу формы в 1С: свойство ТекущаяСтраница, событие ПриСменеСтраницы, управляемые и обычные формы, примеры кода.
Формы в 1С часто состоят из нескольких страниц (вкладок), объединённых элементом «ПанельСтраниц». Логика программы нередко зависит от того, какая страница открыта у пользователя: например, нужно обновить данные только при переходе на вкладку «Товары», скрыть кнопку на определённой странице или проверить заполнение реквизитов именно активной вкладки. Для этого разработчику нужно уметь определять текущую страницу формы.
В управляемых и обычных формах механизм различается: в управляемой форме используется свойство ТекущаяСтраница элемента «ГруппаСтраницы» и событие ПриСменеСтраницы, в обычной форме — свойство ТекущаяСтраница панели и обработчик ПриСменеСтраницы панели. Ниже разобраны оба варианта с примерами кода, типичными ошибками и способами проверки результата.
Как устроены страницы на форме 1С
Страницы на форме создаются элементом «Панель страниц» (в управляемых формах — группа с видом «Страницы»), внутри которого размещаются дочерние страницы. Каждая страница имеет имя, заголовок и может содержать произвольный набор элементов: поля, таблицы, кнопки, вложенные группы.
Важно понимать: «текущая страница» — это свойство именно панели, а не формы в целом. Если на форме несколько панелей страниц, у каждой будет своя текущая страница. Поэтому в коде всегда обращаются к конкретному элементу панели по его имени, например Элементы.ПанельСтраниц.ТекущаяСтраница.
Имя страницы в коде — это имя элемента формы, заданное в конфигураторе, а не заголовок, который видит пользователь. Частая ошибка новичков — сравнивать текущую страницу с заголовком вкладки. Заголовок может меняться, локализоваться, а имя элемента остаётся стабильным идентификатором.
Определение текущей страницы в управляемой форме
В управляемой форме текущая страница читается через свойство ТекущаяСтраница группы-страниц. Свойство возвращает ссылку на элемент формы — объект типа ГруппаФормы, а не строку. Чтобы сравнить страницу с конкретной вкладкой, сравнивают её с элементом формы по имени:
&НаКлиенте
Процедура ПроверитьТекущуюСтраницу()
Если Элементы.ПанельСтраниц.ТекущаяСтраница = Элементы.СтраницаТовары Тогда
Сообщить("Открыта страница «Товары»");
ИначеЕсли Элементы.ПанельСтраниц.ТекущаяСтраница = Элементы.СтраницаДоставка Тогда
Сообщить("Открыта страница «Доставка»");
КонецЕсли;
КонецПроцедуры
Если нужно получить именно имя страницы строкой, используйте свойство Имя возвращённого элемента: Элементы.ПанельСтраниц.ТекущаяСтраница.Имя. Это удобно для журналирования или передачи значения на сервер, где коллекция Элементы может быть недоступна в нужном контексте.
Учтите контекст выполнения. В клиентской процедуре (&НаКлиенте) элементы формы доступны полностью. В серверной процедуре (&НаСервере) элементы тоже доступны, но только если процедура вызывается в контексте формы; при вызове из общего модуля формы у вас не будет. Поэтому логику определения текущей страницы обычно размещают на клиенте, а на сервер передают уже готовое имя страницы.
ИмяСтраницы = Элементы.ПанельСтраниц.ТекущаяСтраница.Имя;Реакция на переключение: событие ПриСменеСтраницы
Чаще всего текущую страницу нужно знать не разово, а в момент переключения — чтобы обновить данные, пересчитать итоги или изменить доступность кнопок. Для этого у панели страниц есть событие ПриСменеСтраницы. Обработчик назначается в палитре свойств элемента панели в конфигураторе.
В управляемой форме обработчик получает два параметра: ТекущаяСтраница — страница, которая стала активной, и ПредыдущаяСтраница — страница, с которой ушли:
&НаКлиенте
Процедура ПанельСтраницПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ТекущаяСтраница = Элементы.СтраницаТовары Тогда
ОбновитьИтогиПоТоварам();
КонецЕсли;
КонецПроцедуры
Типичный сценарий — отложенная загрузка тяжёлых данных. Если на вкладке «Отчёт» располагается ресурсоёмкая таблица, её заполнение имеет смысл выполнять не при открытии формы, а при первом переходе на эту страницу. Для этого в обработчике проверяют текущую страницу и признак того, что данные ещё не загружались (например, реквизит формы-флаг).
- 1Откройте форму в конфигураторе и найдите элемент панели страниц (группу с видом «Страницы»).
- 2Запомните имена панели и нужных страниц — они используются в коде.
- 3В палитре свойств панели назначьте обработчик события ПриСменеСтраницы.
- 4В обработчике сравните параметр ТекущаяСтраница с элементами-страницами через Элементы.<ИмяСтраницы>.
- 5Добавьте нужную логику: обновление данных, изменение видимости, проверку заполнения.
- 6Запустите форму в режиме предприятия и проверьте переключение вкладок.
Определение текущей страницы в обычной форме
В обычных формах (толстый клиент, обычное приложение) механизм похож, но есть отличия в синтаксисе. Панель страниц — это элемент Панель, а текущая страница доступна через то же свойство ТекущаяСтраница. Сравнение также выполняется по элементу:
Процедура ПанельСтраницПриСменеСтраницы(Элемент, ТекущаяСтраница, ПредыдущаяСтраница, СтандартнаяОбработка)
Если ТекущаяСтраница = ЭлементыФормы.ПанельСтраниц.Страницы.СтраницаТовары Тогда
ОбновитьДанныеТоваров();
КонецЕсли;
КонецПроцедуры
Обратите внимание: в обычной форме доступ к страницам идёт через коллекцию ЭлементыФормы.ПанельСтраниц.Страницы, где страницы адресуются по имени. В обработчике события дополнительно доступен параметр СтандартнаяОбработка — установив его в Ложь, можно запретить переключение, например если на текущей вкладке есть незаполненные обязательные поля.
Программно переключить страницу в обычной форме можно присваиванием: ЭлементыФормы.ПанельСтраниц.ТекущаяСтраница = ЭлементыФормы.ПанельСтраниц.Страницы.СтраницаДоставка;. В управляемой форме аналогично: Элементы.ПанельСтраниц.ТекущаяСтраница = Элементы.СтраницаДоставка;.
Как программно переключить страницу и проверить результат
Программное переключение полезно при навигации по мастеру («Далее»/«Назад»), при показе пользователю вкладки с ошибкой или при открытии формы сразу на нужной странице. После присваивания свойства ТекущаяСтраница событие ПриСменеСтраницы срабатывает так же, как при ручном клике, поэтому вся логика обновления выполнится автоматически.
Для проверки результата сравните свойство ТекущаяСтраница с ожидаемым элементом сразу после переключения. Если страница скрыта (у неё отключена видимость), переключение на неё может не выполниться — это частая причина «неработающего» кода. Перед программным переходом убедитесь, что Видимость и Доступность страницы установлены в Истина.
Как проверить результат
Условие срабатывает при переходе на нужную вкладку
Условие никогда не выполняется — проверьте имя панели и страницы
Обработчик вызывается при каждом переключении вкладки
Обработчик не вызывается — событие не назначено в палитре свойств
Вкладка меняется и данные обновляются
Вкладка не меняется — страница скрыта или недоступна
Типичные ошибки и ограничения
Самая распространённая ошибка — сравнение текущей страницы со строкой заголовка или имени: Если Элементы.ПанельСтраниц.ТекущаяСтраница = "СтраницаТовары" Тогда. Такое сравнение всегда ложно, потому что свойство возвращает объект-элемент формы, а не строку. Сравнивайте с элементом (Элементы.СтраницаТовары) или сравнивайте имена: ТекущаяСтраница.Имя = "СтраницаТовары".
Вторая ошибка — обращение к несуществующему имени панели или страницы. При копировании форм и переименовании элементов код легко рассинхронизируется с конфигуратором. Признак — ошибка «Поле объекта не обнаружено» при выполнении. Проверяйте имена элементов в дереве формы конфигуратора.
Третья группа проблем связана с контекстом: попытка прочитать Элементы в серверной процедуре вне контекста формы или в модуле объекта. В модуле объекта (документа, справочника) формы нет вообще — там определить текущую страницу невозможно. Вся работа со страницами выполняется только в модуле формы.
Практические сценарии использования
Знание текущей страницы чаще всего применяется в четырёх сценариях. Первый — ленивая загрузка данных: тяжёлые таблицы и отчёты заполняются только при переходе на соответствующую вкладку, что ускоряет открытие формы. Второй — контекстные команды: одна и та же кнопка «Печать» формирует разные документы в зависимости от активной страницы.
Третий сценарий — валидация при переключении: перед уходом со страницы проверяется заполнение обязательных полей, и при ошибках пользователь остаётся на вкладке (в обычных формах через СтандартнаяОбработка = Ложь, в управляемых — через возврат текущей страницы обратно). Четвёртый — мастера и пошаговые формы, где кнопки «Далее» и «Назад» переключают страницы программно, а текущая страница определяет доступность кнопки «Готово».
Как выбрать действие
Проверка и отладка кода
Для отладки удобно временно выводить имя текущей страницы в обработчике события: Сообщить("Переключено на: " + ТекущаяСтраница.Имя);. Это сразу показывает, срабатывает ли событие и какое имя имеет страница на самом деле — полезно, когда условие «не срабатывает» из-за опечатки в имени.
В конфигураторе проверьте три вещи: что у панели страниц назначен обработчик события ПриСменеСтраницы, что имена страниц в коде совпадают с именами в дереве элементов формы, и что обработчик расположен в правильном контексте (клиентском). После правок запустите форму в режиме предприятия и переключите все вкладки по очереди, наблюдая за поведением.
Что важно запомнить
Текущая страница — это свойство ТекущаяСтраница панели страниц, возвращающее элемент формы. Сравнивайте его с элементом по имени, реагируйте на переключения через событие ПриСменеСтраницы и помните, что работа со страницами возможна только в модуле формы.
Частые вопросы
Как получить имя текущей страницы строкой?
Используйте свойство Имя у возвращаемого элемента: Элементы.ПанельСтраниц.ТекущаяСтраница.Имя. Полученную строку можно передавать на сервер, записывать в журнал или сравнивать с именами страниц.
Почему событие ПриСменеСтраницы не срабатывает?
Чаще всего обработчик просто не назначен: откройте палитру свойств панели страниц в конфигураторе и проверьте, что в поле события «ПриСменеСтраницы» указана процедура. Также убедитесь, что переключаются страницы именно этой панели, а не вложенной.
Можно ли определить текущую страницу на сервере?
В серверной процедуре формы (с директивой &НаСервере) коллекция Элементы доступна, поэтому прочитать ТекущаяСтраница можно. Но если код выполняется вне контекста формы (общий модуль, модуль объекта), страницу определить нельзя — передавайте её имя с клиента параметром.
Как запретить пользователю уйти со вкладки с незаполненными полями?
В обычной форме в обработчике ПриСменеСтраницы установите параметр СтандартнаяОбработка в Ложь при обнаружении ошибок. В управляемой форме такого параметра нет, поэтому после проверки программно верните прежнюю страницу: присвойте ТекущаяСтраница значение предыдущей вкладки и выведите сообщение об ошибке.
Чем отличается определение страницы в управляемой и обычной форме?
Принцип одинаков — свойство ТекущаяСтраница панели. Отличия в синтаксисе: в обычной форме страницы адресуются через ЭлементыФормы.ПанельСтраниц.Страницы.<Имя>, а в управляемой — напрямую через Элементы.<ИмяСтраницы>. Также в обычной форме у события есть параметр СтандартнаяОбработка, позволяющий отменить переключение.
Как открыть форму сразу на нужной вкладке?
В обработчике ПриОткрытии формы присвойте свойству ТекущаяСтраница нужный элемент: Элементы.ПанельСтраниц.ТекущаяСтраница = Элементы.СтраницаДоставка;. Убедитесь, что страница видима и доступна, иначе переключение не выполнится.