Хранение настроек внешних отчетов на СКД в 1С

Программирование - Практика программирования

164
Код для сохранения и восстановления настроек внешних отчетов на СКД в УПП 1.3, БП 1.6, 2.0, УТ 10.3, КА 1.1

Задача: нужно хранить настройки отчета на СКД в базе, причем у каждого пользователя должно быть произвольное количество настроек.

 

Для хранения настроек отчетов в УПП существуют два метаданных. Регистр сведений "Сохраненные настройки" и одноименный справочник.

Структура метаданных

Их структура похожа, в обоих есть информация:

  1. О пользователе, который может использовать данную настройку
  2. "СохранятьАвтоматически" - сохранять настройку при закрытии
  3. "ИспользоватьПриОткрытии" - при открытии будет выведен отчет по настройке с данной галочкой. Галочка может стоять только у одной настройки к каждому отчету. Если ни у одной настройки галочки нет, то будет выведена типовая настройка СКД.
  4. Реквизит с типом "Хранилище значения" (в справочнике реквизит "ХранилищеНастроек", в регистре сведений ресурс "СохраненнаяНастройка"). В данном объекте собсвенно и хранятся настройки. Как известно хранилище значения может хранить любое значение.

 

В регистре сведений хранятся настройки для отчетов, построенных на универсальном отчете, в справочнике - построенных на СКД. Логично сохранять настройки в справочнике. Но после беглого взгляда возникает несколько но:

  1. Данный справочник содержит предопределенные элементы, имя которых совпадает с именами отчетов. Свои же отчеты туда добавить нельзя, так как в результате обновления может возникнуть коллизия, 1с добавит новые элементы и в тоже время будут существовать предопределенные элементы, добавленные пользователем. 
  2. Справочник заточен на работу с шаблоном отчета 1с, и процедуры и функции работы с сохранением настроек выдрать из него достаточно сложно. шаблон СКД

 

Регистр сведений. Как говорилось выше - в нем хранятся настройки для отчетов на универсальном отчете. Но просмотрев механизм, я решил использовать его, так как процедуры работы с сохранением и восстановлением настроек взять гораздо проще, и более того, данный механизм использован не только в отчетах, но и в типовой обработке "Универсальный журнал", код из которой, немного изменив, я и приспоспособил для решения данной задачи.

 

Итак. На форму надо добавить кнопки сохранения и восстановления значений настроек Сохранить / восстановить настройки, добавить процедуры к ним, и написать код в процедуры "ПриОткрытии" и "ПриЗакрытии".

//////////////////////////////////////////////////////////////////////////////////////

Процедура ДействияФормыСохранитьНастройки(Кнопка)

    Если
мТекущаяНастройка<>Неопределено Тогда
       
СтруктураНастройки = мТекущаяНастройка;
    Иначе
       
СтруктураНастройки = Новый Структура;
       
СтруктураНастройки.Вставить("ИмяОбъекта", Строка(ЭтотОбъект));
       
СтруктураНастройки.Вставить("НаименованиеНастройки", Неопределено);
       
СтруктураНастройки.Вставить("ИспользоватьПриОткрытии", Ложь);
       
СтруктураНастройки.Вставить("СохранятьАвтоматически", Ложь);
    КонецЕсли;

   
СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
   
СохраненнаяНастройка = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки());
   
СтруктураНастройки.Вставить("СохраненнаяНастройка", СохраненнаяНастройка);

   
ВозвращаемаяСтруктура = УниверсальныеМеханизмы.СохранениеНастроек(СтруктураНастройки);

    Если
ВозвращаемаяСтруктура <> Неопределено Тогда
       
мТекущаяНастройка = ВозвращаемаяСтруктура;
    Иначе
       
мТекущаяНастройка = СтруктураНастройки
;
    КонецЕсли;

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

 

Сохранение настройки

//////////////////////////////////////////////////////////////////////////////////////

Процедура ДействияФормыВосстановитьНастройки(Кнопка)

   
СтруктураНастройки = Новый Структура;
   
СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
   
СтруктураНастройки.Вставить("ИмяОбъекта", Строка(ЭтотОбъект));
   
