Имя: Пароль:
1C
1С v8
СКД - подскажите как скопировать отбор из одного варианта в другой.
0 RomaH
 
naïve
12.03.14
14:47
Суть - надо первый вариант показать, а второй выгрузить в ТЗ.
В первом получаю список сотрудников
во втором - список подразделений в которых эти сотрудники работают.

Как далаю
делаю в СКД два варианта
первый настраиваю на вывод - и с ним работает пользователь как с нормальной СКД
а второй - пользователь не видит - он нужен именно для спсика подразделений
но на него надо наложить отборы которые пользователь настроит для первого варианта

вот как скопировать отборы из первого варианта во второй?
1 RomaH
 
naïve
12.03.14
14:48
вывод "на печать":

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

    //Из схемы возьмем настройки по умолчанию
    //Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

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

    //Формируем макет, с помощью компоновщика макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    //Передаем в макет компоновки схему, настройки и данные расшифровки
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
                                            Настройки, ДанныеРасшифровки);

    //Выполним компоновку с помощью процессора компоновки
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,
                                                       ДанныеРасшифровки);

    //Очищаем поле табличного документа
    ДокументРезультат.Очистить();

    //Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
2 RomaH
 
naïve
12.03.14
14:49
дальше вроде должно быть:

КомпоновщикНастроекДанных .ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Подразделения);
3 RomaH
 
naïve
12.03.14
15:00
только рекурсивно обходя элементы отбора?
4 ParinovS
 
12.03.14
15:07
(3) только
5 RomaH
 
naïve
12.03.14
15:12
а кроме настрое, пользовательские настройки надо тоже копировать? или там отбора нет?
6 vmv
 
12.03.14
15:19
часть функционала перта и переписана, в общем модуле располагаем методы поддержки СКД

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Общий модуль: Add_СКД_КлиентСервер
//  Автор: vmv, 2013
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

...

//---  Методы общего назначения: СКД копирование элементов настроек

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

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

....

Пример вызова

    //5. Копируем ПорядокКомпоновкиДанных В Приемник(ОтчетОбъект.КомпоновщикНастроек.Настройки.Порядок) из Источник(ДсЖурналПлатежей.Порядок)  
    
        Add_СКД_КлиентСервер.СкопироватьЭлементыНастроекКд(ОтчетОбъект.КомпоновщикНастроек.Настройки.Порядок, ДсЖурналПлатежей.Порядок, Истина);
        
    //6. Копируем ОтборКомпоновкиДанных В Приемник(ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор) из Источник(ДсЖурналПлатежей.Отбор)  
    Add_СКД_КлиентСервер.СкопироватьЭлементыНастроекКд(ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор, ДсЖурналПлатежей.Отбор, Истина);
7 RomaH
 
naïve
12.03.14
15:33
а пользовательские настройки и фиксированные - тоже обходом копировать?
параметры и отборы интересуют