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

Функция СведенияОВнешнейОбработке() Экспорт
ИмяОтчета = ЭтотОбъект.Метаданные().Имя;
Синоним = ЭтотОбъект.Метаданные().Синоним;
Синоним = ?(ЗначениеЗаполнено(Синоним), Синоним, ИмяОтчета);
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Вид", "Отчет");
РегистрационныеДанные.Вставить("Наименование", Синоним);
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("ВерсияБСП", СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
РегистрационныеДанные.Вставить("Информация", Синоним);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, Синоним, "СформироватьОтчет", "ОткрытиеФормы", Истина);
ДобавитьКоманду(ТаблицаКоманд, "Результат отчета", "РезультатОтчета", "ВызовСерверногоМетода", Истина,, Истина);
РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);
Возврат РегистрационныеДанные;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Скрыть", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ОткрытиеФормы", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL", Скрыть = Ложь)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
НоваяКоманда.Скрыть = Скрыть;
КонецПроцедуры
Далее нужно добавить экспортную процедуру «ВыполнитьКоманду», в которой будет формироваться отчет и возвращать табличный документ с данными расшифровки. По идентификатору команды определяем, что необходимо делать, также передаем параметры для самого отчета.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "РезультатОтчета" Тогда
РезультатОтчета = РезультатОтчета(ПараметрыВыполненияКоманды.ДокументСсылка, ПараметрыВыполненияКоманды.УникальныйИдентификатор);
ПараметрыВыполненияКоманды.РезультатВыполнения.Вставить("РезультатОтчета", РезультатОтчета);
КонецЕсли;
КонецПроцедуры
Функция РезультатОтчета(ДокументСсылка, УникальныйИдентификатор) Экспорт
Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
УстановитьПараметрыОтчета(Макет.Параметры, ДокументСсылка);
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Макет, Макет.НастройкиПоУмолчанию, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, Истина);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ДанныеРасшифровкиОтчета = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
РезультатОтчета = Новый Структура("Результат, ДанныеРасшифровки", Результат, ДанныеРасшифровкиОтчета);
Возврат РезультатОтчета;
КонецФункции
2. Получение результата дополнительного отчета 1С
Далее отчет сохраняем и обновляем. Теперь переходим к документу. В форме документа добавляем реквизиты: Результат (Табличный документ), ДанныеРасшифровки (Строка). И для примера добавляем команду, по которой будет формироваться отчет.

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

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


В результате обработки расшифровки получаем наполненную структуру с полями из выбранной группировки.
Comments
So empty here ... leave a comment!