При разработке и доработке конфигураций на управляемых формах (например, 1С:Документооборот) часто возникает задача открыть внешнюю или общую форму по кнопке из карточки объекта. Однако по умолчанию платформа 1С замещает содержимое текущего окна новой формой, добавляя кнопки навигации «Назад» и «Главное». Разберем, почему это происходит и как принудительно открыть общую форму в отдельном независимом окне.
Проанализируем стандартный код вызова команды, который приводит к переключению содержимого текущего окна:
ОткрытьФорму("ОбщаяФорма.ПроцессыИЗадачи",
Новый Структура("Предмет", ПараметрКоманды),
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Источник.КлючУникальности,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
В данном вызове передаются параметры ПараметрыВыполненияКоманды.Источник и ПараметрыВыполненияКоманды.Окно. Платформа 1С воспринимает такой вызов как переход внутри навигационного контекста текущего окна. В результате открываемая форма «рисуется» поверх существующей карточки объекта, а исходная форма теряется из поля зрения пользователя, оставляя лишь ссылку навигации.
Рассмотрим, как изменить параметры функции ОткрытьФорму, чтобы разорвать связь с текущим окном навигации и открыть форму отдельно:
Уникальность необходимо присвоить новое значение (например, Новый УникальныйИдентификатор() или Истина).Окно должен быть равен Неопределено.Посмотрим на пример правильного вызова процедуры:
// Открываем форму в новом отдельном окне
ОткрытьФорму("ОбщаяФорма.ПроцессыИЗадачи",
Новый Структура("Предмет", ПараметрКоманды),
ПараметрыВыполненияКоманды.Источник,
Новый УникальныйИдентификатор(), // Гарантирует создание нового окна
Неопределено, // Не привязываем к текущему окну
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
Если требуется, чтобы форма открывалась как модальное или блокирующее диалоговое окно поверх основного интерфейса, проанализируем дополнительные свойства и параметры:
Режим отображения окна в значение В диалоговом окне или задать Режим открытия окна как Блокировать окно владельца.ОткрытьФорму (8-й параметр):
ОткрытьФорму("ОбщаяФорма.ПроцессыИЗадачи",
Новый Структура("Предмет", ПараметрКоманды),
ПараметрыВыполненияКоманды.Источник,
Истина,
Неопределено,
,
,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Рассмотрим важный нюанс: метод Активизировать(), вызванный сразу после вызова ОткрытьФорму() в том же обработчике, может не сработать. Это связано с тем, что построение и отрисовка управляемой формы на клиенте происходят асинхронно после завершения выполнения процедуры.
Если необходимо принудительно передать фокус открытому окну после выполнения логики, рекомендуем использовать асинхронное подключение обработчика ожидания:
// В модуле открываемой формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("АктивизироватьФорму", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура АктивизироватьФорму()
ЭтаФорма.Активизировать();
КонецПроцедуры
Таким образом, для открытия любой общей формы в отдельном окне достаточно не передавать текущий контекст окна (ПараметрыВыполненияКоманды.Окно) и обеспечить уникальность ключа формы с помощью Новый УникальныйИдентификатор().