Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Создать программно вариант отчета на СКД копированием

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

//
// Параметры:

//    НастройкиПриемник    - НастройкиКомпоновкиДанных, НастройкиВложенногоОбъектаКомпоновкиДанных
//        ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных, ГруппировкаДиаграммыКомпоновкиДанных,

//        ТаблицаКомпоновкиДанных, ДиаграммаКомпоновкиДанных - коллекция настроек КД, куда копируются настройки
//    НастройкиИсточник    - НастройкиКомпоновкиДанных, НастройкиВложенногоОбъектаКомпоновкиДанных

//        ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных, ГруппировкаДиаграммыКомпоновкиДанных,
//        ТаблицаКомпоновкиДанных, ДиаграммаКомпоновкиДанных - коллекция настроек КД, откуда копируются настройки

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

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

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

// Копирует элементы из одной коллекции в другую

//
// Параметры:

//    ПриемникЗначения    - КоллекцияЗначенийПараметровКомпоновкиДанных, ЗначенияПараметровДанныхКомпоновкиДанных - коллекция элементов КД, куда копируются параметры
//    ИсточникЗначения    - КоллекцияЗначенийПараметровКомпоновкиДанных, ЗначенияПараметровДанныхКомпоновкиДанных - коллекция элементов КД, откуда копируются параметры

//    ОчищатьПриемник        - Булево - признак необходимости очистки приемника
//

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

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

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

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

// Заполняет одну коллекцию элементов настроек на основании другой

//
// Параметры:

//    ПриемникЗначения    - КоллекцияЗначенийПараметровКомпоновкиДанных, ЗначенияПараметровДанныхКомпоновкиДанных - коллекция элементов КД, куда копируются параметры
//    ИсточникЗначения    - КоллекцияЗначенийПараметровКомпоновкиДанных, ЗначенияПараметровДанныхКомпоновкиДанных - коллекция элементов КД, откуда копируются параметры

//    ПервыйУровень        - ЗначенияПараметровДанныхКомпоновкиДанных - уровень структуры коллекции элементов КД для копирования параметров
//

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

   Smallrat
 
3 - 25.10.20 - 16:42
НовыйВариант = Схема.ВариантыНастроек.Добавить();
НовыйВариант.Имя = "НовыйВариант";
НовыйВариант.Представление = "Новый вариант";
    
КомпоновкаДанныхКлиентСервер.СкопироватьНастройкиКомпоновкиДанных(НовыйВариант.Настройки, Схема.ВариантыНастроек.СтарыйВариант.Настройки);

   Smallrat
 
4 - 25.10.20 - 16:44
а еще можно сериализовать схему, скопировать ветку <settingsVariant> и десериализовать обратно
   Xammsa
 
5 - 25.10.20 - 18:03
(2) То, что надо, спасибо!

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.