Версия для печати темы (https://pro1c.org.ua/index.php?s=b6e62c900763add914c57db8d3f26e38&showtopic=3659)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Система компоновки данных _ Как изменить отбор программно

Автор: Vofka 23.05.11, 18:57

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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


http://pro1c.org.ua/redirect.php?http://1cskd.ru/2010/06/kak_izmenit_otbor_programmno/

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua