Расшифровка в СКД, генерируемой программно

У меня часто отчеты, которые формируются программно. При этом по-умолчанию расшифровка не показывается, вместо нее показываются цифры. Описываю подход, чтобы открывались ссылки в отчете при щелчке по ним. Решение универсальное.

Обычно настройки таких отчетов я размещаю в форме отчета. Обычно они довольно простые — иногда только период.

Тогда я вызываю отчет так в форме:

&НаСервере
Процедура СформироватьНаСервере()
	ОО = РеквизитФормыВЗначение("Отчет");
	Р = ОО.Сформировать(ЭтаФорма.УникальныйИдентификатор);
	ТабДок = Р.ТабДок;
	ДанныеРасшифровки = Р.ДанныеРасшифровки;
	ДокументРезультат.Очистить();
	ДокументРезультат.Вывести(ТабДок);
КонецПроцедуры

&НаКлиенте
Процедура Сформировать(Команда)
	СформироватьНаСервере();
КонецПроцедуры

Сам отчет формирую так:

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

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

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

Ну и сама процедура обработки расшифровки вызывается из события «обработка расшифровки» табличного документа:

&НаКлиенте
Процедура ДокументРезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	Если СтандартнаяОбработка Тогда
		ЗначениеРасшифровки = //дор_ПолучитьЗначениеРасшифровки(Форма, Расшифровка);
		ПолучитьЗначениеРасшифровки(ЭтаФорма.ДанныеРасшифровки, Расшифровка);
		Если ЗначениеРасшифровки <> Неопределено Тогда
			ПоказатьЗначение(, ЗначениеРасшифровки);
			СтандартнаяОбработка = ложь;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры


&НаСервере
Функция ПолучитьЗначениеРасшифровки(ДанныеРасшифровки, Расшифровка) Экспорт
    
    Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    Поля = Данные.Элементы.Получить(Расшифровка).ПолучитьПоля(); //Тут получаем поля расшифровки, среди которых находим нужное.
	Для Каждого Поле ИЗ Поля Цикл
		Рез = Поле.значение;
		Тип = ТипЗнч(Рез);
		Если Справочники.ТипВсеСсылки().СодержитТип(Тип) ИЛИ 
			Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Возврат Рез;
		КонецЕсли;
	КонецЦикла;
КонецФункции 

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *