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