Как изменить отбор программно

Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:

КомпоновщикНастроек.Настройки.Отбор.Элементы

в отличие от аналогичной коллекции параметров, не имеет метода Найти(). Можно конечно изменять отбор “в лоб”, т.е. по индексу, но это не есть хорошо. Самый оптимальный вариант — обходить все поля отбора в цикле.

Приведу пример универсальной функции для изменения отбор компоновки данных:

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

Пример вызова процедуры:

СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",	Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",	ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеПоискаОтбора.Вставить("Использование",	Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",	Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения", 	ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеНовогоОтбора.Вставить("Использование", 	Истина);
СоответствиеНовогоОтбора.Вставить("Значение", 		"бла-бла-бла");
 
ИзменитьОтбор(КомпоновщикНастроек, СоответствиеПоискаОтбора, СоответствиеНовогоОтбора);
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии