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