Открытие дополнительного отчета в 1С программно
В данной статье будет рассмотрен процесс открытия(и формирования) внешнего отчета подключенного к базе. Пример будет рассмотрен для конфигурации 1С:Управление торговлей 11.1.
Допустим у нас есть внешняя обработка, на ее форме расположена кнопка при нажатии на которую должен открываться внешний отчет, который подключен в к базе при помощи справочника ДополнительныеОтчетыИОбработки. В данном справочнике он имеет имя “Мой внешний отчет”, также при запуске отчета следует заполнить параметр его схемы компоновки данных — Период(тип СтандартныйПериод) и установить отборы по полям Организация и Номенклатура.
Подготовим некоторые данные для запуска отчета:
- Создадим реквизит формы МойОтчет типа СправочникСсылка.ДополнительныеОтчетыИОбработки.
- Создадим реквизит формы ВидОтчет типа ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок
Так как процедура открытия отчета будет происходить НаКлиенте, а заполнить описанные выше реквизиты можно только на сервере(если не делать дополнительный ввод данных на форме), то сделаем это в процедуре формы ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МойОтчет = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Мой внешний отчет");
ВидОтчет = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет;
КонецПроцедуры
Далее создадим процедуру в которой будем открывать наш отчет, в параметрах передадим даты начала и окончания, которые необходимы для заполнения параметра Период, а также Организацию и Номенклатурудля отбора:
&НаКлиенте
Процедура ЗапускМоегоОтчета(ДатаНач, ДатаКон, Организация, Номенклатура)
КонецПроцедуры
В самом начале данной процедуры нам следует определить, какую из команд дополнительного отчета мы будем использовать. Возьмем простейший вариант, и выберем первую из команд(к примеру мы знаем, что команда точно одна). Создадим в модуле формы следующую процедуру(которая будет возвращать нам структуру команды):
&НаСервере
Функция ПолучитьПараметрыКомандыВнешнегоОтчета(Ссылка)
Запрос = новый Запрос;
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаКоманды.Ссылка,
| ТаблицаКоманды.Идентификатор,
| ТаблицаКоманды.ВариантЗапуска,
| ТаблицаКоманды.Представление КАК Представление,
| ТаблицаКоманды.ПоказыватьОповещение,
| ТаблицаКоманды.Модификатор
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ТаблицаКоманды
|ГДЕ
| ТаблицаКоманды.Скрыть = ЛОЖЬ
| И ТаблицаКоманды.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| Представление";
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() = 0 Тогда
возврат Неопределено;
Иначе
Результат.Следующий();
ВыполняемаяКоманда = Новый Структура(
"Ссылка, Представление,
|Идентификатор, ВариантЗапуска, ПоказыватьОповещение,
|Модификатор, ОбъектыНазначения, ЭтоОтчет, Вид");
ЗаполнитьЗначенияСвойств(ВыполняемаяКоманда,Результат);
Возврат ВыполняемаяКоманда;
КонецЕсли;
Конецфункции
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
В процедуре ЗапускМоегоОтчета заполним переменную с выполняемой командой при помощи описанной процедуры:
ВыполняемаяКоманда = ПолучитьПараметрыКомандыВнешнегоОтчета(МойОтчет);
Теперь заполним недостающие поля команды:
ВыполняемаяКоманда.ЭтоОтчет = Истина;
ВыполняемаяКоманда.Вид = ВидОтчет;
Создадим структуру с параметрами запуска нашего отчета:
ПараметрыОбработки = Новый Структура("ИдентификаторКоманды, ДополнительнаяОбработкаСсылка, ИмяФормы, КлючСессии, ПользовательскиеНастройки, СформироватьПриОткрытии");
ПараметрыОбработки.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыОбработки.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыОбработки.ИмяФормы = Неопределено;
ПараметрыОбработки.КлючСессии = ВыполняемаяКоманда.Ссылка.УникальныйИдентификатор();
ПараметрыОбработки.СформироватьПриОткрытии = Истина;
Обратите внимание на параметр СформироватьПриОткрытии, если установить там значение Истина, то отчет будет автоматически сформирован после открытия.
Для дальнейшей работы с отчетом его необходимо подключить(временное подключение для работы в текущей сессии). После подключения отчет или обработка регистрируется в программе под определенным именем, используя которое можно создавать объект или открывать формы отчета или обработки.
Получите понятные самоучители по 1С бесплатно:
Для этого используем типовую процедуру УТ 11.1 ПодключитьВнешнююОбработку.
ИмяОбработки_ = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка);
После получения имени подключенного отчета можно получить его форму, компоновщик настроек и пользовательские настройки.
Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма");
КомпоновщикНастроекКомпоновкиДанных = Форма.Отчет.КомпоновщикНастроек;
ПользовательскиеНастройки = КомпоновщикНастроекКомпоновкиДанных.ПользовательскиеНастройки;
Заполним параметры схемы компоновки(в нашем случае имеется один параметр Период) для этого нам понадобится функция поиска параметра в пользовательских настройках отчета, добавим ее в модуль обработки:
Функция ПолучитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, ИмяНастройки)
ПолеКомпановкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") и Элемент.Параметр = ПолеКомпановкиПараметр Тогда
Возврат Новый Структура("Значение, Использование",Элемент.Значение, Элемент.Использование);
Прервать;
КонецЕсли;
КонецЦикла;
КонецФункции
И процедура установки параметра пользовательской настройки:
&НаКлиенте
Процедура УстановитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, ИмяНастройки, Параметр)
ПолеКомпановкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") и Элемент.Параметр = ПолеКомпановкиПараметр Тогда
Элемент.Значение = Параметр.Значение;
Элемент.Использование = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Код для поиска и заполнения параметра в процедуре ЗапускМоегоОтчета:
Параметр = ПолучитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, "Период");
Параметр.Значение.ДатаНачала = ДатаНач;
Параметр.Значение.ДатаОкончания = ДатаКон;
Параметр.Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
УстановитьПараметрПользовательскойНастройки(ПользовательскиеНастройки,"Период",Параметр);
Перейдем к заполнению отборов отчета. Нам понадобится процедура поиска отбора в пользовательской настройке:
&НаКлиенте
Функция ПолучитьОтборПользовательскойНастройки(Компоновщик, ПользовательскиеНастройки, ИмяПоля)
Поле = новый ПолеКомпоновкиДанных(ИмяПоля);
ИдентификаторОтбора = Неопределено;
Для Каждого Элемент из Компоновщик.Настройки.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = Поле Тогда
ИдентификаторОтбора = Элемент.ИдентификаторПользовательскойНастройки;
КонецЕсли;
КонецЦикла;
возврат ПользовательскиеНастройки.Элементы.Найти(ИдентификаторОтбора);
КонецФункции
Код для поиска и заполнения отбора по номенклатуре *в процедуре *ЗапускМоегоОтчета:
ОтборНоменклатура = ПолучитьОтборПользовательскойНастройки(КомпоновщикНастроекКомпоновкиДанных, ПользовательскиеНастройки, "Номенклатура");
ОтборНоменклатура.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборНоменклатура.ПравоеЗначение = Номенклатура;
ОтборНоменклатура.Использование = Истина;
И для отбора по организации:
ОтборОрганизация = ПолучитьОтборПользовательскойНастройки(КомпоновщикНастроекКомпоновкиДанных, ПользовательскиеНастройки, "Организация");
ОтборОрганизация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборОрганизация.ПравоеЗначение = Организация;
ОтборОрганизация.Использование = Истина;
На этом работа с настройками отчета завершена, осталось добавить их в параметры обработки:
ПараметрыОбработки.ПользовательскиеНастройки = ПользовательскиеНастройки;
Получим форму отчета с учетом параметров и откроем ее:
Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма",ПараметрыОбработки);
ОткрытьФорму(Форма);
На этом все, отчет откроется и сформируется.
Полный код процедуры ЗапускМоегоОтчета:
&НаКлиенте
Процедура ЗапускМоегоОтчета(ДатаНач, ДатаКон, Организация, Номенклатура)
ВыполняемаяКоманда = ПолучитьПараметрыКомандыВнешнегоОтчета(МойОтчет);
ВыполняемаяКоманда.ЭтоОтчет = Истина;
ВыполняемаяКоманда.Вид = ВидОтчет;
ПараметрыОбработки = Новый Структура("ИдентификаторКоманды, ДополнительнаяОбработкаСсылка, ИмяФормы, КлючСессии, ПользовательскиеНастройки, СформироватьПриОткрытии");
ПараметрыОбработки.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыОбработки.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыОбработки.ИмяФормы = Неопределено;
ПараметрыОбработки.КлючСессии = ВыполняемаяКоманда.Ссылка.УникальныйИдентификатор();
ПараметрыОбработки.СформироватьПриОткрытии = Истина;
ИмяОбработки_ = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка);
Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма");
КомпоновщикНастроекКомпоновкиДанных = Форма.Отчет.КомпоновщикНастроек;
ПользовательскиеНастройки = КомпоновщикНастроекКомпоновкиДанных.ПользовательскиеНастройки;
Параметр = ПолучитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, "Период");
Параметр.Значение.ДатаНачала = ДатаНач;
Параметр.Значение.ДатаОкончания = ДатаКон;
Параметр.Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
УстановитьПараметрПользовательскойНастройки(ПользовательскиеНастройки,"Период",Параметр);
ОтборОрганизация = ПолучитьОтборПользовательскойНастройки(КомпоновщикНастроекКомпоновкиДанных, ПользовательскиеНастройки, "Организация");
ОтборОрганизация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборОрганизация.ПравоеЗначение = Организация;
ОтборОрганизация.Использование = Истина;
ОтборНоменклатура = ПолучитьОтборПользовательскойНастройки(КомпоновщикНастроекКомпоновкиДанных, ПользовательскиеНастройки, "Номенклатура");
ОтборНоменклатура.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборНоменклатура.ПравоеЗначение = Номенклатура;
ОтборНоменклатура.Использование = Истина;
ПараметрыОбработки.ПользовательскиеНастройки = ПользовательскиеНастройки;
Форма = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки_ +".Форма",ПараметрыОбработки);
ОткрытьФорму(Форма);
КонецПроцедуры