Как программно открыть внешний отчет из "Дополнительных отчетов и обработок" и передать параметры (при помощи БСП)


Пример, как при помощи БСП программно открыть внешний отчет/обработку из «Дополнительные отчеты и обработки» и передать параметры…

Дано: конфигурация на платформе 1С 8.3. В "Дополнительные отчеты и обработки" загружен отчет или обработка.

Задача: открыть данный отчет/обработку программно в коде, например, по кнопке.

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

Далее рассмотрим пример кода, который будет срабатывать по нажатию кнопки и открывать внешний отчет.

В сети интернет много примеров, как открыть внешний отчет или обработку. Большинство из них содержит код загрузки из файла, если это внешний файл отчета.

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

Итак, в БСП есть модуль работы со справочником "Дополнительные отчеты и обработки" (ДополнительныеОтчетыИОбработки), в частности есть процедура открытия отчета и функция подключения внешнего отчета:

 

  1. Процедура ВыполнитьОткрытиеФормыОбработки
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, Форма, ОбъектыНазначения)
  1. Функция ПодключитьВнешнююОбработку
ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(Ссылка)

Вторая вызывается из первой, но ее также можно вызвать и отдельно (что и будет сделано ниже).

Один из вариантов использовать первую процедуру, но он мне не понравился из-за необходимости излишних действий, чтобы заполнить переменную ВыполняемаяКоманда, а также тем, что передать параметры в отчет можно только массивом (ОбъектыНазначения).

Поэтому решила использовать функцию под номером 2, что подключает нужный отчет/обработку, который затем можно открыть по имени, возвращаемому данной функцией.

Итак, сам пример (полный код):
 

// имя внешней обработки - ВнешняяОбработкаПример  (в допобработках)
// имя внешнего отчета - ВнешнийОтчетСКДПример  (в допобработках)
// во внешнем отчете/обработке, даже если это СКД, должна быть создана форма
// (для СКД - это стандартная форма отчета по умолчанию)

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

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

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

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

// процедура, открывающая отчет/обработку по имени, заданному в допобработках
&НаКлиенте
Процедура ОткрытьВнешнийОтчетОбработкуПоИмениСДопПараметрами(ИмяОтчетаОбработки, ПараметрыОткрытия, ЭтоОтчет, РодительскаяФорма =Неопределено)
ВнешнийОтчетОбработкаДляОткрытияСсылка = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере (ИмяОтчетаОбработки);
// ВЫЗОВ ИЗ БСП ФУНКЦИИ ПОДКЛЮЧЕНИЯ ВНЕШНЕЙ ОБРАБОТКИ
ИмяОбработкиСлужебное =ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВнешнийОтчетОбработкаДляОткрытияСсылка);
Если ЭтоОтчет Тогда
ОткрытьФорму("ВнешнийОтчет." + ИмяОбработкиСлужебное + ".Форма", ПараметрыОткрытия, РодительскаяФорма);
Иначе
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработкиСлужебное + ".Форма", ПараметрыОткрытия, РодительскаяФорма);
КонецЕсли;
КонецПроцедуры

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

Процедуры:

  • ОткрытьВнешнююОбработку — пример обработки команды запуска внешней обработки без передачи параметров.
  • ОткрытьВнешнююОбработкуСПараметром  — пример обработки команды запуска внешней обработки с передачей одного параметра.
  • ОткрытьВнешнийОтчетСКД — пример обработки команды запуска СКД отчета без передачи параметров.
  • ОткрытьВнешнийОтчетСКДсПараметром — пример обработки команды запуска СКД отчета с передачей параметров отбора.
  • ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере — служебная функция, выполняемая на сервере, получающая ссылку на экземпляр отчета (обработки) по имени, заданном в "Дополнительные отчеты и обработки".
  • ОткрытьВнешнийОтчетОбработкуПоИмениСДопПараметрами — общая процедура,  непосредственно осуществляющая открытие. Внутри нее как раз строка кода вызывающая стандартную функцию из БСП (выгружает вызываемый отчет/обработку и передает ее наименование, чтобы к нему можно было обратиться по имени при открытии формы):
ИмяОбработкиСлужебное =
ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВнешнийОтчетОбработкаДляОткрытияСсылка);

