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