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