Имя: Пароль:
1C
1С v8
Програмный вызов произвольного отчета с параметрами
0 Strategius
 
05.10.19
09:04
Всем добрый день.
Есть произвольный отчет на СКД с вариантом отчета и тремя параметрами (Период, ТипЦен и Номенклатура), по которым происходит отбор данных и формирование отчета. Сам по себе отчет формируется нормально при изменении параметров. Однако мне необходимо запустить этот отчет по нажатию на кнопку из другой формы (Справочники.Номенклатура.ФормаЭлемента) и тут возникают проблемы с передачей параметров. Параметры в форму отчета передаются, но формируется она без указанных параметров. Реализация следующая:

Процедура КоманднаяПанельЦеныНоменклатурыСтоимостьКомплектующих(Кнопка)
    
    ПроизвольныйОтчетСсылка = Справочники.ПроизвольныеОтчеты.НайтиПоНаименованию("Стоимость комплекта").Ссылка;
    СохраненнаяНастройка = Справочники.СохраненныеНастройки.НайтиПоНаименованию("Номенклатура");
    
    ОтчетОбъект = Отчеты.ПроизвольныйОтчет.Создать();
    
    ОтчетОбъект.УстановитьПроизвольныйОтчет(ПроизвольныйОтчетСсылка, СохраненнаяНастройка); //Внутреняя процедура 1С, которая устанавливает вариант отчета
    
    ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура").Использование = Истина;
    ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура").Значение = Ссылка;
    
    Форма = ОтчетОбъект.ПолучитьФорму(,, ПроизвольныйОтчетСсылка);
    Форма.ВосстанавливатьЗначенияПриОткрытии = Ложь;
    Форма.Открыть();
    
КонецПроцедуры


При попытке передать параметры через ОткрытьФорму("Имя Формы", Параметры) вместо Форма.Открыть(), возникает проблема определения имени формы, которую необходимо открыть - неизвестно откуда ее брать.

Собственно вопрос: Как реализовать открытие произвольного отчета с параметрами?
1 Мимохожий Однако
 
05.10.19
10:01
Покажи процедуру УстановитьПроизвольныйОтчет()
Отладчик, что показывает в ней?
2 Strategius
 
05.10.19
10:59
Процедура достаточно большая. В ней происходит загрузка сохраненных параметров варианта отчета. По сути - загружаются значения по умолчанию. После этого я присваиваю значения тем параметрам, которые мне нужны.

Процедура УстановитьПроизвольныйОтчет(ПроизвольныйОтчетСсылка, СохраненнаяНастройкаСсылка = Неопределено, ФормаОтчета = Неопределено, ВосстановитьНастройкуПоумолчанию = Истина) Экспорт

    ПроизвольныйОтчет = ПроизвольныйОтчетСсылка;
    
    Если СохраненнаяНастройкаСсылка = Неопределено Тогда
        СохраненнаяНастройка = Справочники.СохраненныеНастройки.ПустаяСсылка();
    Иначе
        СохраненнаяНастройка = СохраненнаяНастройкаСсылка;
    КонецЕсли;
    
    ЗначенияНастроекПанелиПользователя = Новый ХранилищеЗначения(ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователяПоУмолчанию(ЭтотОбъект, ФормаОтчета));
    ПараметрыПанелиПользователя = Новый ХранилищеЗначения(ТиповыеОтчеты.ПолучитьПараметрыПанелиПользователяПоУмолчанию(ЭтотОбъект));
    
    Если ПроизвольныйОтчет.Пустая() ИЛИ ПроизвольныйОтчет.ЭтоГруппа Тогда
        СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
        ВидПроизвольногоОтчета = Перечисления.ВидыПроизвольныхОтчетов.ПустаяСсылка();
    Иначе    
        СхемаКомпоновкиДанных = ПроизвольныйОтчет.СхемаКомпоновкиДанных.Получить();
        ВидПроизвольногоОтчета = ПроизвольныйОтчет.ВидПроизвольногоОтчета;
    КонецЕсли;
    
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
    ТиповыеОтчеты.ОбновитьТаблицуДоступныхНастроекПользователю(ЭтотОбъект);
    
    Если ФормаОтчета <> Неопределено Тогда
        ФормаОтчета.КомпоновщикНастроекПользователя.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    КонецЕсли;
    
    #Если Клиент Тогда
    ТиповыеОтчеты.УстановитьВариантПоУмолчанию(ЭтотОбъект, ФормаОтчета);
    #КонецЕсли
        
    Если СохраненнаяНастройка.Пустая() Тогда
        ТиповыеОтчеты.ПрименитьНастройкуПользователяНастройкиОтчета(ЭтотОбъект);
        КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    Иначе
        ПрименитьНастройку();
        ТиповыеОтчеты.ПрименитьНастройкуПользователяНастройкиОтчета(ЭтотОбъект);
    КонецЕсли;
    
    #Если Клиент Тогда
    Если ФормаОтчета <> Неопределено Тогда
        ТиповыеОтчеты.ОбработкаФормыПослеПримененияНастройки(ЭтотОбъект, ФормаОтчета);
        
        // Нарисуем кнопки выбора настроек на верхней панели
        ТиповыеОтчеты.ОбновитьКнопкиВыбораНастроек(ФормаОтчета, ЭтотОбъект, ФормаОтчета.ПредставлениеНастройки, ФормаОтчета.РежимРедактированияНастройки);
    КонецЕсли;
    #КонецЕсли
        
КонецПроцедуры //
3 Strategius
 
05.10.19
11:17
Что самое противное, что отладчик показывает, что во всех вхождениях КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура").Значение формы и отчета установлено требуемое значение, но по нему отчет не формируется
4 Strategius
 
05.10.19
12:52
Сам создал тему, сам и отвечаю. Пришлось идти по отладчику и смотреть, куда деваются данные. Оказалось, что до момента обновления формы, все манипуляции с присвоением данных бесполезны. В результате заработала такая конструкция:

Процедура КоманднаяПанельЦеныНоменклатурыСтоимостьКомплектующих(Кнопка)
    
    ПроизвольныйОтчетСсылка = Справочники.ПроизвольныеОтчеты.НайтиПоНаименованию("Стоимость комплекта").Ссылка;
    СохраненнаяНастройка = Справочники.СохраненныеНастройки.НайтиПоНаименованию("Номенклатура");
    
    ОтчетОбъект = Отчеты.ПроизвольныйОтчет.Создать();
    
    ОтчетОбъект.УстановитьПроизвольныйОтчет(ПроизвольныйОтчетСсылка, СохраненнаяНастройка,,Ложь); //Внутреняя процедура 1С, которая устанавливает вариант отчета
    
    ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура").Использование = Истина;
    ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Номенклатура").Значение = Ссылка;
    
    Форма = ОтчетОбъект.ПолучитьФорму(,, ПроизвольныйОтчетСсылка);
    
    Форма.Обновить();

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

Таким образом удалось прикрутить кнопку на вкладке "цены" на форме элемента номенклатура для вызова отчета, по которому сразу можно видеть стоимость комплектующих номенклатуры и проверять, на  какие комплектующие не установлены цены