Как программно установить отбор в СКД Код 1C v 8.х Процедура ВашРеквизитПриИзменении(Элемент)
СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); //сюда впихнуть нужный вид сравнения
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("%Нужное поле компоновки%"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.ВСписке); // вид сравнения
Если ЗначениеЗаполнено(Кампейны) тогда
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
Иначе
СоответствиеНовогоОтбора.Вставить("Использование",Ложь);
КонецЕсли;
СоответствиеНовогоОтбора.Вставить("Значение",Кампейны);
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
КонецПроцедуры
Процедура ИзменитьОтбор(ЭлементСтруктуры, СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
Иначе
НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных(нПоле);
НовыйЭлементОтбора.ЛевоеЗначение = нПоле;
НовыйЭлементОтбора.Использование = нИспользование;
НовыйЭлементОтбора.ВидСравнения = нВидСравнения;
НовыйЭлементОтбора.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Категория:
Схема Компоновки Данных Как программно Изменить Отбор в отчете СКД Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:
Код 1C v 8.х КомпоновщикНастроек. Настройки. Отбор. Элементы
в отличие от аналогичной коллекции параметров, не имеет метода Найти(). Можно конечно изменять отбор «в лоб», т.е. по индексу, но это не есть хорошо. Самый оптимальный вариант, обходить все поля отбора в цикле.
Приведу пример универсальной функции для изменения отбор компоновки данных:
Код 1C v 8.х
Процедура ИзменитьОтбор(ЭлементСтруктуры,
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч( ЭлементСтруктуры) = Тип( "КомпоновщикНастроекКомпоновкиДанных" ) Тогда
Отбор = ЭлементСтруктуры. Настройки. Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли ;
Если ТипЗнч( СоответствиеНовогоОтбора["ЛевоеЗначение" ]) = Тип( "Строка" ) Тогда
нПоле = Новый ПолеКомпоновкиДанных( СоответствиеНовогоОтбора. ЛевоеЗначение) ;
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение" ];
КонецЕсли ;
Если СоответствиеНовогоОтбора. Получить( "ВидСравнения" ) = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения" ];
КонецЕсли ;
Если СоответствиеНовогоОтбора. Получить( "Использование" ) = Неопределено Тогда
нИспользование = Истина ;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование" ];
КонецЕсли ;
нЗначение = СоответствиеНовогоОтбора["Значение" ];
ТолькоПоЛевомуЗначению = Ложь ;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина ;
КонецЕсли ;
сЛевоеЗначение = СоответствиеПоискаОтбора. Получить( "ЛевоеЗначение" ) ;
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли ;
сВидСравнения = СоответствиеПоискаОтбора. Получить( "ВидСравнения" ) ;
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли ;
сИспользование = СоответствиеПоискаОтбора. Получить( "Использование" ) ;
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли ;
Для каждого ЭлементОтбора Из Отбор. Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать ;
Иначе
Если ( ЭлементОтбора. ЛевоеЗначение = сЛевоеЗначение)
И ( ЭлементОтбора. ВидСравнения = сВидСравнения)
И ( ЭлементОтбора. Использование = сИспользование) Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Если НайденныйОтбор < > Неопределено Тогда
НайденныйОтбор. ЛевоеЗначение = нПоле;
НайденныйОтбор. Использование = нИспользование;
НайденныйОтбор. ВидСравнения = нВидСравнения;
НайденныйОтбор. ПравоеЗначение = нЗначение;
КонецЕсли ;
КонецПроцедуры
Пример вызова процедуры:
Код 1C v 8.х СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора. Вставить( "ЛевоеЗначение" , Новый ПолеКомпоновкиДанных( "Наименование" ) ) ;
СоответствиеПоискаОтбора. Вставить( "ВидСравнения" , ВидСравненияКомпоновкиДанных. Содержит) ;
СоответствиеПоискаОтбора. Вставить( "Использование" , Истина ) ;
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора. Вставить( "ЛевоеЗначение" , Новый ПолеКомпоновкиДанных( "Наименование" ) ) ;
СоответствиеНовогоОтбора. Вставить( "ВидСравнения" , ВидСравненияКомпоновкиДанных. Содержит) ;
СоответствиеНовогоОтбора. Вставить( "Использование" , Истина ) ;
СоответствиеНовогоОтбора. Вставить( "Значение" , "бла-бла-бла" ) ;
ИзменитьОтбор( КомпоновщикНастроек, СоответствиеПоискаОтбора, СоответствиеНовогоОтбора) ;
Автор:
also Категория:
Схема Компоновки Данных