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