Удалить недоступные отборы

SeiOkami 469 5 11 10

Рекурсивно удаляет недоступные элементы из коллекции отборов Написан для статьи "Как ограничить поля отбора в динамическом списке и ничего не сломать" https://infostart.ru/public/1226445/?ref=1159 Пример использования для ДС: Список.УстановитьОграниченияИспользованияВОтборе(ЗапрещенныеВОтбореПоля); УдалитьНедоступныеОтборы(Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы);


// Рекурсивно удаляет недоступные элементы из коллекции отборов
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/15
//
// Написан для статьи Как ограничить поля отбора в динамическом списке и ничего не сломать: 
// https://infostart.ru/public/1226445/?ref=1159
//
// Параметры:
//  Коллекция  - КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных - Коллекция элементов отбора.
//  ДоступныеПоляОтбора  - Неопределено, ДоступныеПоляКомпоновкиДанных - Список доступных полей отбора. При первоначальном вызове не передаётся.
//
// Пример:
//	Список.УстановитьОграниченияИспользованияВОтборе(ЗапрещенныеВОтбореПоля);
//	УдалитьНедоступныеОтборы(Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы);
//    
Процедура УдалитьНедоступныеОтборы(Знач Коллекция, Знач ДоступныеПоляОтбора = Неопределено) Экспорт
	
	УдаляемыеЭлементы = Новый Массив; // Массив из ЭлементОтбораКомпоновкиДанных
	
	Для Каждого ТекущиеДанные Из Коллекция Цикл
		
		Если ТипЗнч(ТекущиеДанные) = Тип("ОтборКомпоновкиДанных") Тогда
			
			УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ТекущиеДанные.ДоступныеПоляОтбора);
			
		ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
			
			УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ДоступныеПоляОтбора);
			                 
		ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			
			Если НЕ ТекущиеДанные.Использование Тогда
				Продолжить;
			КонецЕсли;
			
			Для Каждого ИмяСвойства Из СтрРазделить("ЛевоеЗначение,ПравоеЗначение",",") Цикл
				
				ТекущееПоле = ТекущиеДанные[ИмяСвойства]; // ПолеКомпоновкиДанных
				Если ТипЗнч(ТекущееПоле) = Тип("ПолеКомпоновкиДанных") 
					И ДоступныеПоляОтбора.НайтиПоле(ТекущееПоле) = Неопределено Тогда
					
					УдаляемыеЭлементы.Добавить(ТекущиеДанные);
					Прервать;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Для Каждого УдаляемыйЭлемент Из УдаляемыеЭлементы Цикл
		Коллекция.Удалить(УдаляемыйЭлемент);
	КонецЦикла;
	
КонецПроцедуры
0

См. также

УдалитьЭлементыГруппыОтбора (БСП)

УдалитьЭлементыГруппыОтбораДинамическогоСписка (БСП)

ПриНедоступностиПодключенияИПП (БСП)

УдалитьСтрокиТаблицыЗначений

РазделенныеДанныеНедоступны (БСП)

НедоступныеВидыПубликации (БСП)

НедоступныеРоли (БСП)

НедоступныеРолиПоТипуПользователя (БСП)

ПриЗаполненииНедоступныхВидовПубликации (БСП)

Модератору