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

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

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

Как программно активировать форму в 1С: метод Активизировать(), Activate(), работа с окнами, типичные ошибки и проверка результата в управляемых и обычных формах.

Вопрос «как сделать форму активной» в 1С возникает в двух ситуациях: когда нужно программно вывести уже открытую форму на передний план и передать ей фокус, и когда форма открылась, но оказалась скрыта за другими окнами или заблокирована. В обоих случаях ключевым инструментом является метод Активизировать() (в английском синтаксисе — Activate()), доступный у объекта формы.

Важно понимать разницу между «открыть форму» и «активировать форму». Открытие создаёт форму и показывает её пользователю, а активация лишь переводит фокус на уже существующую форму, не создавая новый экземпляр. Если форма не открыта, вызов активации ни к чему не приведёт — сначала форму нужно получить или открыть.

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

Что делает метод Активизировать()

Метод Активизировать() переводит фокус ввода на указанную форму и выводит её на передний план среди окон клиентского приложения. Пользователь сразу видит форму и может продолжить ввод данных без лишних щелчков мышью. Метод не имеет параметров и не возвращает значения.

Метод доступен как для управляемых форм (объект УправляемаяФорма), так и для обычных форм (объект Форма). Синтаксис одинаковый, различия касаются способа получения ссылки на форму и поведения окон.

bsl
// Управляемая форма
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
ФормаДокумента.Открыть();
ФормаДокумента.Активизировать();

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

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

В управляемом приложении типовой сценарий выглядит так: получить форму функцией ПолучитьФорму() или открыть её через ОткрытьФорму(), а затем вызвать Активизировать(). Если форма открывается с параметрами, передайте их структурой — иначе получите форму с незаполненными данными или ошибку.

Когда форма открывается из другой формы, ссылку на владельца можно передать через параметр «Владелец» или использовать объект описания оповещения. Для активации уже открытой формы списка, которую пользователь мог «потерять» среди вкладок, достаточно повторно вызвать ОткрытьФорму() с тем же ключом уникальности — платформа не создаст дубликат, а активирует существующий экземпляр.

Проверка, открыта ли форма

Перед активацией полезно убедиться, что форма существует. Для управляемых форм используется свойство Открыта() — метод формы, возвращающий Истина, если форма открыта. Обращение к закрытой форме вызовет ошибку обращения к недопустимому объекту.

bsl
Если ФормаДокумента <> Неопределено И ФормаДокумента.Открыта() Тогда
    ФормаДокумента.Активизировать();
Иначе
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;

Активация обычной формы и работа с окнами

В обычном приложении (толстый клиент, режим обычного приложения) помимо метода формы доступен объект Окна — коллекция окон клиентского приложения. Через него можно найти нужное окно и активировать его, что полезно, когда форма открыта в отдельном окне.

bsl
// Обычное приложение
Форма = Документы.РеализацияТоваровУслуг.ПолучитьФорму("ФормаДокумента");
Форма.Открыть();
Форма.Активизировать();

// Активация окна
Для Каждого Окно Из Окна Цикл
    Если Найти(Окно.Заголовок, "Реализация") > 0 Тогда
        Окно.Активизировать();
        Прервать;
    КонецЕсли;
КонецЦикла;

Учтите, что перебор окон по заголовку — ненадёжный приём: заголовок может меняться в зависимости от состояния документа (например, добавляется признак модифицированности). Используйте этот способ только когда ссылку на форму получить невозможно.

Активация элемента внутри формы

Иногда задача шире: не только показать форму, но и установить курсор в конкретное поле. Для этого у управляемой формы есть свойство ТекущийЭлемент — присвойте ему нужный элемент формы, и после активации фокус окажется в нём.

bsl
&НаКлиенте
Процедура ПоказатьИУстановитьФокус(Команда)
    Активизировать();
    ЭтаФорма.ТекущийЭлемент = Элементы.Комментарий;
КонецПроцедуры

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

Порядок действий
  1. 1
    Определите, открыта ли форма: вызовите Открыта() или проверьте ссылку на Неопределено
  2. 2
    Если форма не открыта — откройте её через ОткрытьФорму() или ПолучитьФорму() с нужными параметрами
  3. 3
    Вызовите у формы Активизировать()
  4. 4
    При необходимости установите ТекущийЭлемент для передачи фокуса в конкретное поле
  5. 5
    Проверьте визуально: форма на переднем плане, курсор в нужном поле

