Как открыть общую форму в новом окне в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

При разработке и доработке конфигураций на управляемых формах (например, 1С:Документооборот) часто возникает задача открыть внешнюю или общую форму по кнопке из карточки объекта. Однако по умолчанию платформа 1С замещает содержимое текущего окна новой формой, добавляя кнопки навигации «Назад» и «Главное». Разберем, почему это происходит и как принудительно открыть общую форму в отдельном независимом окне.

Выясним причину замещения формы

Проанализируем стандартный код вызова команды, который приводит к переключению содержимого текущего окна:


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

В данном вызове передаются параметры ПараметрыВыполненияКоманды.Источник и ПараметрыВыполненияКоманды.Окно. Платформа 1С воспринимает такой вызов как переход внутри навигационного контекста текущего окна. В результате открываемая форма «рисуется» поверх существующей карточки объекта, а исходная форма теряется из поля зрения пользователя, оставляя лишь ссылку навигации.

Способ 1. Управление параметрами функции ОткрытьФорму

Рассмотрим, как изменить параметры функции ОткрытьФорму, чтобы разорвать связь с текущим окном навигации и открыть форму отдельно:

  1. Передадим уникальный ключ: Чтобы платформа не пыталась найти или заменить существующее окно с тем же ключом, параметру Уникальность необходимо присвоить новое значение (например, Новый УникальныйИдентификатор() или Истина).
  2. Очистим ссылку на окно: Параметр Окно должен быть равен Неопределено.

Посмотрим на пример правильного вызова процедуры:


// Открываем форму в новом отдельном окне
ОткрытьФорму("ОбщаяФорма.ПроцессыИЗадачи",
    Новый Структура("Предмет", ПараметрКоманды),
    ПараметрыВыполненияКоманды.Источник,
    Новый УникальныйИдентификатор(), // Гарантирует создание нового окна
    Неопределено,                     // Не привязываем к текущему окну
    ПараметрыВыполненияКоманды.НавигационнаяСсылка);

Способ 2. Настройка режима открытия окна

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

  1. Настройка свойств формы в Конфигураторе: В свойствах общей формы можно установить параметр Режим отображения окна в значение В диалоговом окне или задать Режим открытия окна как Блокировать окно владельца.
  2. Программная передача режима открытия: Вы можете передать параметр режима открытия непосредственно при вызове функции ОткрытьФорму (8-й параметр):

ОткрытьФорму("ОбщаяФорма.ПроцессыИЗадачи",
    Новый Структура("Предмет", ПараметрКоманды),
    ПараметрыВыполненияКоманды.Источник,
    Истина,
    Неопределено,
    ,
    ,
    РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Особенности активизации и фокусировки окон

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

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


// В модуле открываемой формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("АктивизироватьФорму", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура АктивизироватьФорму()
    ЭтаФорма.Активизировать();
КонецПроцедуры

Таким образом, для открытия любой общей формы в отдельном окне достаточно не передавать текущий контекст окна (ПараметрыВыполненияКоманды.Окно) и обеспечить уникальность ключа формы с помощью Новый УникальныйИдентификатор().

← На главную