СтруктураНастройки.Вставить("НаименованиеНастройки", ?(мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка.НаименованиеНастройки));

   
ВозвращаемаяСтруктура = УниверсальныеМеханизмы.ВосстановлениеНастроек(СтруктураНастройки);

    Если
ВозвращаемаяСтруктура <> Неопределено Тогда
       
мТекущаяНастройка = ВозвращаемаяСтруктура;
       
КомпоновщикНастроек.ЗагрузитьНастройки(мТекущаяНастройка.СохраненнаяНастройка.Получить());
    КонецЕсли;

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

Восстановление настройки 

//////////////////////////////////////////////////////////////////////////////////////

Процедура ПриОткрытии()
   
СтруктураНастройки = Новый Структура;
   
СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
   
СтруктураНастройки.Вставить("ИмяОбъекта", Строка(ЭтотОбъект));

    Если
УниверсальныеМеханизмы.ПолучитьНастройкуИспользоватьПриОткрытии(СтруктураНастройки) Тогда
       
мТекущаяНастройка = СтруктураНастройки;
       
КомпоновщикНастроек.ЗагрузитьНастройки(мТекущаяНастройка.СохраненнаяНастройка.Получить());
    Иначе
       
//установка первоначальных настроек, например периода и т.д.
   
КонецЕсли;
КонецПроцедуры

//////////////////////////////////////////////////////////////////////////////////////

Процедура ПриЗакрытии()

    Если
мТекущаяНастройка <> Неопределено И мТекущаяНастройка.НаименованиеНастройки <> Неопределено
        И
мТекущаяНастройка.Свойство("СохранятьАвтоматически") И мТекущаяНастройка.СохранятьАвтоматически Тогда

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

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

//////////////////////////////////////////////////////////////////////////////////////

Данный, достаточно небольшой код, позволяет сохранять и восстанавливать настройки внешнего отчета на СКД.



 
164

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Kochevnic 14.11.11 22:11 Сейчас в теме
2. mikl79 103 15.11.11 08:02 Сейчас в теме
3. MYRZILKA123 2 15.11.11 15:19 Сейчас в теме
4. Il 16.11.11 08:28 Сейчас в теме
5. netserfer 84 16.11.11 08:52 Сейчас в теме
Всё гениальное просто, всё сложное не нужно (с)М.Калашников :)
6. ligailnet 16.11.11 09:15 Сейчас в теме
7. Dunga 33 16.11.11 09:41 Сейчас в теме
8. Dunga 33 16.11.11 09:42 Сейчас в теме
А как хранить настройки в файле в отчетах не СКД.
10. Istur 1399 16.11.11 11:23 Сейчас в теме
(8) Полностью аналогично. Настойки хранятся в ресурсе "СохраненнаяНастройка" с типом "Хранилище значения". У меня хранится там КомпоновщикНастроек.Настройки, но там может храниться все, что угодно. Структура, ТаблицаЗначения и т.д. По коду мне кажется вполне должно быть понятно, где и что заменять.
9. psamt1k 16.11.11 10:18 Сейчас в теме
Как любит говорить один мой друг: то, что дохтур прописал!
Спасибо!
11. echo77 906 16.11.11 18:19 Сейчас в теме
Экспортные процедуры типовых отчетов на СКД:
СохранитьНастройку()
ПрименитьНастройку()

