Как добавить отбор в пользовательскую настройку отчета

Мне нужно было, чтобы в отчетах, где есть поле «Заказ покупателя» добавлять при открытии в пользовательскую настройку отбор по ответственному заказа покупателя. В пользовательскую настройку, чтобы этот отбор был виден пользователю в универсальной форме отчета:

Однако выяснилось, что если такого отбора изначально нет в настройках, то и добавить его нельзя, при попытке просто добавить в пользовательские настройки я получал ошибку: «Коллекция пользовательских настроек не может изменять свой состав, так как она связана с настройками компоновки данных».

Я наткнулся на статью на мисте, где рекомендовали добавлять в отбор по-другому:

ПользовательскийОтбор = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);

ЭлементОтбора = ПользовательскийОтбор.Элементы.Добавить();

Но увы, этот код не работал, потому что ИдентификаторПользовательскойНастройки был пустой строкой. Этот же метод рекомендовался и на инфостарте в подробной статье про пользовательские настройки.

Я попытался прочитать еще одну умную статью на инфостарте, но не одолел её.

И тут мне пришла в голову идея — добавить в отбор мое поле, может тогда оно появится в пользовательских настройках?

С первого раза не сработало, потому что я не задал идентификатор пользовательской настройки. Оказывается, если его задать, то отбор появится и в пользовательских настройках!

ИскПоле = Новый ПолеКомпоновкиДанных("ЗаказПокупателя.Ответственный");

Эл = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Эл.ЛевоеЗначение = ИскПоле;
Эл.Использование = ложь; //По умолчанию истина

Эл.ИдентификаторПользовательскойНастройки = Строка(Новый УникальныйИдентификатор); //Обязательно, иначе не создастся

Эл = НайтиПользовательскуюНастройку(ИскПоле); //Тут у нас гарантированно элемент отбора из пользовательской настройки


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

Чудеса, да и только!

Среда: УНФ 1.6.27.167. Объем: 1.5 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *