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

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

Как сделать активной страницу формы 1С

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

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

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

Как устроены страницы в управляемой форме

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

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

Базовый способ: присвоение свойства ТекущаяСтраница

Основной приём — присвоить свойству ТекущаяСтраница ссылку на нужный элемент формы. Код выполняется в модуле формы, обычно на клиенте:

&НаКлиенте

Процедура ПоказатьСтраницуТовары(Команда)

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

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

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

Частая ошибка — попытка присвоить строку: Элементы.СтраницыДокумента.ТекущаяСтраница = "СтраницаТовары". Такой код вызовет ошибку, потому что свойство ожидает объект элемента формы, а не текст. Правильный вариант — обращение через коллекцию Элементы: Элементы["СтраницаТовары"] или Элементы.СтраницаТовары.

bsl
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Элементы.СтраницыДокумента.ТекущаяСтраница = Элементы.СтраницаТовары;
КонецПроцедуры

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

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("ОткрытьСтраницу") Тогда

Если Параметры.ОткрытьСтраницу = "Оплата" Тогда

Элементы.СтраницыДокумента.ТекущаяСтраница = Элементы.СтраницаОплата;

КонецЕсли;

КонецЕсли;

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

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

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

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

Типовой сценарий — переключение вкладки по результатам проверки. Например, после записи документа нужно показать пользователю страницу с сообщениями об ошибках, если они есть, иначе оставить текущую вкладку:

&НаКлиенте

Процедура ПослеЗаписи(ПараметрыЗаписи)

Если ЕстьОшибки Тогда

Элементы.СтраницыДокумента.ТекущаяСтраница = Элементы.СтраницаОшибки;

КонецЕсли;

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

Если имя страницы заранее неизвестно и вычисляется динамически, обращайтесь к коллекции элементов по строке: Элементы.СтраницыДокумента.ТекущаяСтраница = Элементы[ИмяСтраницы]. Перед присвоением полезно проверить, что элемент существует, иначе обращение к несуществующему имени вызовет ошибку выполнения.

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

Как это делается в обычных формах (обычное приложение)

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

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

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

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

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

Сравнение вариантов

Управляемая форма

Элементы.ГруппаСтраниц.ТекущаяСтраница = Элементы.ИмяСтраницы. Работает и на клиенте, и на сервере, рекомендуется для всех современных конфигураций.

Обычная форма

ЭлементыФормы.Панель.ТекущаяСтраница = ЭлементыФормы.Панель.Страницы.ИмяСтраницы. Только для конфигураций в режиме обычного приложения.

Переключение через параметры формы

Передача имени вкладки при ОткрытьФорму и обработка в ПриСозданииНаСервере. Подходит, когда страницу выбирает вызывающий код.

Типичные ошибки и как их избежать

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

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

Типичные ошибки
01
Присвоение строки вместо элемента: ТекущаяСтраница = "Страница1" вызывает ошибку, нужно Элементы.Страница1
02
Опечатка или устаревшее имя элемента после доработки формы — ошибка «Поле объекта не обнаружено»
03
Переключение только внутренней вложенной страницы при неактивной внешней вкладке — пользователь ничего не видит
04
Попытка переключить скрытую страницу без включения видимости
05
Использование синтаксиса обычных форм (ЭлементыФормы) в управляемом приложении и наоборот

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

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

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

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

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

Открытие формы
Норма

Сразу отображается нужная вкладка без мигания

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

Показывается первая страница или вкладка переключается с заметной задержкой

Содержимое вкладки
Норма

Все поля и таблицы страницы отображаются и заполнены

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

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

Повторное открытие
Норма

Поведение стабильно при разных параметрах открытия

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

Страница переключается только при первом открытии или выдаёт ошибку

Часто задаваемые вопросы

Можно ли присвоить ТекущаяСтраница имя страницы строкой?

Нет. Свойство ожидает ссылку на элемент формы. Если имя известно только как строка, используйте обращение через коллекцию: Элементы.ГруппаСтраниц.ТекущаяСтраница = Элементы[ИмяСтраницы].

Почему код переключения страницы выдаёт ошибку «Поле объекта не обнаружено»?

Чаще всего имя элемента в коде не совпадает с именем в редакторе формы — например, после переименования или копирования формы. Откройте форму в конфигураторе и сверьте имена группы-страниц и самой страницы.

Как переключить страницу из внешней обработки или другой формы?

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

Работает ли присвоение ТекущаяСтраница на сервере?

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

Как узнать, какая страница сейчас активна?

Прочитайте то же свойство: ТекущаяСтраница = Элементы.ГруппаСтраниц.ТекущаяСтраница. Сравните результат с нужным элементом формы или получите имя через свойство Имя элемента.

Страница назначена текущей, но пользователь её не видит. В чём причина?

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

Итог

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

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