не спасут отца русской демократии?
12. Istur 1399 16.11.11 18:31 Сейчас в теме
(11) Да, можно было бы брать и оттуда, тогда бы сохранение происходило в справочник. Но там не чисто эти 2 процедуры, а из них вызываются еще и другие процедуры. И плюс открытие и закрытие, надо смотреть как там. Реализация через регистр мне показалась проще, чем вычленять код из модуля. В данном модуле все сделано универсально, поэтому брать что-либо достаточно сложно, пришлось бы много удалять.
13. echo77 906 16.11.11 18:47 Сейчас в теме
(12) я не пойму - вы свою подсистему пишете с нуля? Или же создаете функционал сохранения/загрузки настроек для типовых отчетов?
14. Istur 1399 16.11.11 18:48 Сейчас в теме
(13) второе. Точнее нет, функционал загрузки/сохранения для внешних отчетов, не типовых.
15. echo77 906 16.11.11 19:25 Сейчас в теме
(14) Судя по скриншотам(панель ваиратов отчета и т.д.) вы делаете это для своих отчетов постронные на базе шаблона типового отчета (Статья ИТС "Разработка отчетов при помощи универсального механизма "Шаблон типового отчета"")
16. Istur 1399 16.11.11 20:43 Сейчас в теме
(15) нет. панели вариантов там нет. там есть самая обычная командная панель, на которую вынесены кнопки сохранения и восстановления настроек. второе. я не делаю массово это для своих отчетов. один раз на работе нужно было так сделать, на форме должен быть только отбор, поэтому шаблон СКДшный использовать нельзя было. а так у нас на работе есть сделанный на основе типового шаблон отчета, мы используем всегда его. Да и другим рекомендую строить отчеты на шаблоне.. вот не знаю как его назвать. На нем еще отчет построен "План-фактный анализ себестоимости выпуска" в УПП. Поэтому даже не знаю когда придется так делать еще раз. Но думаю рано или поздно придется. На ИТС статью не читал, завтра на работе почитаю. Будет обидно, если там уже все описано.
17. sanjabor 16 17.11.11 10:23 Сейчас в теме
Если отчет разрабатывается с нуля, можно за основу взять шаблон типового отчета с ИТС. Там в основном нужно только свою СКД и настройки вывода задать.

ЗЫ Описанные настройки можно применять и к внешним обработкам. Плюсы - те же.
18. Istur 1399 17.11.11 10:36 Сейчас в теме
(17) Я как раз выше распинался что вполне прекрасно знаю о этом отчете. И там же написал, что для решения той конкретной задачи его использование не подходило.
19. angellbroken 21.11.11 11:20 Сейчас в теме
Помоему очень удобная штука)
20. opiumdx 23.11.11 07:46 Сейчас в теме
21. Il 24.11.11 04:25 Сейчас в теме
И еще плюсик - можно настройки отчета копировать под конкретного пользователя!
22. dtitov 28.11.11 11:10 Сейчас в теме
23. Silvice 02.12.11 19:54 Сейчас в теме
24. angler225 88 24.01.12 16:33 Сейчас в теме
25. lsp71 27.02.12 11:16 Сейчас в теме
1. Спасибо за идею и за открытый код.
2. Интересно, зачем 1С создала 2 разных механизма для одной и той же цели (сохранение/восстановление настроек)?
26. l-Rain 12.11.12 13:33 Сейчас в теме
Спасибо большое! Пригодилось.
27. red80 12.11.12 13:38 Сейчас в теме
Полезнее было бы поискать точки входа в типовые механизмы сохранения/восстановления настроек и описать способы работы с ними, тогда не важно было бы как что реализовано.
28. Alex141516 11.03.13 17:02 Сейчас в теме
хочу предупредить на всякий случай, а то в инете есть люди которые мучаются вопросом типа почему в запросе есть поле, а в скд оно не выводится (хотя в настройках самого скд оно есть)? в случае если отчет или обработка с использованием скд у вас дорабатывается в процессе, чтобы не попасть в полные непонятки - нужно сбрасывать настройки пользователя после обновления отчета, можно не все, а именно то что касается изменений, я в отчете делаю переменную "версия отчета" и если она у пользователя не совпадает с текущей - сбрасываю настройки пользователя и уведомляю его.
29. unoDosTres 27.05.13 16:48 Сейчас в теме
спасибо за открытый код, весьма эффективное решение
30. ogion 26.09.13 11:04 Сейчас в теме
2 дня искал и вот оно! Спасибо, добрый человек.
31. KlintuhovDE 25.11.13 15:33 Сейчас в теме
Спасибо автору! пригодилось )
Прикрепленные файлы:
32. TeMochkiN 29.11.13 12:35 Сейчас в теме
Замечательное решение, только у меня при закрытии формы автоматически почему-то не сохраняет настройки либо некорректно сохраняется, а при открытии замечательно автоматически восстанавливается настройка, сохраненная вручную
релиз УПП 1.3.44.1
ща поковыряюсь конечно в чем может быть дело, может я что-то упустил
33. TeMochkiN 29.11.13 12:53 Сейчас в теме
Во, добавил одну строчку и заработало:

