Каталог решений - Чистка пользовательских настроек динамического списка после удаления полей

Чистка пользовательских настроек динамического списка после удаления полей

Чистка пользовательских настроек динамического списка после удаления полей

В наличии

После программной модификации, а именно удаления полей динамического списка, в пользовательском режиме, если у пользователя были свои настройки списка (отборы, сортировки и т.д.) получаем ошибку о недоступности Полей: Параметры отбора, сортировки, группировки или список отображаемых полей заданы неверно.

Категория:

Описание

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

После модификации динамического списка проходим по пользовательским настройкам Отбор, Сортировка, Условное оформление, Группировка и ищем выбранные пользователем поля среди соответствующих коллекций доступных полей. В случае их отсутствия — удаляем:

&НаСервере
Процедура МодификацияДинамическогоСписка()
	//
	//Модификация списка
	//
	ДСписок = "СписокНоменклатура";
	КоллекцияДляПроверки = ЭтотОбъект[ДСписок].КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
	УдалитьНедоступныеПоля(КоллекцияДляПроверки);
КонецПроцедуры

&НаСервере
Функция УдалитьНедоступныеПоля(КоллекцияДляПроверки, ДоступныеЭлементы = Неопределено, Родитель = Неопределено)
	ЕстьНедоступный = Ложь;
	Для Сч = -(КоллекцияДляПроверки.Количество() - 1) ПО 0 Цикл
		Элемент = КоллекцияДляПроверки[-Сч];
		//отборы, по отборам не удаляю группы, в случае наличия в них недоступных полей, удаляю только сами поля, не проверяю
		//группу на пустоту, возможно в некоторых случаях необходимо - расскоментить ниже
		Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда       
			ЕстьНедоступный = УдалитьНедоступныеПоля(Элемент.Элементы, Элемент.ДоступныеПоляОтбора, Элемент);
		ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда	
			ЕстьНедоступный = УдалитьНедоступныеПоля(Элемент.Элементы, ДоступныеЭлементы, Элемент);
			//Если ЕстьНедоступный Тогда            //если нужно удалить группу в случае присутствия в ней недоступных
			//	Родитель.Элементы.Удалить(Элемент);	
			//КонецЕсли;
		ИначеЕсли ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")       
							И ДоступныеЭлементы.НайтиПоле(Элемент.ЛевоеЗначение) = Неопределено Тогда
			Родитель.Элементы.Удалить(Элемент);
			ЕстьНедоступный = Истина;
			
		//Сортировка	
		ИначеЕсли ТипЗнч(Элемент) = Тип("ПорядокКомпоновкиДанных") Тогда
			УдалитьНедоступныеПоля(Элемент.Элементы, Элемент.ДоступныеПоляПорядка, Элемент);
		ИначеЕсли ТипЗнч(Элемент) = Тип("ЭлементПорядкаКомпоновкиДанных") 
							И ДоступныеЭлементы.НайтиПоле(Элемент.Поле) = Неопределено Тогда
			Родитель.Элементы.Удалить(Элемент); 
			
		//условное оформление, удаляем элемент условного оформления в случае недоступных полей в полях и в отборах
		ИначеЕсли ТипЗнч(Элемент) = Тип("УсловноеОформлениеКомпоновкиДанных") Тогда
			УдалитьНедоступныеПоля(Элемент.Элементы,,Элемент);
		ИначеЕсли ТипЗнч(Элемент) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда
			ЕстьНедоступныйОтбор 	= УдалитьНедоступныеПоля(Элемент.Отбор.Элементы, Элемент.Отбор.ДоступныеПоляОтбора, Элемент.Отбор);		
			ЕстьНедоступныйПоля 	= УдалитьНедоступныеПоля(Элемент.Поля.Элементы, Элемент.Поля.ДоступныеПоляОформляемыхПолей, Элемент.Поля);		
			Если ЕстьНедоступныйПоля ИЛИ ЕстьНедоступныйОтбор Тогда
				Родитель.Элементы.Удалить(Элемент);	
			КонецЕсли;
		ИначеЕсли ТипЗнч(Элемент) = Тип("ОформляемоеПолеКомпоновкиДанных") 
			                И ДоступныеЭлементы.НайтиПоле(Элемент.Поле) = Неопределено Тогда
			Родитель.Элементы.Удалить(Элемент);
			ЕстьНедоступный = Истина;			
			
		//Группировки
		ИначеЕсли ТипЗнч(Элемент) = Тип("СтруктураНастроекКомпоновкиДанных") Тогда
			УдалитьНедоступныеПоля(Элемент.Структура,,Элемент);	
		ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппировкаКомпоновкиДанных") Тогда
			УдалитьНедоступныеПоля(Элемент.УсловноеОформление.Элементы);
			УдалитьНедоступныеПоля(Элемент.Порядок.Элементы, Элемент.Порядок.ДоступныеПоляПорядка, Элемент.Порядок);
			ЕстьНедоступныйОтборы 		= УдалитьНедоступныеПоля(Элемент.Отбор.Элементы, Элемент.Отбор.ДоступныеПоляОтбора, Элемент.Отбор);
			ЕстьНедоступныйГруппировки 	= УдалитьНедоступныеПоля(Элемент.ПоляГруппировки.Элементы, Элемент.ПоляГруппировки.ДоступныеПоляПолейГруппировок, Элемент.ПоляГруппировки);
			Если ЕстьНедоступныйГруппировки ИЛИ ЕстьНедоступныйОтборы Тогда
				Родитель.Структура.Удалить(Элемент);
				ЕстьНедоступный = Истина;
			КонецЕсли;			
		ИначеЕсли ТипЗнч(Элемент) = Тип("ПолеГруппировкиКомпоновкиДанных") 
							И ДоступныеЭлементы.НайтиПоле(Элемент.Поле) = Неопределено Тогда
			Родитель.Элементы.Удалить(Элемент);
			ЕстьНедоступный = Истина;
		КонецЕсли;          
	КонецЦикла;
	Возврат ЕстьНедоступный;
КонецФункции

 

has been added to your cart:
Оформление заказа