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