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

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

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

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

//Ищет отбор в компоновщике настроек по параметрам, заданным через
//"СоответствиеПоискаОтбора", и заменяет
//на отбор с параметрами, указанными в "СоответствиеНовогоОтбора"
Процедура ИзменитьОтбор(ЭлементСтруктуры, 
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт

Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных")
 Тогда
    Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
    Отбор = ЭлементСтруктуры;
КонецЕсли;

Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") 
Тогда
    нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
    нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;

Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
    нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
    нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;

Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
    нИспользование = Истина;
Иначе
    нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;

нЗначение = СоответствиеНовогоОтбора["Значение"];

ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
    ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;

сЛевоеЗначение  =  СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
    сЛевоеЗначение = нПоле;
КонецЕсли;

сВидСравнения  =  СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
    сВидСравнения = ВидСравнения;
КонецЕсли;

сИспользование =  СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
    сИспользование = нИспользование;
КонецЕсли;

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

Если НайденныйОтбор <> Неопределено Тогда
    НайденныйОтбор.ЛевоеЗначение  = нПоле;
    НайденныйОтбор.Использование  = нИспользование;
    НайденныйОтбор.ВидСравнения   = нВидСравнения;
    НайденныйОтбор.ПравоеЗначение = нЗначение;
КонецЕсли;

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

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

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

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

    ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru