Тема работы с расшифровкой, когда отчет формируется с помощью программного кода, отнюдь не нова. Тем не менее, предложенное решение отличается рядом важных деталей и по этой причине имеет право быть представленным на суд читателей.
И так, есть форма c табличным полем, в которое по команде выводится отчет, формируемый с применением схемы компоновки данных и программного кода. Приведем функцию, выполняемую на сервере, в которой вызывается макет со схемой компоновки данных и заполняется табличный документ с данными отчета .
Функция СгенерироватьОтчет(ДанныеРасшифровки) экспорт
ТаблДок=новый ТабличныйДокумент;
ИмяШаблона="ИмяШаблонаСоСхемой";
СКД=ПолучитьМакет(ИмяШаблона);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки=новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД,СКД.НастройкиПоУмолчанию,ДанныеРасшифровки,,
Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
ПроцессорВывода= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТаблДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ТаблДок.ТолькоПросмотр=Истина;
возврат ТаблДок;
КонецФункции
Для нас важно то, что функция вызывается с параметром ДанныеРасшифровки. Через этот параметр возвращается содержимое объекта с типом ДанныеРасшифровкиКомпоновкиДанных. Этот объект создается на сервере и мы не можем вернуть его в клиентскую часть нашей программы напрямую. Необходимо воспользоваться механизмом сериализации.
&НаСервере
Функция ЗапросСКДНаСервере()
перем мРасшифровка;
// Вставить содержимое обработчика.
Lib=РеквизитФормыВЗначение("Объект");
TD=Lib.СгенерироватьОтчет(мРасшифровка);
ТД.Очистить();
ТД.Вывести(TD);
//подготовим данные расшифровки для сохранения на клиенте
WriteXML = Новый ЗаписьXML ;
WriteXML.УстановитьСтроку() ;
СериализаторXDTO.ЗаписатьXML(WriteXML,мРасшифровка);
сообщение=WriteXML.Закрыть();
возврат сообщение;
КонецФункции
&НаКлиенте
Процедура ЗапросСКД(Команда)
ДанныеРасшифровкиXML=ЗапросСКДНаСервере();
КонецПроцедуры
Строковое представление данных расшифровки сохраним в реквизит формы ДанныеРасшифровкиXML с типом строка.
Первая часть нашего плана выполнена, мы сохранили данные расшифровки на клиенте. На следующем шаге создадим для поля табличного документа, в который выводится отчет, обработчик события ОбработкаРасшифровки.
&НаСервере
Функция ВозвратитьДанныеРасшифровки(Расшифровка)
ReadXML = Новый ЧтениеXML;
ReadXML.УстановитьСтроку(ДанныеРасшифровкиXML);
мДанные = СериализаторXDTO.ПрочитатьXML(ReadXML);
ReadXML.Закрыть();
ЭлементРасшифровки = мДанные.Элементы[Расшифровка];
Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
возврат Поле.Значение;
КонецЦикла;
КонецЕсли;
возврат неопределено
КонецФункции
&НаКлиенте
Процедура ТДОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
// Вставить содержимое обработчика.
СтандартнаяОбработка = Ложь;
Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда
ЭлементРасшифровки=ВозвратитьДанныеРасшифровки(Расшифровка);
если ЭлементРасшифровки<>неопределено тогда
ПоказатьЗначение(,ЭлементРасшифровки);
конецесли;
КонецЕсли;
КонецПроцедуры
В чем здесь хитрость ? Мы можем вытащить элемент расшифровки из данных расшифровки только на сервере. Поэтому создаем дополнительную серверную функцию ВозвратитьДанныеРасшифровки(Расшифровка). В нее в качестве параметра передаются данные расшифровки для ячейки, по которой пользователь щелкнул "мышью". В этой функции мы на первом шаге преобразуем строковое представление данных расшифровки в объект типа ДанныеРасшифровкиКомпоновкиДанных (а сделать мы это можем только на сервере) и затем возвращаем в клиентскую часть элемент расшифровки, который надо отобразить. Предложенное решение будет работать как на толстом, так и на тонком клиенте.