Имя: Пароль:
1C
1С v8
"Избитый" вопрос о программной расшифровке в СКД
0 Uchenica74
 
07.05.14
08:12
Доброе утро! Помогите пожалуйста найти ошибку при выводе расшифровки программно. 1,5 дня потратила, не могу найти, что только не пробовала.
Тем по этому вопросу очень много, я никак не могу собрать в одно!

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

У таб поля использую метод ОбработкаРасшифровки:

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

и здесь налетаю на ошибку "не найден элемент расшифровки
    Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,ДоступныеДействия);"

Меняю "Расшифровка" на "ДанныеРасшифровки.Элементы" и тут ошибка "Несоответствие типов (параметр номер '1')
    Настройки=ОбработкаРасшифровки.Выполнить(ДанныеРасшифровки.Элементы,ВыполненноеДействие,ДоступныеДействия)".

Чего хочет не пойму.
Пробовала конструкцию:
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
ТекДанные =  ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля().Значение;
Как только ее не крутила, не работает.

Заглянула в ДанныеРасшифровки.Элементы - там пусто. Должно быть так или нет?

Помогите пожалуйста.
1 goleaff2006
 
07.05.14
08:25
СтандартнаяОбработка = Ложь;
        ДополнительныеДействия = новый СписокЗначений;
        ДополнительныеДействия = ФормаВЛаделец.Отчет.СЗначОтчетыДляРасшифровки.скопировать();
        ДополнительныеДействия.Добавить("Расшифровка по заказу");
        ДополнительныеДействия.Добавить("Расшифровка по поступлению");
        ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ФормаВЛаделец.Отчет.ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(ФормаВЛаделец.Отчет.СхемаКомпоновкиДанных));
        РезультатВыполненияРасшифровки = ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,Неопределено,ДополнительныеДействия);
        РезультатВыполненияРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка,Новый ПолеКомпоновкиДанных("Номенклатура"));

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


                ТабДок.ТолькоПросмотр = Истина;
                ТабДок.ОтображатьГруппировки = Истина;
                ТабДок.ОтображатьЗаголовки= Истина;
                ТабДок.ОтображатьСетку = Ложь;
                ТабДок.Показать("Расшифровка Документ - регистратор");
2 goleaff2006
 
07.05.14
08:26
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; это лишнее
3 Hans
 
07.05.14
08:26
Я недавно делал такую херь, насколько помню у меня дынне расшифровки была глобальной переменной модуля.
4 Uchenica74
 
07.05.14
08:32
Ладно, значит мучиться мне дальше с этим((( попробую сделать ка как (1) и (3)
5 jsmith82
 
07.05.14
08:32
&НаСервере
Процедура НарисоватьОтчет(ИмяКоманды)
    
    Макет = Отчеты.Отчет1.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Настройки = Макет.НастройкиПоУмолчанию;
    
    // косвенная рутина по настройке компоновщика (отборы, параметры)    
    
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Макет, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    ЭтаФорма.ДокументРезультат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭтаФорма.ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    Адрес = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
    
КонецПроцедуры

&НаКлиенте
Процедура ДокументРезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ОткрытьЗначение(ПолучитьЗначение(Расшифровка));
    
КонецПроцедуры

Функция ПолучитьЗначение(Расшифровка)
    
    ДанныеРасшифровки = ПолучитьИзВременногоХранилища(Адрес);
    Возврат ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
    
КонецФункции