Процедура ПриЗакрытии()
	Если мТекущаяНастройка <> Неопределено И мТекущаяНастройка.НаименованиеНастройки <> Неопределено
		И мТекущаяНастройка.Свойство("СохранятьАвтоматически") И мТекущаяНастройка.СохранятьАвтоматически Тогда
		
		//Добавленная мною строка
		мТекущаяНастройка.Вставить("СохраненнаяНастройка", Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()));
	
		ТекПользователь = глЗначениеПеременной("глТекущийПользователь");
		Если ТекПользователь <> мТекущаяНастройка.Пользователь Тогда
			Ответ = Вопрос("Вы восстановили настройку другого пользователя, сохранить ее в
			|ваших настройках?", РежимДиалогаВопрос.ДаНет);
			Если Ответ = КодВозвратаДиалога.Да Тогда
				Если ВвестиСтроку(мТекущаяНастройка.НаименованиеНастройки,
					"Укажите наименование сохраняемой настройки") Тогда
					мТекущаяНастройка.Пользователь = ТекПользователь;
					УниверсальныеМеханизмы.СохранитьНастройку(мТекущаяНастройка);
				КонецЕсли;
			КонецЕсли;
		Иначе
			УниверсальныеМеханизмы.СохранитьНастройку(мТекущаяНастройка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать
Tapochki-tmn; evgenum; rpgshnik; mihan; +4 Ответить
34. kernelio 4 16.05.14 17:27 Сейчас в теме
35. sternu 21.08.14 12:23 Сейчас в теме
Спасибо огромное, помогло в УПП! А то один пользователь замучил с настройками внешнего отчета, сама не умеет настроить отчет и 1С периодически забывала настройки, а мне не улыбается регулярно по пол-часа по телефону восстанавливать все варианты настроек отчета заново :)
36. svilsa 1 01.10.14 11:38 Сейчас в теме
Спасибо, пригодилось для внешнего отчета, в котором необходимо дать пользователю возможность подсмотреть "Настройки всех пользователей".
Светлый ум; +1 Ответить
37. imozg 168 06.10.14 14:57 Сейчас в теме
38. 6630 1 10.03.15 10:58 Сейчас в теме
Спасибо автору. Работает.
39. Sniper9mm 10.03.15 11:08 Сейчас в теме
40. Светлый ум 218 18.06.15 06:14 Сейчас в теме
41. Andrekaa 27.07.15 14:24 Сейчас в теме
помогло, спасибо
еще бы такой же пример для ПостроителяОтчетов
42. PVG_73 17 31.07.15 15:18 Сейчас в теме
Спасибо, сам начал было сие, но забросил... :-)
43. a.rezyhin 22 14.10.15 10:58 Сейчас в теме
Спасибо! Очень нужная статья!
44. buch_n 09.02.16 15:50 Сейчас в теме
45. docerman 43 15.11.16 16:55 Сейчас в теме
Вот спасибо. Просто спас).
46. Chrizt 231 25.11.16 17:01 Сейчас в теме
Под управляемые формы в толстом клиенте на 8.2 пришлось немножко переделать, но получилось.
Спасибо, автор!
47. Lilia 18.01.17 17:43 Сейчас в теме
Спасибо огромное! Мучение с настройками внешних отчетов закончилось!
48. Gary077 17.03.17 12:06 Сейчас в теме
49. rpgshnik 835 29.03.17 05:02 Сейчас в теме
50. asdevlog 24.05.17 06:09 Сейчас в теме
8.3 толстый клиент, не работает. Формы с настройками сохранения и восстановления появляются, список настроек сохраняется. Сами настройки не восстанавливаются. Отличия у меня только рисунки на кнопках сохранения и восстановления, таких рисунков не нашел, переопределить стандартные кнопки тож не сумел. Штука полезная подскажите как пользоваться?
И в регистре сведений "Сохраненные настройки" сорока появляется.
56. Tapochki-tmn 42 07.02.18 15:42 Сейчас в теме
(50)

Ты уже наверняка разобрался, но для кого-то может оказаться полезным:

