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