Отбор в динамическом списке по нескольким полям

1. Gendelf 07.09.18 11:17 Сейчас в теме
Добрый день, 1с 8.3 КА 2.4
В динамическом списке, есть фильтры. Но каждый из них перекрывает другой, пытаюсь сделать, чтобы работали они одновременно и корректно.

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


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


Проблема в том что ГруппаОтбора должна быть определена только раз, но как это сделать?
Через ПользовательскиеНастройки тоже не получилось, там при каждом переключении статуса только и добавляются настройки, хотя по хорошему Статус = "1", должнен замениться на Статус = "2", а получаем отбор в виду Статус = "1", статус = "2" и в итого пустой результат. Очистить отбор мы не можем, т.к сотрется первый отбор по Заявителю.
По теме из базы знаний
Найденные решения
3. dandykry 12 07.09.18 11:46 Сейчас в теме
(1) Пробовали делать через

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка() ?

Собственно там есть много процедур, которые делают все тоже самое.

Не изобретайте велосипед
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. dandykry 12 07.09.18 11:46 Сейчас в теме
(1) Пробовали делать через

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка() ?

Собственно там есть много процедур, которые делают все тоже самое.

Не изобретайте велосипед
6. Gendelf 07.09.18 12:31 Сейчас в теме
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Статус", ОтборСтатус, ВидСравненияКомпоновкиДанных.Равно, , Истина);

(3) Отбор работает хорошо, но отменить отбор не получается. Пробую так:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Статус", ОтборСтатус, ВидСравненияКомпоновкиДанных.Равно, , Ложь);

и
ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(Список, "Статус");


С помощью кода
ЭтаФорма.Список.Отбор.Элементы.Очистить();
очищаются все отборы =/
9. Gendelf 07.09.18 14:34 Сейчас в теме
(6) В итого получилось
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Статус", ОтборСтатус, ВидСравненияКомпоновкиДанных.Равно, , ЗначениеЗаполнено(ОтборСтатус)); 
11. agent00mouse 257 10.11.22 15:40 Сейчас в теме
(3) А если функция отрабатывает. Галка с заголовком появляется, а тип сравнения и правое значение отсутствуют. как на форме списка, так и на форме настройки списка. Куда капать?
12. dandykry 12 16.11.22 15:56 Сейчас в теме
(11) Без скриншотов непонятно. Похоже на то, что установили представление настройки
2. soft_wind 07.09.18 11:43 Сейчас в теме
попробуйте перед установкой отборов, просто чистить старые отборы!
всего одна команда

Список.Отбор.Элементы.Очистить();
4. Gendelf 07.09.18 11:49 Сейчас в теме
(2) раньше так и работало, но мне нужны старые отборы, тк. их может быть 2-3 одновременно, по Заявителю, по Статусу и т.п.
5. soft_wind 07.09.18 11:52 Сейчас в теме
тогда при добавлении "нового" отбора надо делать сначала поиск этого элемента отбора
если нашли то изменить/установить у него новое правое значение
если не нашли то добавить как обычно
7. Gendelf 07.09.18 12:32 Сейчас в теме
(5) вот с поиском как раз проблема, как его найти? и установить новое значение или очистить вовсе?
8. soft_wind 07.09.18 12:41 Сейчас в теме
попробуйте такую процедуру, в каких-то отчетах я ее использовал, возможно для вашего случая (с группами) потредуется небольшая допилка
Процедура УстановитьЗначениеОтбора(лкОтборы, ИмяПоля, ВидОперации = Неопределено, ЗначениеПоля = Неопределено, ИспользоватьОтбор = Неопределено)

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот