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