Имя: Пароль:
1C
1С v8
Изменение пользовательских настроек отбора СКД перед открытием отчета
0 s-n-a-y
 
28.10.20
13:55
Пытаюсь переопределить пользовательские настройки перед открытием отчета. Вот так работает

ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].ПравоеЗначение = МоеЗначение;

Проблема в том, что не могу найти нужный элемент по Представлению или по ЛевоеЗначение. Могу только по ИдентификаторПользовательскойНастройки. А этот идентификатор у под разными пользователями разный, но поле одно и тоже (после открытия отчета).  Можно ли по этому идентификатору как-то определить представление поля?
1 s-n-a-y
 
28.10.20
14:07
все нашел
2 CepeLLlka
 
28.10.20
14:09
(1)Нашёл, так напиши как нашёл, распиши всё, не ленись..

Сам же через полгода будешь гуглить, найдёшь свою тему, порадуешься :)
3 Радим1987
 
28.10.20
14:17
(2) Если ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Твое поле") тогда
4 fisher
 
28.10.20
14:28
Еще можно найти нужный элемент в обычных настройках, получить у него идентификатор пользовательской настройки и по нему получить уже элемент пользовательских настроек.
5 s-n-a-y
 
28.10.20
15:21
Как в (3) не получится. К сожалению у "ПользовательскиеНастройки.Элементы"   ЛевоеЗначение недоступно

Можно отыскать по идентификатору

вот типа процедура

Процедура ИзменитьЭлементПользовательскогоОтбора(ФормаОтчета, ИмяПоля, Значение)

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

КонецПроцедуры
6 s-n-a-y
 
28.10.20
15:22
то же самое в более полном варианте
&НаКлиенте
Процедура ИзменитьЭлементПользовательскогоОтбора(ФормаОтчета, ИмяПоля, Значение, ВидСравнения, Использование = истина)

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

КонецПроцедуры


&НаКлиенте
Процедура УстановитьЭлементПользовательскогоОтбора(ФормаОтчета, ИмяЭлемента, ЗначениеЭлемента, ВидСравнения, Использование = истина)

    ПолеКомпоновки = новый ПолеКомпоновкиДанных(ИмяЭлемента);
    Для Каждого ЭлементНастройки Из ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

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

КонецПроцедуры
7 s-n-a-y
 
28.10.20
15:25
по сути сделал как в (4)
8 fisher
 
28.10.20
16:08
Зачем же все перебирать. У коллекции элементов пользовательских настроек есть метод Найти, который находит по идентификатору пользовательской настройки.
9 s-n-a-y
 
28.10.20
17:02
(8) в отладчике ИдентификаторПользовательскойНастройки - это строка, конструктора из строки нету, поэтому перебор