Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

8.3 Управляемая форма. Как задать параметры отбора при вызове СКДшного отчета

8.3 Управляемая форма. Как задать параметры отбора при вызове СКДшного отчета
Я
   Илья Ч
 
05.05.19 - 12:57
Доброго дня!
Я к вам за советом. Уверен, есть более простое и лаконичное решение, чем то, которое изобрел я.

Решаю довольно тривиальную задачу - в самописной конфигурации (без использования БСП) есть отчет, из которого пользователь должен иметь возможность получить расшифровку другими отчетами.
Соответственно, при вызове расшифровочного отчета, ему нужно передать ряд параметров. Часть из этих параметров в расшифровочном отчете является параметрами, а часть - отборами.

Чтобы передать в отчет настройки я реализовал функцию, которая подготавливает структуру передаваемых параметров.
Функция делает следующее:
а) получает параметры расшифровки из временного хранилища
б) считывает ПользовательскиеНастройки вызываемого расшифровочного отчета
в) в цикле обходит параметры, проверяет, есть ли в вызываемом отчете Параметр или Отбор с таким же именем. Если находит - устанавливает для него значение. Если не находит - пропускает.

С Параметрами проблем не возникло, а вот Отборы...
ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы не содержит имени отбора. Только внутренний идентификатор.
Поэтому мне пришлось извращаться и предварительно определять соответствие идентификатора отбора имени параметра отбора.

Неужели нельзя как-то проще?!


Мой код:

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


А это, собственно, фрагмент кода вызова расшифровочного отчета:

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует