Имя: Пароль:
1C
 
Один отчет и несколько СКД
,
0 Demetres
 
12.05.15
15:55
Добрый день! Проблема с подменой основной СКД. В модуле объекта при ПриКомпоновкеРезультата меняю макет и вывожу в табличный документ результат, но при этом на почему-то не работает расшифровка и не выводятся параметры, список отборов появляется, но значения не привязаны к данным. Помогите разобраться.

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

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

КонецФункции
/////////////////////////////////
1 Demetres
 
12.05.15
16:05
Вверх, очень актуально
2 Demetres
 
12.05.15
16:18
Может не понятно проблему описал?
3 Demetres
 
12.05.15
16:20
Или пример есть у кого?
4 Demetres
 
12.05.15
16:36
Ребята в 1С кто-то разбирается?
5 Demetres
 
12.05.15
16:53
Если вдруг у кого идеи будут пишите я тут
6 DrShad
 
12.05.15
16:54
да какие тут идеи? пиши обработку расшифровки
7 Demetres
 
12.05.15
17:01
(6) Так а почему автоматом не работает? Почему отборы отображаются, а значения их не типизированы, и параметры не отображаются? Значит что-то не то делаю, помогите если разбираетесь в СКД.
8 Demetres
 
12.05.15
17:02
(6) Стандартная расшифровка там контекстное меню и пункт открыть для ссылочных типов а тут все пусто получается
9 DrShad
 
12.05.15
17:05
ну ты же подменил основную схему
10 Demetres
 
12.05.15
17:08
(9) А ДанныеРасшифровки я везде заполняю, должно же работать.
И почему только отборы отображаются а параметры нет?
11 DrShad
 
12.05.15
17:12
у тя данные расшифровки вообще из другой схемы и как оно их должно обработать?
12 Demetres
 
12.05.15
17:14
(11) Так получается что отчет можно сформировать только по основной СКД?
13 Demetres
 
12.05.15
17:16
(11) ... что бы и расшифровка работала и отборы с параметрами заполнялись нормально?
14 Demetres
 
12.05.15
17:37
Чтобы параметры и отборы правильно работали нужно писать так:

    НовУникальныйИдентификатор = Новый УникальныйИдентификатор;
    АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(Макет, НовУникальныйИдентификатор);

    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));
    КомпоновщикНастроек.ЗагрузитьНастройки(Макет.НастройкиПоУмолчанию);

А с расшифровкой так и не разобрался пока
15 Гёдза
 
12.05.15
17:42
тебе придется перехватывать расшифровку, ибо она привязывается к скд по умолчанию
16 Demetres
 
12.05.15
17:44
Понятно. Ладно дома почитаю умных книжек, напишу потом что получилось
17 Demetres
 
12.05.15
17:44
Понятно. Дома почитаю умных книжек, напишу потом что получилось
18 Demetres
 
12.05.15
17:44
Все спасибо
19 Demetres
 
12.05.15
17:44
Всем спасибо :)
20 Барматолог
 
12.05.15
17:54
чо спасибо то, вопрос то не решил.

ТЫ не указал - УП или обычное. А это важно, т.к. с УП ты соснешь тунца.
21 Demetres
 
12.05.15
20:19
(20) Дык никого в теме не было.
Да это УП, и почему не взлетит?
22 mistеr
 
12.05.15
20:27
(0) Насчет отборов - КомпоновщикНастроек наверное нужно инициализировать при смене схемы, не только при расшифровке.
23 Demetres
 
12.05.15
20:34
(22) чтобы отборы и параметры корректно отображались сделал в посте (14) писал, но расшифровка стандартная так и не появилась. Как её получить ума не приложу. Сижу курс по компоновке смотрю.
24 Demetres
 
12.05.15
20:41
Если у кого есть мысли по этому поводу, буду признателен, вопрос актуален.
25 Demetres
 
12.05.15
21:06
Стандартная расшифровка заработала, вот вариант кода где работают и отборы и расшифровка:

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

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

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

КонецФункции
//////////////////////
26 Demetres
 
12.05.15
22:50
А вот полный код:
//////////////////////////////////////////////////
//Модуль формы отчета
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
    
    ПараметрыОтчета = Новый Структура;
    ПараметрыСтр    = Новый Структура("ЗнчНаименование",     "Дима");
    Отборы             = Новый Структура("Ссылка",             ПредопределенноеЗначение("Справочник.Контагенты.Кормалитон"));
    ОтборСтр         = Новый Структура("Параметры, Отборы",     ПараметрыСтр, Отборы);    
    
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии",     Истина);
    ПараметрыОтчета.Вставить("Расшифровка",                 Истина);
    ПараметрыОтчета.Вставить("ОтборыИПараметры",             ОтборСтр);
    
    ОткрытьФорму("Отчет.ОСКВД.ФормаОбъекта", ПараметрыОтчета, ЭтаФорма);
    
КонецПроцедуры

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

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

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

КонецФункции

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

Всем спасибо за внимание, может кому-то пригодится.
27 ЧеловекДуши
 
13.05.15
08:05
(26) Благодарствую :)