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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

fixin

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

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

комментария 2

  1. Merkalov:

    Спасибо. Тоже скопипастил код из той статьи и он так же завелся.
    Для тех кто не в теме. У автора код вырван из контекста.
    Главное условие — отбор «Контрагент» в схеме компоновки данных уже установлен как пользовательский отбор, т.е стоит флаг «Включать в пользовательские настройки», если это не так, то код потребуется изменить — добавить новый отбор пользовательский, а не использовать существующий.

    Этот код нужно писать до вызова формы, подготовить параметры открытия формы отчета.

    &НаКлиенте
    Процедура ОткрытьОтчетПоСобытиям(Команда)

    Если Элементы.Список.ВыделенныеСтроки.Количество() = 0 Тогда
    Возврат;
    КонецЕсли;

    СписокВыделенныхКонтрагентов = Новый СписокЗначений;
    Для каждого ВыделенныйКонтрагент из Элементы.Список.ВыделенныеСтроки Цикл
    СписокВыделенныхКонтрагентов.Добавить(ВыделенныйКонтрагент);
    КонецЦикла;

    ПараметрыОткрытия = ПолучитьПараметрыОткрытияОтчета(СписокВыделенныхКонтрагентов);
    ОткрытьФорму(«Отчет.ОтчетПоСобытиямКонтрагентов.Форма.ФормаОтчета», ПараметрыОткрытия, ЭтотОбъект);

    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция ПолучитьПараметрыОткрытияОтчета(СписокКонтрагенты)

    ОтчетОбъект = Отчеты.ОтчетПоСобытиямКонтрагентов.Создать();
    КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;

    // Добавляем в пользовательские настройки отбор
    НайденныеЭлементыОтбора = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(КомпоновщикНастроек.Настройки.Отбор, «Контрагент»);
    Если НайденныеЭлементыОтбора.Количество() > 0 Тогда

    ЭлементОтбора = НайденныеЭлементыОтбора[0];
    ЭлементОтбора.Использование = Ложь; // Сбросим (возможно в конфигураторе будет задано «Истина» и тогда настройки будут пересекаться
    Если ЭлементОтбора.ИдентификаторПользовательскойНастройки = «» Тогда
    ЭлементОтбора.ИдентификаторПользовательскойНастройки = Строка(Новый УникальныйИдентификатор); // Обязательно
    КонецЕсли;

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

    ЭлементОтбораПользовательский.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбораПользовательский.Использование = Истина;
    ЭлементОтбораПользовательский.ПравоеЗначение = СписокКонтрагенты;

    КонецЕсли;

    ПараметрыОткрытия = Новый Структура();
    ПараметрыОткрытия.Вставить(«СформироватьПриОткрытии», Истина);
    ПараметрыОткрытия.Вставить(«Вариант», КомпоновщикНастроек.Настройки);
    ПараметрыОткрытия.Вставить(«ПользовательскиеНастройки», КомпоновщикНастроек.ПользовательскиеНастройки);

    Возврат ПараметрыОткрытия;

    КонецФункции

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

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