Пример формы с кнопками, вызывающими эти процедуры:

Скачать пример данной формы можно в файлах к статье.

Если вызывается отчет на СКД, то нужно создать для него типовую форму. Подробнее см. Как добавить типовую форму для СКД

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

Чтобы сработал код передачи параметров в СКД (ОткрытьВнешнийОтчетСКДсПараметром), нужно в модуле объекта СКД добавить код, принимающий эти параметры:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗаполнитьПользовательскиеНастройки();
КонецПроцедуры

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

 

Скачать пример данного СКД отчета можно в файлах к статье.

 

Также пробовала передавать параметры в СКД вот так:

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

 

Однако возникала ошибка: Невозможно применить фиксированные настройки. Пересекаются элементы отбора.

Поэтому выше описала, как передавала параметры отбора в отчет СКД при котором такой ошибки не было.

Обработки тестировались на демо-базе БСП версии 2.4.5.

В архиве:

  • _TestОткрытиеВнешнихОтчетовОбработок.epf — обработка, содержащая форму с примерами кнопок вызова других отчетов и обработок. Можно открывать просто через Файл-Открыть.
  • ВнешняяОбработкаПример.epf — пример внешней обработки, принимающей параметр. Нужно загрузить в"Дополнительные отчеты и обработки" (задать имя ВнешняяОбработкаПример)
  • ВнешнийОтчетСКДПример.erf — пример внешнего отчета на СКД, принимающего параметры. Нужно загрузить в "Дополнительные отчеты и обработки" (задать имя ВнешнийОтчетСКДПример)

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

 

9 Comments

  1. HAMMER_59

    ИМХО проще было внешнюю обработку поправить.

    Reply
  2. ellavs

    (1) уточните, что Вы имеете в виду?

    Reply
  3. HAMMER_59

    (2) У нас есть инструмент «Дополнительные отчеты и обработки» прекрасен он тем, что не нужно вносить никаких изменений в конфигурации.

    В данной статье я не увидел, зачем было «городить огород» создавать расширение, все то же самое можно было реализовать через дополнительный отчет.

    Reply
  4. ellavs

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

    Reply
  5. ellavs

    (4) Да, тоже вариант. Не видела Вашу статью, т.к. делала свою более полугода назад.

    Reply
  6. independ

    (6) а я читал вашу статью пару недель назад, но нужен был вариант без формы СКД, кстати можете добавить в свою публикацию, а мне спасибо нарисуете 🙂

    Reply
  7. ellavs

    (7) спасибо 🙂 добавила ссылку на Ваше решение в статью.

    Reply
  8. кольщик

    А как по кнопке с формы документа, открыть дополнительный отчет на СКД, загруженный в доп. отчеты и обработки, чтобы загружался в небезопасном режиме?

    Сделал так:

    &НаКлиенте
    Процедура Расш1_ПоказатьЗаявкиВместо(Команда)
    ИмяФайла=ПолучитьИмяФайлаОбработки();
    
    АдресХранилища=»»;
    Результат=ПоместитьФайл(АдресХранилища,ИмяФайла,,Ложь);
    
    ИмяОбработки=ПолучитьСсылкуНаОбработку(АдресХранилища);
    
    ОткрытьФорму(«ВнешнийОтчет.»+ ИмяОбработки+».Форма»);
    КонецПроцедуры
    
    
    
    &НаСервере
    Функция ПолучитьИмяФайлаОбработки()
    СсылкаНаОбъект = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(«ввв»);
    
    ДвоичныеДанные = СсылкаНаОбъект.ХранилищеОбработки.Получить();
    
    ИмяФайла = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные.Записать(ИмяФайла);
    
    Возврат(ИмяФайла);
    КонецФункции
    
    &НаСервере
    Функция ПолучитьСсылкуНаОбработку(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
    КонецФункции
    

    Показать

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

    {ОбщаяФорма.ФормаНастроекОтчета.Форма(34)}: Не передан служебный параметр «НастройкиОтчета».

    ВызватьИсключение НСтр(«ru = ‘Не передан служебный параметр «»НастройкиОтчета»».'»);

    Reply
  9. ellavs

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *