Каталог решений - Перенос расшифровки в пользовательские настройки

Перенос расшифровки в пользовательские настройки

Перенос расшифровки в пользовательские настройки

В наличии

Как перенести данные расшифровки в пользовательские настройки.

Категория:

Описание

При разработке  отчета сверки у меня появилась необходимость реализовать механизм передачи данных расшифровки в пользовательские настройки. А именно, сделать так, чтобы значения текущей группировки и группировок верхнего уровня при двойном щелчке на ячейке отчета передавались в настройки пользователя. Опишем окружение, с которым работаем. Имеем объект  Отчет с реквизитом КомпоновщикНастроек, у формы отчета есть реквизит ДанныеРасшифровки с адресом  хранилища значений, в которое помещается расшифровка отчета. На форме расположен табличный документ Результат, в который  выводится сформированный отчет.

 

 

Нужный нам код будет задействован в  событии  ОбработкаРасшифровки, которое относится к полю табличного документа.  В качестве параметра функция обработчика события получает расшифровку ячейки, на которой совершен двойной клик. Её мы будем передавать на сервер для последующей обработки. 

  &НаКлиенте
  Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
  	
  	РезультатОбработкаРасшифровкиНаСервере(Расшифровка);
  		
  КонецПроцедуры

Первое, что мы делаем — считываем из временного хранилища данные  расшифровки, используя  адрес  хранилища из реквизита ДанныеРасшифровки. Расшифровку текущей ячейки мы получаем из параметра Расшифровка. Затем с помощью рекурсивной процедуры Рекурсия  перебираем все вышестоящие расшифровки ( метод ПолучитьРодителей()). И если очередной элемент не имеет тип ЭлементРасшифровкиКомпоновкиДанныхГруппировка, то обращаемся к его  реквизитам Поле и Значение и сохраняем эти данные в выходной таблице тз.  Таблица содержит колонку ПолеОтбора, в которой сохраняется значение с типом ПолеКомпоновкиДанных, оно нам понадобятся при заполнении  пользовательских настроек. И так, у нас есть таблица с именами и значениями текущей и всех вышестоящих группировок (хотя мы в процедуре рекурсии обращаемся к  родительскому узлу расшифровки  текущей ячейки, тем не менее, итоговая таблица содержит  значение, ячейки, на которой был совершен щелчок). Я проверяю состав полученных группировок, если  в него входит группировка Период, то запускается процедура вывода вспомогательного отчета, если нет, то найденные значения группировок заносятся в пользовательские настройки. 

  &НаСервере
  Процедура Рекурсия(ТекРасшифровка,мДанные,тз)
  	
  	тГруппа=Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка");
  	
  	для каждого запись из мДанные.Элементы[ТекРасшифровка].ПолучитьРодителей() цикл
  		если ТипЗнч(запись) <> тГруппа  Тогда
  		 строка=тз.Добавить();	
  		 ЗаполнитьЗначенияСвойств(строка,запись.ПолучитьПоля()[0]);	
  		 строка.ПолеОтбора=новый ПолеКомпоновкиДанных(строка.Поле)
  		конецесли;; 
  		Рекурсия(запись.ID,мДанные,тз)
  	конеццикла;	
      
  КонецПроцедуры
  
  
  &НаСервере
  Функция РезультатОбработкаРасшифровкиНаСервере(Расшифровка)
  	// Вставить содержимое обработчика.
      
  	мДанные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
  	тз=новый  ТаблицаЗначений;
  	тз.Колонки.Добавить("Поле");
  	тз.Колонки.Добавить("Значение");
  	тз.Колонки.Добавить("ПолеОтбора");
  	
  	Рекурсия(Расшифровка,мДанные,тз);
  
  	библ=РеквизитФормыВЗначение("Отчет");
  	
  	если тз.Найти("Период","Поле")<>неопределено тогда
  		тдРасшифровка.Очистить();
  		тдРасшифровка.Вывести(библ.ОтчетПоДаннымРасшифровки(тз));
  		тдРасшифровка.ТолькоПросмотр=истина;
  		возврат  истина;
  	иначе
  		//очистить и установить
  		мКомпоновщик=Отчет.КомпоновщикНастроек;
  		//перебираем все элементы отбора из Компоновщика настроек
  		для каждого элемент из мКомпоновщик.Настройки.Отбор.Элементы цикл
  			        //для каждого элемента ищем соответствующую ему запись пользовательской настройки
  					найти = мКомпоновщик.ПользовательскиеНастройки.Элементы.Найти(
  					элемент.ИдентификаторПользовательскойНастройки);
  					если найти<>неопределено тогда
  						//если нашли, то проверяем есть ли такой элемент в построенной по данным расшифровки таблице
  						что=тз.Найти(элемент.ЛевоеЗначение,"ПолеОтбора");
  						если что<>неопределено тогда
  						 //если есть, то устанавливаем значение	пользовательской настройки
  						 найти.ПравоеЗначение=что.Значение;
  						 найти.Использование=истина;	
  					    иначе	
  						 //если нет, то сбрасываем значение	значение	пользовательской настройки
  						 найти.ПравоеЗначение="";
  						 найти.Использование=ложь;
  						конецесли;
  					конецесли;
  		конеццикла;	  
  		
  		возврат неопределено;
  	конецесли;  
  КонецФункции
  

Напомню, что для полей отбора и параметров макета компоновки, которые нужно добавить в пользовательские настройки следует установить признак Включать в пользовательские настройки.

 

 

Теперь мы перебираем все элементы из коллекции Отбор в настройках компоновщика настроек. Для каждого элемента ищем пользовательскую настройку по ИдентификаторуПользовательскойНастройки. Если таковая найдена, то мы ищем в таблице группировок строку по значению колонки ПолеОтбора, в случае, когда строка найдена, заносим данные из колонки Значение в реквизит ПравоеЗначение настройки. 

На портале уже были статьи о работе с расшифровками, есть статьи о пользовательских настройках. Связка "расшифровка-> пользовательские настройки", как мне кажется, еще не встречалась.

В дополнение к изложенному приведу простой код, который позволяет выполнить замер времени исполнения отдельных запросов в пакете запросов.

  Функция Хронометраж(запрос) экспорт
  	ПолныйТекст=запрос.Текст;
  
  	запрос.МенеджерВременныхТаблиц=новый МенеджерВременныхТаблиц;
  	
  	Схема=новый СхемаЗапроса;
  	Схема.УстановитьТекстЗапроса(ПолныйТекст);
  	ОбщийСтарт=ТекущаяУниверсальнаяДатаВМиллисекундах(); 
  	всего=Схема.ПакетЗапросов.Количество()-1;
  	для i=0 по всего цикл
  		старт=ТекущаяУниверсальнаяДатаВМиллисекундах(); 
  		 запрос.Текст=Схема.ПакетЗапросов[i].ПолучитьТекстЗапроса();
  		 ИмяВременнойТаблицы=Схема.ПакетЗапросов[i].ТаблицаДляПомещения;
  		 результат=запрос.Выполнить();
  		сообщить("i="+i+" "+ИмяВременнойТаблицы+" время выполнения  "+(ТекущаяУниверсальнаяДатаВМиллисекундах()-старт)/1000+"сек.");  
  	конеццикла;	
  	сообщить(" общее время выполнения  "+(ТекущаяУниверсальнаяДатаВМиллисекундах()-ОбщийСтарт)/1000+"сек.");  
  КонецФункции	
  

 

has been added to your cart:
Оформление заказа