Еще раз о расшифровке для СКД

Публикация № 972186

Программирование - Практика программирования

СКД расшифровка управляемые формы

21
Программное управление расшифровкой для отчета, сформированного с помощью Системы Компоновки Данных.

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

И так, есть форма c табличным полем, в которое по команде выводится отчет, формируемый с применением схемы компоновки данных и программного кода.  Приведем функцию, выполняемую на сервере, в которой вызывается макет со схемой компоновки данных и заполняется табличный документ с данными отчета .

Функция СгенерироватьОтчет(ДанныеРасшифровки) экспорт
	ТаблДок=новый ТабличныйДокумент;
	
	
	
	ИмяШаблона="ИмяШаблонаСоСхемой";
	СКД=ПолучитьМакет(ИмяШаблона);
	
	
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	ДанныеРасшифровки=новый ДанныеРасшифровкиКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД,СКД.НастройкиПоУмолчанию,ДанныеРасшифровки,,
	Тип("ГенераторМакетаКомпоновкиДанных"));													
	
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
	
	ПроцессорВывода=  Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТаблДок);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	ТаблДок.ТолькоПросмотр=Истина;
	
	возврат ТаблДок;
КонецФункции

Для нас важно то, что функция вызывается с параметром ДанныеРасшифровки. Через этот параметр  возвращается содержимое объекта с типом ДанныеРасшифровкиКомпоновкиДанных. Этот объект создается на сервере и мы не можем вернуть его в клиентскую часть нашей программы напрямую. Необходимо воспользоваться механизмом сериализации.

&НаСервере
Функция ЗапросСКДНаСервере()
	перем мРасшифровка;
	// Вставить содержимое обработчика.
	Lib=РеквизитФормыВЗначение("Объект");
	TD=Lib.СгенерироватьОтчет(мРасшифровка);
	
	ТД.Очистить();
	ТД.Вывести(TD);
        
        //подготовим данные расшифровки для сохранения на клиенте   
	WriteXML = Новый ЗаписьXML                         ;
	WriteXML.УстановитьСтроку()                        ;
	СериализаторXDTO.ЗаписатьXML(WriteXML,мРасшифровка);
	
	
	сообщение=WriteXML.Закрыть();
	возврат сообщение;
КонецФункции

&НаКлиенте
Процедура ЗапросСКД(Команда)
	ДанныеРасшифровкиXML=ЗапросСКДНаСервере();
КонецПроцедуры

Строковое представление данных расшифровки сохраним в реквизит формы ДанныеРасшифровкиXML с типом строка.

Первая часть нашего плана выполнена, мы сохранили данные расшифровки на клиенте. На следующем шаге создадим для поля табличного документа, в который выводится отчет, обработчик события ОбработкаРасшифровки.

&НаСервере
Функция ВозвратитьДанныеРасшифровки(Расшифровка)
	
	ReadXML = Новый ЧтениеXML; 
	
	ReadXML.УстановитьСтроку(ДанныеРасшифровкиXML);
	мДанные = СериализаторXDTO.ПрочитатьXML(ReadXML);
	ReadXML.Закрыть();
	
	ЭлементРасшифровки = мДанные.Элементы[Расшифровка];
	Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
			Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
				возврат Поле.Значение;
			КонецЦикла;
	КонецЕсли;
	
	возврат неопределено
КонецФункции	


&НаКлиенте
Процедура ТДОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	// Вставить содержимое обработчика.
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда
		ЭлементРасшифровки=ВозвратитьДанныеРасшифровки(Расшифровка);
		если ЭлементРасшифровки<>неопределено тогда
			ПоказатьЗначение(,ЭлементРасшифровки);
		конецесли;
	КонецЕсли;

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

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

21

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. theWriter 02.01.19 11:41 Сейчас в теме
Здравствуйте!

В свое время столкнулись с такой же проблемой.
Но учитывая, что для работы в нашем случае нужен УОС , решили другим путем:

1. На форме Создали реквизит типа "КомпоновщикНастроекКомпоновкиДанных" и реквизит ДанныеРасшифровки произвольного типа.

2.Заполняем ТабДок:
	
	уос_ТиповыеОтчеты.ВывестиРезультатВТабличныйДокумент(ТабличныйДокумент, ДанныеРасшифровки, ОтчетОбъект);
	
	РезультатКомпоновкиОтчета = Новый Структура("ДанныеРасшифровки, ТабличныйДокумент, КомпоновщикНастроек", ДанныеРасшифровки, ТабличныйДокумент, ОтчетОбъект.КомпоновщикНастроек);


3. Запись значений
ДанныеРасшифровки 	= ЗначениеВСтрокуВнутр(СтруктураРезультат.ДанныеРасшифровки);		
	КомпоновщикУОС 		= СтруктураРезультат.КомпоновщикНастроек;


4. Получение обратно:
&НаСервере
Функция ПолучитьРасшифровку()
	
	ДанныеРасшифровки_ = ЗначениеИзСтрокиВнутр(ДанныеРасшифровки);

	ДанныеРасшифровки_.Настройки = КомпоновщикУОС.Настройки;
	
	Возврат ДанныеРасшифровки_;
	
КонецФункции
Показать
modernexpo; +1 Ответить
2. herfis 275 02.01.19 12:27 Сейчас в теме
Возможно, я после НГ еще в танке, но я не понял, какая вообще проблема решается (хотя статьи обычно с этого начинаются) и зачем нужно данные расшифровки запихивать в контекст формы. Почему их не держать во временном хранилище, аналогично тому как это делается "из коробки" для отчетов, а в контексте формы хранить только адрес?
par_62; Olenevod; +2 Ответить
Оставьте свое сообщение