Имя: Пароль:
1C
1С v8
v8: 8.2 Вопрос по СКД. Как обработать расшифровку, для разных схем в одном отчете.
,
0 DSSS
 
22.09.11
11:51
Доброго дня!
Ситуация следующая:
Есть внешняя обработка, у нее есть 2 СКД, на базе которых формируется 2 отчета, и эти отчеты выводятся в один табличный документ на форме обработки. Все формируется программно. Вопрос вот в чем: вот после того как отчеты сформированы, как сделать разную расшифровку, в зависимости от того, по какой ячейке кликает пользователь: по ячейке, которая относится к СКД 1 или по ячейке, которая относится к СКД 2?
Вот как это выглядит:

&НаКлиенте
Процедура Сформировать(Команда)
   СформироватьНаСервере();    
КонецПроцедуры

&НаСервере
Процедура СформироватьНаСервере()
   
   // Первая схема
   СхемаКомпоновкиДанных = ПолучитьСКДНаСервере(7);
   Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
   
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
   
   ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
   АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
   
   // Дальше вывод в таб. документ первой половины отчета
   
   // Вторая схема
   СхемаКомпоновкиДанных = ПолучитьСКДНаСервере(8);
   Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
   
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
   
   ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
   АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
   
   // Дальше вывод в таб. документ второй половины отчета
   
   Результат = ТабличныйДокумент;
   
КонецПроцедуры

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
   
   Перем ВыполненноеДействие;
   Перем ПараметрВыполненногоДействия;

   СхемаКомпоновкиДанных = ПолучитьСКДНаСервере(7);
   
   СтандартнаяОбработка     = Ложь;
   ОбработкаРасшифровки     = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресДанныхРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
   
   ДоступныеДействия        = Новый Массив;
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать);
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать);
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить);
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Сгруппировать);
   ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Оформить);
   
   ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыполненноеДействие,ПараметрВыполненногоДействия,ДоступныеДействия);
   
   Если ВыполненноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
       ОткрытьЗначение(ПараметрВыполненногоДействия);    
   КонецЕсли;
   
КонецПроцедуры

Вот в процедуре РезультатОбработкаРасшифровки сейчас написано:
СхемаКомпоновкиДанных = ПолучитьСКДНаСервере(7);
И соотв. расшифровка для обоих половинок отчета работает одинаково.

Подскажите, светлую мысль, откуда взять СКД в обработке расшифровки, если все что известно это ячейка по которой кликает пользователь?
Спасибо.
1 Axel2009
 
22.09.11
11:57
в макетах СКД можно задать вручную значение расшифровок.. и к ним привязываться
2 DSSS
 
22.09.11
12:05
(1) Спасибо. Можно подробней?
У меня нет макетов СКД. СКД 1 и СКД 2 получаются из xml-файлов.
3 DSSS
 
22.09.11
12:12
Можно, например, между половинками отчета вывести какой-нить разделитель, и при расшифровке шерстить вверх весь отчет и проверять ячейки на то, какой внутри текст:) но это жесть)))
4 Axel2009
 
22.09.11
12:17
задай переменную в которую после вывода 1го скд запоминай колво строк. при расшифровке сверяй
5 DSSS
 
22.09.11
12:22
(4) Да, согласен, это тоже вариант. Только вот смущает, что если отчетов будет не 2 а 32.. что-то вроде структуры наверно придется клепать.
А у табличного документа, точнее у ячейки, нет никаких таких свойств, которые можно было бы заполнить при выводе, ну например ИндексСКД для всех ячеек - или 1 или 2..)
6 Axel2009
 
22.09.11
12:23
расшифровка
7 DSSS
 
22.09.11
12:26
(6) Расшифровка это как я понимаю, какой-то внутренний идентификатор ячейки для механизмов СКД. его наверно не стоит менять.
8 Axel2009
 
22.09.11
12:27
другого идентификатора ячейки нет
9 DSSS
 
22.09.11
12:38
Обнаружил интересное сво-во у ячейки: маска
ОбластьЯчеекТабличногоДокумента (SpreadsheetDocumentRange)
Маска (Mask)
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит маску, которая используется при вводе значения ячейки.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Кто-нибудь знает, как можно добраться до области ячеек при выводе отчета в
ПроцессорВывода.НачатьВывод();
   Пока Истина Цикл
       ЭлементРезультата = ПроцессорКомпоновки.Следующий();
       Если ЭлементРезультата= Неопределено Тогда
           Прервать;    
       КонецЕсли;
       ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
   КонецЦикла;
   ПроцессорВывода.ЗакончитьВывод();
10 DSSS
 
22.09.11
12:55
Хотя может можно как-то разом установить эту самую маску при выводе половинки отчета, не обращаясь к ячейкам, а так, чтобы на всю область сразу.
Ошибка? Это не ошибка, это системная функция.