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