Отчет для демонстрации работы с программной расшифровкой СКД

Программирование - Практика программирования

расшифровка отчет СКД ОбработкаРасшифровкиКомпоновкиДанных

4
Программное добавление дополнительных пунктов меню в расшифровке и программное формирование отчета-детализации для отчета СКД.

Демонстрирует работу:

  • Программное формирование дополнительных пунктов меню в расшифровке отчета СКД
  • Формирование отчета-расшифровки
  • Получение информации о группировках поля, по которому требуется расшифровка
  • Передача информации от открываемой формы расшифровки

При добавлении пользовательского пункта меню в расшифровку отчета возникает проблема: перестаёт работать стандартная расшифровка-детализация отчета, например, по регистратору.

В демо примере показано, как программно сформировать отчет-детализацию с передачей параметров детализации в новый отчет.

В качестве основного запроса отчета используется запрос к регистру накоплений ВыручкаИСебестоимостьПродаж из УТ 11.4. Для вашей конфигурации запрос нужно изменить.

Используется работа с объектом ОбработкаРасшифровкиКомпоновкиДанных

ОбработкаРасшифровки =  Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
НастройкиКомпоновкиДанных = ОбработкаРасшифровки.Расшифровать(Расшифровка, ПолеКомпоновкиДанных);

Для открытия меню выбора используется метод ПоказатьВыборДействия:

ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеОповещенияОЗакрытии, Расшифровка, ДоступныеДействия, ДополнительныеДействия, Ложь);

 

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


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

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

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

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

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

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


Тестировалась на Управление торговлей, редакция 11 (11.4.5.111).

4

Скачать файлы

Наименование Файл Версия Размер
Отчет для демонстрации работы с программной расшифровкой СКД:
.erf 13,02Kb
08.11.18
1
.erf 1.1 13,02Kb 1

См. также

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение