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

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

Как открыть уже открытую форму 1С: поиск и активизация

Как открыть уже открытую форму 1С без дублирования: поиск формы по ключу уникальности, метод Активизировать, ОткрытьФорму с параметрами, примеры кода и типичные ошибки.

Задача «открыть уже открытую форму» возникает в двух ситуациях. Первая — пользовательская: форма документа или списка уже открыта где-то в окне приложения, и нужно просто переключиться на неё, а не плодить копии. Вторая — прикладная: из кода нужно найти существующую форму объекта и активировать её, а если формы нет — открыть новую. В обоих случаях механика опирается на понятие уникальности формы и штатные средства платформы.

Ключевой момент: платформа 1С сама умеет не создавать дубликаты. Если вызвать ОткрытьФорму с тем же ключом уникальности, что у уже открытой формы, новая форма не создастся — вместо этого существующая будет активизирована. Проблемы начинаются, когда разработчик передаёт другой ключ уникальности, открывает форму без ключа или работает с независимыми формами, которые платформа не связывает между собой.

Как пользователю переключиться на уже открытую форму без кода

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

Если форма открыта в отдельном окне (например, отчёт выведен в новое окно), переключение выполняется стандартными средствами операционной системы: Alt+Tab в Windows или через панель задач. Платформа не блокирует такое переключение, и состояние формы при этом сохраняется.

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

Ключ уникальности формы: почему платформа не создаёт дубликат

Каждая форма в 1С имеет ключ уникальности. Для форм объектов (документов, элементов справочников) ключом по умолчанию служит ссылка на объект. Когда вызывается ОткрытьФорму с параметром Ключ, содержащим ту же ссылку, платформа сначала ищет среди открытых форм ту, у которой совпадает имя формы и ключ. Найдя совпадение, она не создаёт новый экземпляр, а активирует существующий.

Дополнительно можно передать параметр Уникальность — произвольное значение, которое переопределяет ключ. Это полезно, когда одна и та же форма должна открываться в нескольких независимых экземплярах (например, несколько окон подбора с разными настройками) или, наоборот, когда разные объекты должны делить одну форму.

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

Открытие формы объекта из кода без дублирования

Типовой сценарий: из своей обработки нужно показать пользователю документ, который, возможно, уже открыт. Достаточно вызвать ОткрытьФорму с ключом-ссылкой:

ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",

Новый Структура("Ключ", СсылкаНаДокумент));

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

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

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", КонтрагентСсылка));
ОткрытьФорму("Документ.СчетНаОплату.Форма.ФормаСписка", ПараметрыФормы, , КонтрагентСсылка.УникальныйИдентификатор());

Поиск уже открытой формы и её активизация

Иногда нужно не просто «открыть или активизировать», а проверить, открыта ли форма, и выполнить с ней дополнительные действия — например, обновить данные или передать параметры. Для этого используется ПолучитьФорму с тем же ключом уникальности: если форма уже существует, метод вернёт существующий экземпляр, а не создаст новый.

ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",

Новый Структура("Ключ", СсылкаНаДокумент));

Если ФормаДокумента.Открыта() Тогда

ФормаДокумента.Активизировать();

Иначе

ФормаДокумента.Открыть();

КонецЕсли;

Метод Активизировать() переводит фокус на форму, если она открыта в том же окне или в доступном дочернем окне. Ограничение: активизировать форму, открытую в другом сеансе или другом клиентском приложении, невозможно — формы существуют только внутри своего сеанса.

Если нужно не только активизировать, но и передать форме новые данные, используйте оповещения: Оповестить("ОбновитьДанные", Параметры, КлючУникальности), а в форме-приёмнике обработайте событие ОбработкаОповещения. Это безопаснее, чем напрямую обращаться к реквизитам чужой формы.

Порядок действий при открытии формы из кода
  1. 1
    Определите ключ уникальности: ссылка на объект или собственное значение
  2. 2
    Вызовите ОткрытьФорму с параметром Ключ или параметром Уникальность
  3. 3
    Если нужна проверка — получите форму через ПолучитьФорму и проверьте метод Открыта()
  4. 4
    Для уже открытой формы вызовите Активизировать() или отправьте Оповестить()
  5. 5
    Проверьте результат: открылась одна форма, дубликат не создан

Открытие формы в модальном и блокирующем режиме

Формы, открытые методом ОткрытьМодально или с блокировкой окна владельца, ведут себя иначе. Пока модальная форма открыта, взаимодействие с родительским окном заблокировано, и активизировать что-то «под ней» пользователь не сможет. Если логика требует переключения на уже открытую форму, модальный режим для такой формы применять не следует.

В управляемом приложении вместо устаревшего ОткрытьМодально рекомендуется ОткрытьФорму с описанием оповещения о закрытии — тогда форма не блокирует интерфейс, и механизм уникальности продолжает работать. Это особенно важно в веб-клиенте, где модальные окна ограничены.

Сравнение способов

ОткрытьФорму с ключом

Самый простой путь: платформа сама находит и активизирует существующий экземпляр. Подходит для большинства сценариев.

ПолучитьФорму + Активизировать

Даёт контроль: можно проверить, открыта ли форма, и выполнить дополнительные действия. Требует аккуратности с ключом уникальности.

Оповестить с ключом

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

Типичные ошибки и их последствия

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

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

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

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

Проверка результата и границы безопасной работы

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

Безопасная граница самостоятельной доработки: изменение ключей уникальности и вызовов ОткрытьФорму в собственных расширениях и внешних обработках. Вмешательство в типовые модули конфигурации на поддержке усложнит обновления — для типовых форм предпочтительнее расширение или подписка на событие.

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

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

Повторный вызов открытия формы
Норма

Активизируется существующая форма, новых окон нет

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

Открывается вторая копия той же формы

Несохранённые данные в форме
Норма

После активизации все изменения на месте

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

Форма пересоздаётся, введённые данные пропадают

Запись объекта из формы
Норма

Запись проходит без конфликтов

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

Ошибка «данные были изменены другим пользователем или сеансом»

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

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

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

Почему ОткрытьФорму создаёт дубликат, хотя ключ передан?

Чаще всего причина в том, что при разных вызовах передаются разные значения ключа: например, один раз ссылка, другой раз — строковое представление ссылки. Типы значений ключа должны совпадать. Также проверьте, не переопределён ли параметр Уникальность где-то в коде формы.

Чем ПолучитьФорму отличается от ОткрытьФорму?

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

Как открыть одну и ту же независимую обработку в нескольких окнах?

Передайте в параметр Уникальность разные значения при каждом вызове, например новый уникальный идентификатор. Тогда платформа будет считать экземпляры разными и не станет активизировать предыдущий.

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

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

Как из внешней обработки открыть форму документа, не дублируя её?

Вызовите ОткрытьФорму с полным именем формы документа и параметром Ключ, содержащим ссылку. Платформа сама найдёт открытый экземпляр в текущем сеансе и активизирует его, никакого дополнительного поиска не требуется.

Итог

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

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