Как открыть вторую форму внешней обработки в управляемом приложении 1С

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

В этой статье мы рассмотрим способ, с помощью которого можно открыть вторую (а также третью, четвертую и т.д.) форму внешней обработки, не потеряв при этом данные, введенные на первой форме. Опустим моменты, связанные с созданием кнопок и процедур открытия форм и перейдем сразу к процедуре переноса данных из первой управляемой формы во вторую. Кстати, об открытии форм в управляемом приложении можно почитать тут.

Итак, первое, что нужно сделать — это поместить все данные внешней обработки, введенные на первой форме, в некоторое хранилище. Для этого используем функцию ПоместитьВоВременноеХранилище(). В нее нужно передать все данные внешней обработки. В целом код выглядит так:

&НаКлиенте
Процедура ОткрытьВторуюФорму ()

//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение("Объект");
СтруктураПараметров = Новый Структура;
Для каждого Реквизит из _Объект.Метаданные().Реквизиты Цикл
СтруктураПараметров.Вставить(Реквизит.Имя,Объект[Реквизит.Имя]);
КонецЦикла;

//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров.Вставить("РеквизитФормы1",РеквизитФормы1);
СтруктураПараметров.Вставить("ТабличнаяЧасть1",Объект["ТабличнаяЧасть1"].Выгрузить());

//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище(СтруктураПараметров,Новый УникальныйИдентификатор);

//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура("Адрес", АдресПередаваемыхПараметров);

//Создаем оповещение, которое сработает при закрытии второй формы,
//т.к. измененные в ней данные нужно передать обратно в первую.
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьЗакрытиеВторойФормы", ЭтаФорма);

//Ну и, наконец, открываем вторую форму
ОткрытьФорму("ВнешняяОбработка.ВыпускПроданнойПродукции.Форма.ФормаПараметровЗаполненияУПР", _Параметры, ЭтаФорма,,,,ОписаниеОповещения);

КонецПроцедуры

Теперь нужно во второй управляемой форме принять и обработать данные. Это делается через обработчик события ПриСозданииНаСервере().

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

//Получаем сохраненные в хранилище данные
СтруктураПараметров = ПолучитьИзВременногоХранилища(Параметры.Адрес);

//Загружаем табличную часть
Объект["ТабличнаяЧасть1"].Загрузить(СтруктураПараметров["ТабличнаяЧасть1"]);

//Загружаем реквизиты внешней обработки
_Объект = РеквизитФормыВЗначение("Объект");
Для каждого Реквизит из _Объект.Метаданные().Реквизиты Цикл
Объект[Реквизит.Имя] = СтруктураПараметров[Реквизит.Имя];
КонецЦикла;

КонецПроцедуры

При закрытии второй формы нужно сделать то же самое: собрать все данные в хранилище, передать в процедуру оповещения в первой форме и обработать там.

&НаКлиенте
Процедура ЗакрытьФорму()

//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение("Объект");
СтруктураПараметров = Новый Структура;
Для каждого Реквизит из _Объект.Метаданные().Реквизиты Цикл
СтруктураПараметров.Вставить(Реквизит.Имя,Объект[Реквизит.Имя]);
КонецЦикла;

//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров.Вставить("РеквизитФормы1",РеквизитФормы1);
СтруктураПараметров.Вставить("ТабличнаяЧасть1",Объект["ТабличнаяЧасть1"].Выгрузить());

//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище(СтруктураПараметров,Новый УникальныйИдентификатор);

//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура("Адрес", АдресПередаваемыхПараметров);

//Закрываем форму, передав параметры.
Закрыть(_Параметры);

КонецПроцедуры

А в первой форме создаем процедуру, для которой делали описание оповещения. В ней обрабатываем принятые данные.

&НаСервере
Процедура ОбработатьЗакрытиеВторойФормы (РезультатЗакрытия,Параметры) Экспорт

Если РезультатЗакрытия = Неопределено Тогда
Возврат;
КонецЕсли;

//Получаем данные из хранилища
СтруктураПараметров = ПолучитьИзВременногоХранилища(РезультатЗакрытия.Адрес);

//Загружаем данные
Объект["ТабличнаяЧасть1"].Загрузить(СтруктураПараметров["ТабличнаяЧасть1"]);

_Объект = РеквизитФормыВЗначение("Объект");
Для каждого Реквизит из _Объект.Метаданные().Реквизиты Цикл
Объект[Реквизит.Имя] = СтруктураПараметров[Реквизит.Имя];
КонецЦикла;

КонецПроцедуры

 

Как открыть вторую форму внешней обработки в управляемом приложении 1С: 2 комментария

  1. Алексей

    «&НаКлиенте
    Процедура ОткрытьВторуюФорму ()

    //Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
    _Объект = РеквизитФормыВЗначение(«Объект»);»

    РеквизитФормыВЗначение на клиенте?..

  2. kazimesh

    Открытие второй формы с тем же объектом — слишком сложное решение. Все проще.
    На первой форме передаем в параметры сам объект, например под именем ключ.
    На второй форме:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    КопироватьДанныеФормы(Параметры.Ключ,Объект);
    КонецПроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *