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