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