Хранение настроек внешних отчетов на СКД в 1С
Код для сохранения и восстановления настроек внешних отчетов на СКД в УПП 1.3, БП 1.6, 2.0, УТ 10.3, КА 1.1
- Описание
- Подробнее
Описание
Задача: нужно хранить настройки отчета на СКД в базе, причем у каждого пользователя должно быть произвольное количество настроек.
Для хранения настроек отчетов в УПП существуют два метаданных. Регистр сведений «Сохраненные настройки» и одноименный справочник.

Их структура похожа, в обоих есть информация:
- О пользователе, который может использовать данную настройку
- «СохранятьАвтоматически» — сохранять настройку при закрытии
- «ИспользоватьПриОткрытии» — при открытии будет выведен отчет по настройке с данной галочкой. Галочка может стоять только у одной настройки к каждому отчету. Если ни у одной настройки галочки нет, то будет выведена типовая настройка СКД.
- Реквизит с типом «Хранилище значения» (в справочнике реквизит «ХранилищеНастроек», в регистре сведений ресурс «СохраненнаяНастройка»). В данном объекте собсвенно и хранятся настройки. Как известно хранилище значения может хранить любое значение.
В регистре сведений хранятся настройки для отчетов, построенных на универсальном отчете, в справочнике — построенных на СКД. Логично сохранять настройки в справочнике. Но после беглого взгляда возникает несколько но:
- Данный справочник содержит предопределенные элементы, имя которых совпадает с именами отчетов. Свои же отчеты туда добавить нельзя, так как в результате обновления может возникнуть коллизия, 1с добавит новые элементы и в тоже время будут существовать предопределенные элементы, добавленные пользователем.
- Справочник заточен на работу с шаблоном отчета 1с, и процедуры и функции работы с сохранением настроек выдрать из него достаточно сложно.

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

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

