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

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

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


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


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

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

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

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

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

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

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

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

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


С помощью кода
ЭтаФорма.Список.Отбор.Элементы.Очистить();
очищаются все отборы =/
9. Gendelf 07.09.18 14:34 Сейчас в теме
(6) В итого получилось
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Статус", ОтборСтатус, ВидСравненияКомпоновкиДанных.Равно, , ЗначениеЗаполнено(ОтборСтатус)); 
11. agent00mouse 255 10.11.22 15:40 Сейчас в теме
(3) А если функция отрабатывает. Галка с заголовком появляется, а тип сравнения и правое значение отсутствуют. как на форме списка, так и на форме настройки списка. Куда капать?
12. dandykry 10 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 Сейчас в теме
Оставьте свое сообщение

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