Top.Mail.Ru
Full-time, 5/2
Формат: удаленный
Вакансия «1С-программист»

Как получить результаты дополнительного отчета в 1С и использовать данные расшифровки

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

1. Добавление команды в дополнительном отчете 1С

Для начала необходимо в отчете в сведениях о внешней обработке добавить новую команду «ВызовСерверногоМетода». К этой команде будем обращаться для получения результата отчета.

Дополнительные отчеты 1С: как добавить команду
Функция СведенияОВнешнейОбработке() Экспорт

	ИмяОтчета = ЭтотОбъект.Метаданные().Имя;
    Синоним = ЭтотОбъект.Метаданные().Синоним;
    Синоним = ?(ЗначениеЗаполнено(Синоним), Синоним, ИмяОтчета);
	
    РегистрационныеДанные = Новый Структура;
    РегистрационныеДанные.Вставить("Вид", "Отчет");
    РегистрационныеДанные.Вставить("Наименование", Синоним);
    РегистрационныеДанные.Вставить("Версия", "1.0");     
	РегистрационныеДанные.Вставить("ВерсияБСП", СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
    РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
    РегистрационныеДанные.Вставить("Информация", Синоним);

    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд, Синоним, "СформироватьОтчет", "ОткрытиеФормы", Истина);
    ДобавитьКоманду(ТаблицаКоманд, "Результат отчета", "РезультатОтчета", "ВызовСерверногоМетода", Истина,, Истина);

    РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);

    Возврат РегистрационныеДанные;

КонецФункции

Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Скрыть", 			Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", 	Новый ОписаниеТипов("Строка"));

    Возврат Команды;

КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ОткрытиеФормы", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL", Скрыть = Ложь)

    НоваяКоманда 						= ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление 			= Представление;
    НоваяКоманда.Идентификатор 			= Идентификатор;
    НоваяКоманда.Использование 			= Использование;
    НоваяКоманда.ПоказыватьОповещение 	= ПоказыватьОповещение;
    НоваяКоманда.Модификатор 			= Модификатор;
    НоваяКоманда.Скрыть 				= Скрыть;

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

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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт

	Если ИдентификаторКоманды = "РезультатОтчета" Тогда
        РезультатОтчета = РезультатОтчета(ПараметрыВыполненияКоманды.ДокументСсылка, ПараметрыВыполненияКоманды.УникальныйИдентификатор);
        ПараметрыВыполненияКоманды.РезультатВыполнения.Вставить("РезультатОтчета", РезультатОтчета);
	КонецЕсли;
	
КонецПроцедуры 

Функция РезультатОтчета(ДокументСсылка, УникальныйИдентификатор) Экспорт 
	
	Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

	УстановитьПараметрыОтчета(Макет.Параметры, ДокументСсылка);

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

2. Получение результата дополнительного отчета 1С

Далее отчет сохраняем и обновляем. Теперь переходим к документу. В форме документа добавляем реквизиты: Результат (Табличный документ), ДанныеРасшифровки (Строка). И для примера добавляем команду, по которой будет формироваться отчет.

Дополнительные отчеты 1С: как получить результаты

Далее пишем выполнение команды дополнительного отчета, передаем параметры для отчета, ссылку на дополнительный отчет, реквизиты с формы (Результат, ДанныеРасшифровки).

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

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

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

Результат отчета выводится в табличный документ.

Дополнительные отчеты 1С: вывод результатов

3. Получение и использование данных расшифровки дополнительного отчета 1С

Отчет выводится, но необходимо иметь возможность «провалиться» в данные. Добавляем процедуру ОбработкаРасшифровки у элемента табличного документа.

3.1. Если необходимо открывать значение, по которому нажали

Получаем значение из данных расшифровки по элементу расшифровки.

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

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

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

КонецФункции

3.2. Если необходимо получить не только значение ячейки, по которой нажали, а еще и значения всех полей из группировки

Создаем структуру, пробегаемся по родителям полей группировки и наполняем структуру значениями.

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

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

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

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

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

Дополнительные отчеты 1С
Дополнительные отчеты 1С

В результате обработки расшифровки получаем наполненную структуру с полями из выбранной группировки.

Comments

So empty here ... leave a comment!

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

Sidebar