helpf.pro
Регистрация
 +1 
Распечатать

Как программно Изменить Отбор в отчете СКД

Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:
Код 1C v 8.х
 КомпоновщикНастроек.Настройки.Отбор.Элементы   

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

Приведу пример универсальной функции для изменения отбор компоновки данных:
Код 1C v 8.х
 //Ищет отбор в компоновщике настроек по параметрам, заданным через
//"СоответствиеПоискаОтбора", и заменяет
//на отбор с параметрами, указанными в "СоответствиеНовогоОтбора"
Процедура ИзменитьОтбор(ЭлементСтруктуры, 
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

Автор: also
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 45527
 +1 
Распечатать
Возможно, вас также заинтересует
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Автоматизация обмена данных используя обработку "Универсальный обмен данными в формате XML" 12
Автоматизация обмена между базами используя обработку " Универсальный обмен данными в формате XML" В основу данной публикации положены найденные мною материалы по cозданию обмена между двумя базами с использованием обработки " Универсальный обме
Быстрый отбор в справочнике по первой букве 0
В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды. https://helpf.pro/uploads/img/_1-T4ZDj6uNPX.png // ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ НаКлиенте
Внешние обработки, печатные формы, обработки по заполнению табличных частей 3
Справочник «Внешние обработки, печатные формы, обработки по заполнению табличных частей» содержит список произвольных обработок, произвольных отчетов, дополнительных печатных форм, обработок для заполнения ТЧ объектов, обработок, подключаемых к отч
Восстановление партионного учета в УТ 1
Проблема следующая: при выполнении стандартной обработки " проведение по партиям" , непонятно почему, но граница актуальности партионного учета не сдвигается, хотя при перепроведении документов никаких ошибок не возникает. Оказывается: дата гр
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!