Каталог решений - Еще раз о расшифровке для СКД

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

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

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

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

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


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

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

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

has been added to your cart:
Оформление заказа