gifts2017

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

Опубликовал Станислав Турчинский (Istur) в раздел Программирование - Практика программирования

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

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

 

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

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

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

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

 

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

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

 

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



 

См. также

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

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

ЗЫ Описанные настройки можно применять и к внешним обработкам. Плюсы - те же.
18. Станислав Турчинский (Istur) 17.11.11 10:36
(17) Я как раз выше распинался что вполне прекрасно знаю о этом отчете. И там же написал, что для решения той конкретной задачи его использование не подходило.
19. Алёна Ляхова (angellbroken) 21.11.11 11:20
Помоему очень удобная штука)
20. Michael Smith (opiumdx) 23.11.11 07:46
21. Il Il (Il) 24.11.11 04:25
И еще плюсик - можно настройки отчета копировать под конкретного пользователя!
22. Дмитрий Титов (dtitov) 28.11.11 11:10
23. Pavel Zubarev (Silvice) 02.12.11 19:54
24. Артур Пирожков (angler225) 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. red 80 (red80) 12.11.12 13:38
Полезнее было бы поискать точки входа в типовые механизмы сохранения/восстановления настроек и описать способы работы с ними, тогда не важно было бы как что реализовано.
28. алексей (Alex141516) 11.03.13 17:02
хочу предупредить на всякий случай, а то в инете есть люди которые мучаются вопросом типа почему в запросе есть поле, а в скд оно не выводится (хотя в настройках самого скд оно есть)? в случае если отчет или обработка с использованием скд у вас дорабатывается в процессе, чтобы не попасть в полные непонятки - нужно сбрасывать настройки пользователя после обновления отчета, можно не все, а именно то что касается изменений, я в отчете делаю переменную "версия отчета" и если она у пользователя не совпадает с текущей - сбрасываю настройки пользователя и уведомляю его.
29. uno dos (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
Во, добавил одну строчку и заработало:

Процедура ПриЗакрытии()
	Если мТекущаяНастройка <> Неопределено И мТекущаяНастройка.НаименованиеНастройки <> Неопределено
		И мТекущаяНастройка.Свойство("СохранятьАвтоматически") И мТекущаяНастройка.СохранятьАвтоматически Тогда
		
		//Добавленная мною строка
		мТекущаяНастройка.Вставить("СохраненнаяНастройка", Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()));
	
		ТекПользователь = глЗначениеПеременной("глТекущийПользователь");
		Если ТекПользователь <> мТекущаяНастройка.Пользователь Тогда
			Ответ = Вопрос("Вы восстановили настройку другого пользователя, сохранить ее в
			|ваших настройках?", РежимДиалогаВопрос.ДаНет);
			Если Ответ = КодВозвратаДиалога.Да Тогда
				Если ВвестиСтроку(мТекущаяНастройка.НаименованиеНастройки,
					"Укажите наименование сохраняемой настройки") Тогда
					мТекущаяНастройка.Пользователь = ТекПользователь;
					УниверсальныеМеханизмы.СохранитьНастройку(мТекущаяНастройка);
				КонецЕсли;
			КонецЕсли;
		Иначе
			УниверсальныеМеханизмы.СохранитьНастройку(мТекущаяНастройка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
...Показать Скрыть
34. Andrey Kazhurin (kernelio) 16.05.14 17:27
35. Сергей (sternu) 21.08.14 12:23
Спасибо огромное, помогло в УПП! А то один пользователь замучил с настройками внешнего отчета, сама не умеет настроить отчет и 1С периодически забывала настройки, а мне не улыбается регулярно по пол-часа по телефону восстанавливать все варианты настроек отчета заново :)
36. Светлана Юрусова (svilsa) 01.10.14 11:38
Спасибо, пригодилось для внешнего отчета, в котором необходимо дать пользователю возможность подсмотреть "Настройки всех пользователей".
Светлый ум; +1 Ответить
37. Денис Кожухов (imozg) 06.10.14 14:57
38. Евген Сок (6630) 10.03.15 10:58
Спасибо автору. Работает.
39. Михаил ф (Sniper9mm) 10.03.15 11:08
40. Константин Куликов (Светлый ум) 18.06.15 06:14
41. Андрей (Andrekaa) 27.07.15 14:24
помогло, спасибо
еще бы такой же пример для ПостроителяОтчетов
42. Виталий (PVG_73) 31.07.15 15:18
Спасибо, сам начал было сие, но забросил... :-)
43. Алексей Резухин (a.rezyhin) 14.10.15 10:58
Спасибо! Очень нужная статья!
45. Виктор Александров (docerman) 15.11.16 16:55
Вот спасибо. Просто спас).
46. Алексей Крайст (Chrizt) 25.11.16 17:01
Под управляемые формы в толстом клиенте на 8.2 пришлось немножко переделать, но получилось.
Спасибо, автор!