Типичные ошибки и ограничения

Самая частая ошибка — вызов Активизировать() на сервере. Активация формы имеет смысл только на клиенте, где существует интерфейс. В серверном контексте метод недоступен, и попытка его выполнить приведёт к ошибке компиляции или выполнения. Размещайте код активации в клиентских процедурах (директива &НаКлиенте).

Вторая распространённая проблема — активация модально или блокирующе открытой формы. Если форма открыта с РежимОткрытияОкна.БлокироватьВесьИнтерфейс, активировать другую форму поверх неё нельзя, пока блокирующая форма не закрыта. Это ограничение платформы, а не дефект кода.

Типичные ошибки
01
Вызов Активизировать() на сервере — метод работает только в клиентском контексте
02
Активация закрытой формы — обращение к уничтоженному объекту вызывает ошибку, проверяйте Открыта()
03
Попытка активировать форму поверх блокирующего окна — платформа это запрещает
04
Хранение ссылки на форму между вызовами без проверки — после закрытия ссылка становится недействительной

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

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

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

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

Положение формы
Норма

Форма на переднем плане, видна пользователю

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

Форма осталась за другими окнами — проверьте, не открыто ли блокирующее окно

Фокус ввода
Норма

Курсор в нужном поле, ввод с клавиатуры идёт в форму

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

Фокус в другой форме — проверьте ТекущийЭлемент и порядок вызовов

Ошибки выполнения
Норма

Код отрабатывает без исключений

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

Ошибка обращения к объекту — форма закрыта или контекст серверный

Если активация не срабатывает без видимых ошибок, добавьте отладку: точку останова перед вызовом метода и проверку значения Форма.Открыта(). Это локализует проблему — либо форма не существует, либо её перекрывает модальное окно.

Когда активация не нужна

Не вызывайте Активизировать() сразу после ОткрытьФорму() в том же вызове, если форма открывается в обычном режиме, — свежеоткрытая форма и так получает фокус. Лишний вызов не навредит, но загромождает код. Активация оправдана при возврате к ранее открытой форме, при обработке оповещений и в сценариях многодокументной работы.

Маршрут решения

Как выбрать действие

Форма ещё не созданаИспользуйте ОткрытьФорму() — активация не требуется
Форма открыта, но потерялась среди оконВызовите Активизировать() или повторный ОткрытьФорму() с тем же ключом уникальности
Нужно вернуть фокус в конкретное полеАктивизируйте форму и установите ТекущийЭлемент
Поверх открыта блокирующая формаСначала закройте блокирующее окно, затем активируйте нужную форму
Итог

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

Активация формы выполняется методом Активизировать() только на клиенте и только для открытой формы. Перед вызовом проверяйте Открыта(), для фокуса в поле используйте ТекущийЭлемент, а при блокирующих окнах сначала закрывайте их.

Частые вопросы

Чем Активизировать() отличается от Открыть()?

Открыть() создаёт и показывает форму, а Активизировать() лишь переводит фокус на уже существующую открытую форму. Если форма закрыта, Активизировать() не откроет её — нужен вызов Открыть() или ОткрытьФорму().

Почему возникает ошибка при вызове Активизировать()?

Чаще всего причины две: метод вызван в серверном контексте, где интерфейса нет, или форма к моменту вызова уже закрыта. Перенесите код в клиентскую процедуру и проверяйте Открыта() перед активацией.

Можно ли активировать форму другого сеанса или пользователя?

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

Как активировать форму списка, открытую в панели навигации?

Храните ссылку на форму при её открытии и вызывайте Активизировать() по этой ссылке. Альтернатива — повторный вызов ОткрытьФорму() с теми же параметрами и ключом уникальности: платформа активирует существующий экземпляр вместо создания нового.

Работает ли Активизировать() в веб-клиенте?

Метод доступен, но поведение зависит от браузера: веб-браузеры ограничивают программное управление фокусом вкладок. Внутри одной вкладки браузера активация формы работает, а переключить пользователя на другую вкладку браузера средствами 1С нельзя.

Как поставить курсор в нужное поле после активации?

После вызова Активизировать() присвойте свойству формы ТекущийЭлемент ссылку на нужный элемент, например: ЭтаФорма.ТекущийЭлемент = Элементы.Номенклатура. Убедитесь, что элемент видим и доступен для редактирования.