При разработке внешних обработок часто возникает необходимость открыть вторую (дополнительную) форму обработки из ее основной формы — например, форму настроек, форму подбора или вспомогательное окно. Разберем, как правильно реализовать открытие формы в управляемом и обычном приложении, а также рассмотрим особенности передачи данных между формами.
В управляемом интерфейсе 1С для открытия окон используется глобальная функция ОткрытьФорму. Если необходимо открыть форму внешней обработки, путь к ней формируется по шаблону "ВнешняяОбработка.<ИмяОбработки>.Форма.<ИмяФормы>".
Рассмотрим прямой вызов формы, если имя обработки и формы заранее известны:
// Клиентский вызов формы
ПараметрыФормы = Новый Структура;
ОткрытьФорму("ВнешняяОбработка.МояВнешняяОбработка.Форма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);
Однако при динамическом подключении обработки или изменении ее имени в справочнике дополнительных отчетов и обработок жестко заданное имя может вызвать ошибку. В таком случае разберем, как сформировать путь динамически:
ЭтотОбъект.ИмяФормы:
&НаКлиенте
Процедура ОткрытьДополнительнуюФорму()
// Извлекаем префикс пути к обработке из текущей формы
БазовыйПуть = Лев(ЭтотОбъект.ИмяФормы, СтрНайти(ЭтотОбъект.ИмяФормы, ".Форма.") + 6);
ИмяВторойФормы = БазовыйПуть + "ФормаНастроек";
ПараметрыОткрытия = Новый Структура;
ОткрытьФорму(ИмяВторойФормы, ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция ПолучитьПутьКоВторойФорме()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ИмяВнешнейОбработки = ОбъектОбработки.Метаданные().Имя;
Возврат "ВнешняяОбработка." + ИмяВнешнейОбработки + ".Форма.ФормаНастроек";
КонецФункции
Если разработка ведется для обычных форм толстого клиента (платформа 1С 8.3 в режиме обычного приложения или 1С 8.2), синтаксис отличается. В этом режиме форма получается непосредственно у объекта обработки методом ПолучитьФорму:
// Вариант для обычных форм толстого клиента
Форма = ПолучитьФорму("ФормаНастроек");
Форма.Открыть();
Обратите внимание: в управляемом интерфейсе вызов метода ПолучитьФорму на клиенте вызовет ошибку «Метод объекта не обнаружен», так как в управляемых формах работа ведется исключительно через ОткрытьФорму.
Проанализируем важный нюанс управляемых форм: при вызове метода ОткрытьФорму платформа создает новый независимый экземпляр объекта внешней обработки. Значения реквизитов и табличных частей из текущей формы автоматически во вторую форму не переносятся.
Чтобы организовать обмен данными между формами, выполним следующие шаги:
ПоместитьВоВременноеХранилище и передаем адрес хранилища в параметрах метода ОткрытьФорму. Во второй форме в событии ПриСозданииНаСервере считываем данные из хранилища и заполняем реквизиты.Оповестить или ОповеститьОВыборе), либо через передачу структуры ОписаниеОповещения в метод открытия.Если разделение на две формы нужно лишь для переключения сценариев интерфейса или показа настроек, более простым решением часто является использование одной управляемой формы с переключением закладок (элемент формы «Страницы»). Это избавляет от необходимости вручную синхронизировать данные между независимыми экземплярами внешней обработки.