Открытие дополнительного отчета в 1С программно

В данной статье будет рассмотрен процесс открытия(и формирования) внешнего отчета подключенного к базе. Пример будет рассмотрен для конфигурации 1С:Управление торговлей 11.1.

Допустим у нас есть внешняя обработка, на ее форме расположена кнопка при нажатии на которую должен открываться внешний отчет, который подключен в к базе при помощи справочника ДополнительныеОтчетыИОбработки. В данном справочнике он имеет имя “Мой внешний отчет”, также при запуске отчета следует заполнить параметр его схемы компоновки данныхПериод(тип СтандартныйПериод) и установить отборы по полям Организация и Номенклатура.

Подготовим некоторые данные для запуска отчета:

  • Создадим реквизит формы МойОтчет типа СправочникСсылка.ДополнительныеОтчетыИОбработки.
  • Создадим реквизит формы ВидОтчет типа ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок

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

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

Далее создадим процедуру в которой будем открывать наш отчет, в параметрах передадим даты начала и окончания, которые необходимы для заполнения параметра Период, а также Организацию и Номенклатурудля отбора:

&НаКлиенте
Процедура ЗапускМоегоОтчета(ДатаНач, ДатаКон, Организация, Номенклатура)
КонецПроцедуры

В самом начале данной процедуры нам следует определить, какую из команд дополнительного отчета мы будем использовать. Возьмем простейший вариант, и выберем первую из команд(к примеру мы знаем, что команда точно одна). Создадим в модуле формы следующую процедуру(которая будет возвращать нам структуру команды):

&НаСервере
Функция ПолучитьПараметрыКомандыВнешнегоОтчета(Ссылка)
    Запрос = новый Запрос;
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    Запрос.Текст =
    "ВЫБРАТЬ
    |   ТаблицаКоманды.Ссылка,
    |   ТаблицаКоманды.Идентификатор,
    |   ТаблицаКоманды.ВариантЗапуска,
    |   ТаблицаКоманды.Представление КАК Представление,
    |   ТаблицаКоманды.ПоказыватьОповещение,
    |   ТаблицаКоманды.Модификатор
    |ИЗ
    |   Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды
    |ГДЕ
    |   ТаблицаКоманды.Скрыть = ЛОЖЬ
    |   И ТаблицаКоманды.Ссылка = &Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    |   Представление";

    Результат = Запрос.Выполнить().Выбрать();

    Если Результат.Количество() = 0 Тогда
        возврат Неопределено;
    Иначе
        Результат.Следующий();
        ВыполняемаяКоманда = Новый Структура(
        "Ссылка, Представление,
        |Идентификатор, ВариантЗапуска, ПоказыватьОповещение,
        |Модификатор, ОбъектыНазначения, ЭтоОтчет, Вид");

        ЗаполнитьЗначенияСвойств(ВыполняемаяКоманда,Результат);

        Возврат ВыполняемаяКоманда;
    КонецЕсли;
Конецфункции

В процедуре ЗапускМоегоОтчета заполним переменную с выполняемой командой при помощи описанной процедуры:

ВыполняемаяКоманда = ПолучитьПараметрыКомандыВнешнегоОтчета(МойОтчет);

Теперь заполним недостающие поля команды:

ВыполняемаяКоманда.ЭтоОтчет = Истина;
ВыполняемаяКоманда.Вид      = ВидОтчет;

Создадим структуру с параметрами запуска нашего отчета:

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

Обратите внимание на параметр СформироватьПриОткрытии, если установить там значение Истина, то отчет будет автоматически сформирован после открытия.

Для дальнейшей работы с отчетом его необходимо подключить(временное подключение для работы в текущей сессии). После подключения отчет или обработка регистрируется в программе под определенным именем, используя которое можно создавать объект или открывать формы отчета или обработки.

Для этого используем типовую процедуру УТ 11.1 ПодключитьВнешнююОбработку.

ИмяОбработки_ = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка);

После получения имени подключенного отчета можно получить его форму, компоновщик настроек и пользовательские настройки.

Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма");
КомпоновщикНастроекКомпоновкиДанных = Форма.Отчет.КомпоновщикНастроек;
ПользовательскиеНастройки = КомпоновщикНастроекКомпоновкиДанных.ПользовательскиеНастройки;

Заполним параметры схемы компоновки(в нашем случае имеется один параметр Период) для этого нам понадобится функция поиска параметра в пользовательских настройках отчета, добавим ее в модуль обработки:

Функция ПолучитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, ИмяНастройки)

    ПолеКомпановкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
    ЭлементОтбора = Неопределено;

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

КонецФункции

И процедура установки параметра пользовательской настройки:

&НаКлиенте
Процедура УстановитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, ИмяНастройки, Параметр)

    ПолеКомпановкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
    ЭлементОтбора = Неопределено;

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

КонецПроцедуры

Код для поиска и заполнения параметра в процедуре ЗапускМоегоОтчета:

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

Перейдем к заполнению отборов отчета. Нам понадобится процедура поиска отбора в пользовательской настройке:

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

    ИдентификаторОтбора = Неопределено;
    Для Каждого Элемент из Компоновщик.Настройки.Отбор.Элементы Цикл
        Если Элемент.ЛевоеЗначение = Поле Тогда
            ИдентификаторОтбора = Элемент.ИдентификаторПользовательскойНастройки;
        КонецЕсли;
    КонецЦикла;

    возврат ПользовательскиеНастройки.Элементы.Найти(ИдентификаторОтбора);
КонецФункции

Код для поиска и заполнения отбора по номенклатуре *в процедуре *ЗапускМоегоОтчета:

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

И для отбора по организации:

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

На этом работа с настройками отчета завершена, осталось добавить их в параметры обработки:

ПараметрыОбработки.ПользовательскиеНастройки          = ПользовательскиеНастройки;

Получим форму отчета с учетом параметров и откроем ее:

Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма",ПараметрыОбработки);
ОткрытьФорму(Форма);

На этом все, отчет откроется и сформируется.

Полный код процедуры ЗапускМоегоОтчета:

&НаКлиенте
Процедура ЗапускМоегоОтчета(ДатаНач, ДатаКон, Организация, Номенклатура)

    ВыполняемаяКоманда = ПолучитьПараметрыКомандыВнешнегоОтчета(МойОтчет);

    ВыполняемаяКоманда.ЭтоОтчет = Истина;
    ВыполняемаяКоманда.Вид      = ВидОтчет;

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

    ИмяОбработки_ = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка);

    Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма");
    КомпоновщикНастроекКомпоновкиДанных = Форма.Отчет.КомпоновщикНастроек;
    ПользовательскиеНастройки = КомпоновщикНастроекКомпоновкиДанных.ПользовательскиеНастройки;

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

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

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

    ПараметрыОбработки.ПользовательскиеНастройки          = ПользовательскиеНастройки;

    Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма",ПараметрыОбработки);
    ОткрытьФорму(Форма);

КонецПроцедуры