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