Кнопки сохранения/восстановления создавал сам на панели, и навесил указанные обработчики.
После копирования процедур ПриОткрытии() и ПриЗакрытии() не забываем еще раз указать форме, что у нее эти обработчики есть путем выбора этих обработчиков в свойствах формы.

Для восстановления настроек надо чтобы они сохранились.
У автора ошибочка в процедуре ПриЗакрытии(), забыл или не посчитал нужным указать строку:

Если мТекущаяНастройка <> Неопределено И мТекущаяНастройка.НаименованиеНастройки <> Неопределено
И мТекущаяНастройка.Свойство("СохранятьАвтоматически") И мТекущаяНастройка.СохранятьАвтоматически Тогда

мТекущаяНастройка.Вставить("СохраненнаяНастройка", Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки())); //потому, что значения настроек схемы СКД могли поменяться, а в настройке значения полученные при открытии формы

...

Где должна располагаться эта строка уже показали в комменте 33.

Может это все к твоему случаю и не относилось, но пусть будет тут ;)
51. Red_Devil 159 21.06.17 10:12 Сейчас в теме
Автор ты бы упомянул что в модуле необходимо объявить твою переменную Перем мТекущаяНастройка;
52. Red_Devil 159 21.06.17 10:17 Сейчас в теме
53. user595031_fagosor 27.07.17 07:36 Сейчас в теме
Автору СПАСИБО, пригодилось :)!
54. EvgenS 03.10.17 15:59 Сейчас в теме
Подскажите как можно поместить в настройки табличные части у которые в настройках формы указаны как сохраняемые значения.
Наверное вместо этой строки
СохраненнаяНастройка = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки());
мне нужно поместить табличные части, подскажите как это сделать?
55. Tapochki-tmn 42 07.02.18 15:29 Сейчас в теме
При написании обработки обмена добавил форму для установки/сохранения параметров обмена и разместил на форме поля ввода.

В обработчике "ПриИзменении" этих полей навесил процедуру "ЗначениеНастройкиОбменаПриИзменении":

Процедура ЗначениеНастройкиОбменаПриИзменении(Элемент)
	ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, Элемент.Имя, ЭлементыФормы[Элемент.Имя].Значение);
КонецПроцедуры


При закрытии формы, с учетом добавленной строки, как указано выше в 33 комменте...

мТекущаяНастройка.Вставить("СохраненнаяНастройка", Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()));


...измененные значения параметров сохраняются в регистре и восстанавливаются при открытии формы:

Процедура ПриОткрытии()
	
		//Инициализация настроек обмена по схеме компоновки данных
	СКД_НастройкиОбмена = ПолучитьМакет("МакетНастройкиОбмена");
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД_НастройкиОбмена));
	КомпоновщикНастроек.ЗагрузитьНастройки(СКД_НастройкиОбмена.НастройкиПоУмолчанию);
	
	СтруктураНастройки = Новый Структура;
    СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
    СтруктураНастройки.Вставить("ИмяОбъекта", Строка(ЭтотОбъект));

    Если УниверсальныеМеханизмы.ПолучитьНастройкуИспользоватьПриОткрытии(СтруктураНастройки) Тогда
		
		мТекущаяНастройка = СтруктураНастройки;
                КомпоновщикНастроек.ЗагрузитьНастройки(мТекущаяНастройка.СохраненнаяНастройка.Получить());
		
    Иначе
        //установка первоначальных настроек, например периода и т.д.
    КонецЕсли;
	
	
	ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СерверФТП"));
	СерверФТП = ЗначениеПараметра.Значение;
	
	ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПортФТП"));
	ПортФТП = ЗначениеПараметра.Значение;
	
	ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПользовательФТП"));
	ПользовательФТП = ЗначениеПараметра.Значение;
	
	ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПарольФТП"));
	ПарольФТП = ЗначениеПараметра.Значение;

	
КонецПроцедуры
Показать


Можно использовать типовую функцию:

ТиповыеОтчеты.ПолучитьПараметр(КомпоновщикНастроекКоллекцияЗначений, ИмяПараметра)
57. tinkerbell 15.02.18 08:17 Сейчас в теме
58. echo77 906 15.02.18 09:35 Сейчас в теме
59. UserPro 4 22.06.18 11:05 Сейчас в теме
Оставьте свое сообщение