Имя: Пароль:
1C
1С v8
Создать программно вариант отчета на СКД копированием
0 Xammsa
 
25.10.20
10:58
Добрый день!
Создал отчет на СКД с одним вариантом (Основной). Создаю ещё один вариант отчета программно, такой же по структуре, как и Основной (СхемаКомпоновкиДанных.ВариантыНастроек.Добавить() и т.д.).
Приходится вручную добавлять группировки, отборы и прочее.
Как можно упростить этот процесс?
1 Droning1C
 
25.10.20
12:02
ВариантыНастроекКомпоновкиДанных, метод Получить
ВариантыНастроекКомпоновкиДанных, метод Добавить
ВариантыНастроекКомпоновкиДанных, метод Вставить
ВариантыНастроекКомпоновкиДанных, метод Удалить
ВариантыНастроекКомпоновкиДанных, метод Индекс
ВариантыНастроекКомпоновкиДанных, метод Сдвинуть
2 Smallrat
 
25.10.20
16:40

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

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

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

НовыйВариант = Схема.ВариантыНастроек.Добавить();
НовыйВариант.Имя = "НовыйВариант";
НовыйВариант.Представление = "Новый вариант";
    
КомпоновкаДанныхКлиентСервер.СкопироватьНастройкиКомпоновкиДанных(НовыйВариант.Настройки, Схема.ВариантыНастроек.СтарыйВариант.Настройки);
4 Smallrat
 
25.10.20
16:44
а еще можно сериализовать схему, скопировать ветку <settingsVariant> и десериализовать обратно
5 Xammsa
 
25.10.20
18:03
(2) То, что надо, спасибо!
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn