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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Разбор типичной ошибки: Видимость против Активности

Рассмотрим ситуацию, с которой столкнулся автор темы. В коде была предпринята попытка управлять отображением страниц через свойство Видимость. Проанализируем, почему это не совсем корректно для установки фокуса на нужную закладку:


// Не совсем верный подход через Видимость
Страницы.Основное.Видимость = Ложь;
Страницы.Настройки.Видимость = Ложь;
Страницы.Дополнительно.Видимость = Истина;
Страницы.ПроверитьОплатуСчёта.Видимость = Истина;

Когда мы меняем видимость, мы лишь указываем системе, какие ярлычки закладок показывать пользователю, а какие скрыть. Однако свойство Видимость напрямую не управляет тем, какая страница будет отображена в теле панели в данный момент. Если страница "Дополнительно" была активна в конфигураторе по умолчанию, система может оставить её активной, даже если мы программно разрешили показ других страниц.

Для того чтобы форма открылась на конкретной вкладке, необходимо явно указать текущую страницу. Выясним, как это делается правильно.

Решение для обычных форм (Обычное приложение)

В обычном приложении (использующем ЭлементыФормы) для переключения страниц используется объект Панель. Каждая панель содержит коллекцию Страницы, а за отображаемую в данный момент вкладку отвечает свойство ТекущаяСтраница. Рассмотрим исправленный и рабочий вариант кода:


// Правильная активация страницы в обычном приложении
Процедура ПриОткрытии(Отказ)
    
    // Получаем значение, переданное при открытии (например, через структуру параметров)
    ПараметрПередачи = ЭтаФорма.ПараметрПередачи;
    
    Если ПараметрПередачи = 1 Тогда
        // Сначала настраиваем состав видимых страниц
        ЭлементыФормы.Панель1.Страницы.Основное.Видимость = Ложь;
        ЭлементыФормы.Панель1.Страницы.Настройки.Видимость = Ложь;
        
        // Устанавливаем конкретную страницу активной
        // Важно: присваиваем именно объект страницы, а не её имя строкой
        ЭлементыФормы.Панель1.ТекущаяСтраница = ЭлементыФормы.Панель1.Страницы.ПроверитьОплатуСчёта;
        
        ЭтаФорма.Заголовок = "Проверка оплаты счетов";
    КонецЕсли;

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

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

Решение для управляемых форм (Управляемое приложение 8.2, 8.3)

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

Проанализируем программный код для управляемой формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем параметр, переданный в форму
    Если Параметры.РежимПроверкиОплаты Тогда
        
        // В управляемых формах обращение идет напрямую через Элементы
        // ИмяГруппыСтраниц — это имя элемента в дереве формы
        // ИмяНужнойСтраницы — имя конкретной страницы в этой группе
        
        Элементы.ГруппаСтраниц.ТекущаяСтраница = Элементы.СтраницаОплаты;
        
    КонецЕсли;
    
КонецПроцедуры

В управляемом приложении рекомендуется делать эти настройки в процедуре ПриСозданииНаСервере. Это позволяет подготовить интерфейс до того, как форма будет передана на клиент и отрисована на экране пользователя. Таким образом, мы избегаем визуального "скачка" (мерцания), когда форма сначала открывается на первой вкладке, а потом резко переключается на вторую. Для комплексной программной настройки элементов управляемых форм можно использовать готовый модуль программного изменения форм.

Использование параметров для управления страницами

Для того чтобы механизм переключения работал гибко, разберем способ вызова формы с передачей параметров. Допустим, мы вызываем нашу обработку из другого места конфигурации. Вместо использования глобальных переменных или поиска открытых окон, воспользуемся структурой параметров.

Пример вызова управляемой формы:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимПроверкиОплаты", Истина);

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма", ПараметрыОткрытия);

Внутри самой формы в ПриСозданииНаСервере мы просто читаем это значение из объекта Параметры. Это наиболее "чистый" и надежный способ управления поведением интерфейса. Для интерактивной отладки и проверки свойств элементов открытых управляемых форм подойдёт редактор форм в режиме предприятия.

Дополнительные возможности: События и видимость закладок

Рассмотрим еще несколько полезных инструментов, которые могут пригодиться при работе со страницами:

  1. Событие ПриСменеСтраницы: Если вам нужно выполнять какой-то код (например, обновлять данные в таблице) именно в момент, когда пользователь переходит на определенную вкладку, используйте стандартное событие панели.
  2. Свойство ОтображениеЗакладок: Вы можете установить это свойство в значение Не отображать. В этом случае пользователь не увидит ярлычков сверху, и форма будет выглядеть как "Мастер установки" (Wizard), где переключение между экранами происходит только программно (например, по кнопкам "Далее" и "Назад").
  3. Порядок действий: Всегда сначала устанавливайте свойство Видимость = Истина для целевой страницы, и только потом делайте её ТекущейСтраницей. Если попытаться сделать активной скрытую страницу, система выберет следующую доступную видимую вкладку.

Выясним, как обращаться к страницам, если их имена заранее неизвестны или формируются динамически. В этом случае можно использовать индекс:


// Обращение по индексу (0 — первая страница)
Элементы.ГруппаСтраниц.ТекущаяСтраница = Элементы.ГруппаСтраниц.ПодчиненныеЭлементы[2];

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

← На главную