Имя: Пароль:
1C
 
СКД : Программно включить / выключить использование выбранных полей в настройках
0 bvb
 
18.03.26
10:54
Добрый день

Не могу добраться до выбранных полей обозначенных в самом отчете и в общем вертикальном итоге (на картинке выделено красным)
Могу добраться только до полей обозначенных в таблице  (на картинке выделено зеленым)

Управляю ими так :

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

                МассивПолейEUR = Новый Массив;
                МассивПолейEUR.Добавить("СуммаПоказателяEUR");
                МассивПолейEUR.Добавить("СуммаПоказателяСреднееEUR");

                Настройки   = КомпоновщикНастроек.ПолучитьНастройки();
                
                Для Каждого ЭлементСтруктурыНастроек ИЗ Настройки.Структура Цикл
                               ВыбраныеПоля = ЭлементСтруктурыНастроек.Выбор.Элементы;
                              
                               Для Каждого ВыбраноеПоле ИЗ ВыбраныеПоля Цикл
                                               Если KMS_ОбщийМодульСервер.ЕстьРеквизитОбъекта(ВыбраноеПоле, "Поле")  Тогда
                                                               Если МассивПолейРуб.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено И  ВыбраноеПоле.Использование <>  ВключатьПоказательРуб Тогда
                                                                               ВыбраноеПоле.Использование =  ВключатьПоказательРуб;
                                                               КонецЕсли;      
                                                              
                                                               Если МассивПолейEUR.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено  И  ВыбраноеПоле.Использование <>  ВключатьПоказательEUR Тогда
                                                                               ВыбраноеПоле.Использование =  ВключатьПоказательEUR;
                                                               КонецЕсли;      
                                               КонецЕсли;
                               КонецЦикла;    
                КонецЦикла;
                
                КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);  
                
КонецПроцедуры
1 Волшебник
 
18.03.26
10:55
Нет картинки
2 bvb
 
18.03.26
10:56
Картинка не вставляется
Пишет "Не удалось сохранить картинку (6)"

Раньше вставлялась

пробовал и .jpg .png
на разных компах под разными браузерами
3 Мультук
 
гуру
18.03.26
11:19
(0)
ЭлементСтруктурыНастроек тоже имеет свойство "Структура", внезапно правда?

А еще есть ТаблицаКомпоновкиДанных, которая имеет Строки и Колонки, которые опять же имеют свойство "Структура".

Итого: RTFM Рекурсия
4 bvb
 
18.03.26
11:50
(3) Спасибо

Осилил :

Для Каждого ЭлементСтруктурыНастроек ИЗ Настройки.Структура Цикл
        
        ВыбраныеПоля = ЭлементСтруктурыНастроек.Выбор.Элементы;
        
        Для Каждого ВыбраноеПоле ИЗ ВыбраныеПоля Цикл
            Если KMS_ОбщийМодульСервер.ЕстьРеквизитОбъекта(ВыбраноеПоле, "Поле")  Тогда
                Если МассивПолейРуб.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено И  ВыбраноеПоле.Использование <>  ВключатьПоказательРуб Тогда
                    ВыбраноеПоле.Использование =  ВключатьПоказательРуб;
                КонецЕсли;    
                
                Если МассивПолейEUR.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено  И  ВыбраноеПоле.Использование <>  ВключатьПоказательEUR Тогда
                    ВыбраноеПоле.Использование =  ВключатьПоказательEUR;
                КонецЕсли;    
            КонецЕсли;
        КонецЦикла;     //по полям
        
        ВыбранныеКолонки =    ЭлементСтруктурыНастроек.Колонки;
        Для Каждого ВыбранаяКолонка ИЗ ВыбранныеКолонки Цикл
            
            ВыбраныеПоля =  ВыбранаяКолонка.Выбор.Элементы;
            
            Для Каждого ВыбраноеПоле ИЗ ВыбраныеПоля Цикл
                Если KMS_ОбщийМодульСервер.ЕстьРеквизитОбъекта(ВыбраноеПоле, "Поле")  Тогда
                    Если МассивПолейРуб.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено И  ВыбраноеПоле.Использование <>  ВключатьПоказательРуб Тогда
                        ВыбраноеПоле.Использование =  ВключатьПоказательРуб;
                    КонецЕсли;    
                    
                    Если МассивПолейEUR.Найти(Строка(ВыбраноеПоле.Поле)) <> Неопределено  И  ВыбраноеПоле.Использование <>  ВключатьПоказательEUR Тогда
                        ВыбраноеПоле.Использование =  ВключатьПоказательEUR;
                    КонецЕсли;    
                КонецЕсли;
            КонецЦикла;
            
        КонецЦикла; //по колонкам
        
    КонецЦикла;  //По элементам структуры настроек
5 SleepyHead
 
гуру
18.03.26
14:10
(4) Это не рекурсия. Я делаю так, мне пока этого хватает

Процедура ВыключитьВидимостьПолейРекурсивно(Знач Стр, МассивПолей)
Перем Коллекция,ПодСтр;

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

    Если Коллекция=Неопределено Тогда
        Возврат
    КонецЕсли;

    Для Каждого ПодСтр Из Коллекция Цикл

        ВыключитьВидимостьПолейРекурсивно(ПодСтр,МассивПолей);

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

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

        Если ЕстьПоляОтбора Тогда
            Для Каждого Поле из ПодСтр.Отбор.Элементы Цикл
                ВыключитьВидимостьПолейРекурсивно(Поле,МассивПолей)
            КонецЦикла
        КонецЕсли
        
    КонецЦикла
КонецПроцедуры

Процедура ВыключитьВидимостьПолей(Поля)

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

    Для Каждого Поле из настройкиСКД.Структура Цикл
        ВыключитьВидимостьПолейРекурсивно(Поле,МассивПолей)
    КонецЦикла;

    Для Каждого Поле из НастройкиСКД.Выбор.Элементы Цикл
        ВыключитьВидимостьПолейРекурсивно(Поле,МассивПолей)
    КонецЦикла;

    Для Каждого Поле из НастройкиСКД.Порядок.Элементы Цикл
        ВыключитьВидимостьПолейРекурсивно(Поле,МассивПолей)
    КонецЦикла;

    ВыключитьВидимостьПолейРекурсивно(НастройкиСКД,МассивПолей)
КонецПроцедуры