Имя: Пароль:
1C
 
СКД : Скопировать отборы и параметры из одной схемы в другую
0 bvb
 
23.08.23
15:16
Суть решаемой задачи :
Есть отчет на СКД. Пользователь может задавать отборы самостоятельно и стандартно выводить результат в табличный документ
Но мне нужно с теми же отборами выгрузить этот же результат и в ТЗ
Воспользоваться тем же макетом и настройками я не могу ибо :
"Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений"

Нужно создать аналогичны макет но без таблиц и настройки для него :

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

Вопрос : Как мне скопировать отборы и параметры в новые настройки ?


ЗЫ : Получить текст запроса из макета не предлагать
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки   = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ТекстЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос;
1 Мультук
 
гуру
23.08.23
15:37
(0)

1) Создай вариант отчёта "Выгрузка в плоскую таблицу"
2) Настройки отбора можно скопировать, например вот так. Параметры -- напиши аналогичную процедуру

Например:

СкопироватьНастройкиОтбора(НастройкиКомпоновщика.Отбор.Элементы, Отбор.Элементы);

Процедура СкопироватьНастройкиОтбора(ОтборИсточник, ОтборПриемник)
    Для каждого ЭлементОтбора Из ОтборИсточник Цикл            
        Если тип("ГруппаЭлементовОтбораКомпоновкиДанных") = типЗнч(ЭлементОтбора) Тогда
            НовыйЭлемент = ОтборПриемник.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
            ЗаполнитьЗначенияСвойств(НовыйЭлемент, ЭлементОтбора);                        
            СкопироватьНастройкиОтбора(ЭлементОтбора.Элементы, НовыйЭлемент.Элементы);
        Иначе
            НовыйЭлемент = ОтборПриемник.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЗаполнитьЗначенияСвойств(НовыйЭлемент, ЭлементОтбора, "ИдентификаторПользовательскойНастройки, ЛевоеЗначение, ВидСравнения, ПравоеЗначение, Использование");                        
        КонецЕсли    
    КонецЦикла;
КонецПроцедуры
2 Галахад
 
гуру
23.08.23
15:42
3 Garykom
 
гуру
23.08.23
16:16
(0) тебе кто мешает вручную ТабДок перебрать и перенести в ТЗ?
4 rozer76
 
24.08.23
11:04
я так делаю

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

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

и вызов, например:

КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
НастройкаКомпоновщикаНастроекДляСхемыИнтеграции(КомпоновщикНастроек, "СхемаВыгрузкиСклады", "Склад", Параметры);
5 bvb
 
24.08.23
12:02
Блин я замучался...
Сделал отдельный КомпоновщикНастроек , чтобы манипуляции с ТЗ не влияли на настройки / перестроения основного варианта выводящегося в форму

Отборы заполняются из основного вариант - ОК
А вот с ПараметрыДанных проблема - в настройках варианта они не заполнены (почему не понятно...) а при попытке заполнить возникает ошибка :

Коллекция значений параметров не может изменять свой состав, так как она связана с доступными параметрами
6 bvb
 
24.08.23
12:03
Вот :
ДанныеРасшифровкиДляВарианта = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакетаДляВарианта = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    НастройкиОсновногоВарианта = КомпоновщикНастроек.Настройки;  
    
    //Создаем отдельный компоновщик , чтобы не "забивать" настройки компоновщика основной схемы в форме
    //Вдруг пользователь поменяет настройки и захочет перестроить отчет
    КомпоновщикНастроекДляВарианта = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроекДляВарианта.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    КомпоновщикНастроекДляВарианта.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Найти("БезТаблиц").Настройки);
    НастройкиДляВарианта = КомпоновщикНастроекДляВарианта.Настройки;
    
       
    НастройкиДляВарианта.Отбор.Элементы.Очистить(); //Нужно очистить так как там отбор из варианта. можно очистить сразу в варианте
    СкопироватьНастройкиОтбора(НастройкиОсновногоВарианта.Отбор.Элементы, НастройкиДляВарианта.Отбор.Элементы);
    
    //НастройкиВарианта.ПараметрыДанных.Элементы.Очистить();  
    //Вот здесь возникает ошибка : Коллекция значений параметров не может изменять свой состав, так как она связана с доступными параметрами
    СкопироватьПараметрыДанных(НастройкиОсновногоВарианта.ПараметрыДанных.Элементы, НастройкиДляВарианта.ПараметрыДанных.Элементы);  
    
    МакетКомпоновки = КомпоновщикМакетаДляВарианта.Выполнить(СхемаКомпоновкиДанных, НастройкиДляВарианта, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровкиДляВарианта, ИСТИНА);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
7 Мультук
 
гуру
24.08.23
12:07
(6)

Список параметров (имена) априори одинаков. Разные только значения и "флажки"

Вместо "очищать" используйте "Найти" и т.п.
8 unenu
 
24.08.23
12:11
9 bvb
 
24.08.23
12:17
Все разобрался .   Туплю я.
Список параметров сформирован но не заполнен
Параметры нужно не ДОБАВЛЯТЬ а ИСКАТЬ И ЗАПОЛНЯТЬ.

Процедура СкопироватьПараметрыДанных(ПараметрыИсточник, ПараметрыПриемник)    Экспорт
    Для каждого ЭлементПараметров Из ПараметрыИсточник Цикл            
        ПараметрСКД = ПараметрыПриемник.Найти(ЭлементПараметров.Параметр);
        ПараметрСКД.Использование = ЭлементПараметров.Использование;
        ПараметрСКД.Значение  = ЭлементПараметров.Значение;
    КонецЦикла;
КонецПроцедуры
10 bvb
 
24.08.23
12:18
Все задача решена. Данный пост можно использовать как рабочий пример
11 yopQua
 
24.08.23
12:38
(3) :DDD
12 Garykom
 
гуру
24.08.23
13:07
(11) ничего смешного зачем дважды запросы выполнять/данные получать?
сначала в ТабДок затем отдельно в ТЗ

когда можно данные уже полученные их ТабДок перегнать в ТЗ
13 bvb
 
24.08.23
13:09
(12) А как достать значение например номенклатуры ?
14 toypaul
 
гуру
24.08.23
13:27
Если конфа на БСП, то

КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы

можно копировать и отбор и параметры и все остальное
15 rozer76
 
24.08.23
13:43
(14) в какой это версии?
16 rozer76
 
25.08.23
09:00
(15) нашел, спс )
17 rozer76
 
25.08.23
12:04
(8) будет ошибка в строке
"ОтборПриемник.ДоступныеПоляОтбора.НайтиПоле(ЭлементИсточник.ЛевоеЗначение) = Неопределено Тогда"
в случае когда ОтборПриемник это ГруппаЭлементовОтбораКомпоновкиДанных
Поправил:

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