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

09.10.20

Разработка - БСП (Библиотека стандартных подсистем)

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

Скачать файлы

Наименование Файл Версия Размер
Обработки-примеры, названные в статье
.zip 16,76Kb
1007
.zip 16,76Kb 1007 Скачать бесплатно

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

Процедуры:

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

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

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

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

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

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

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

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

 

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

 

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

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

 

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

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

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

В архиве:

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

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

 

обработка отчет параметры 1с83 разработка

См. также

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1298    dimanich70    6    

13

Заполнение поля адреса в своей обработке [БСП]

Механизмы платформы 1С БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    690    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2355    YA_418728146    11    

40

1С:БСП Дополнительные реквизиты и сведения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Бесплатно (free)

В этой статье расскажем об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С: БСП).

19.01.2024    5199    PROSTO-1C    5    

45

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

БСП (Библиотека стандартных подсистем) Мероприятия Бесплатно (free)

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3800    0    Infostart    0    

20

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4836    mrXoxot    11    

99
Отзывы
4. independ 1519 26.03.19 08:01 Сейчас в теме
(0) http://forum.infostart.ru/forum9/topic212215/message2166609/#message2166609, тоже самое, но без создания формы внешнего отчета
eeeio; ellavs; +2 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. HAMMER_59 244 26.03.19 06:42 Сейчас в теме
ИМХО проще было внешнюю обработку поправить.
2. ellavs 1024 26.03.19 07:37 Сейчас в теме
(1) уточните, что Вы имеете в виду?
3. HAMMER_59 244 26.03.19 07:58 Сейчас в теме
(2) У нас есть инструмент "Дополнительные отчеты и обработки" прекрасен он тем, что не нужно вносить никаких изменений в конфигурации.
В данной статье я не увидел, зачем было "городить огород" создавать расширение, все то же самое можно было реализовать через дополнительный отчет.
5. ellavs 1024 26.03.19 09:14 Сейчас в теме
(3) были такие задачи - по нажатию определенной кнопки на форме (из нескольких разных форм) открыть дополнительную обработку и передать ей нужный параметр. Вторая задача была - в СКД по щелчку в определенной ячейке в качестве расшифровки открывать отчет из допотчетов с параметром из данной ячейки. В обоих случая помогли только описанные выше способы. Не буду спорить, может есть способы лучше.
user591389_aska_rabota; Алексей_mir2mb; +2 Ответить
4. independ 1519 26.03.19 08:01 Сейчас в теме
(0) http://forum.infostart.ru/forum9/topic212215/message2166609/#message2166609, тоже самое, но без создания формы внешнего отчета
eeeio; ellavs; +2 Ответить
6. ellavs 1024 26.03.19 09:24 Сейчас в теме
(4) Да, тоже вариант. Не видела Вашу статью, т.к. делала свою более полугода назад.
eeeio; Алексей_mir2mb; +2 Ответить
7. independ 1519 26.03.19 09:28 Сейчас в теме
(6) а я читал вашу статью пару недель назад, но нужен был вариант без формы СКД, кстати можете добавить в свою публикацию, а мне спасибо нарисуете :)
user1853406; ellavs; +2 Ответить
8. ellavs 1024 27.03.19 14:26 Сейчас в теме
(7) спасибо :) добавила ссылку на Ваше решение в статью.
Алексей_mir2mb; +1 Ответить
9. v25i85 1 29.03.19 21:58 Сейчас в теме
"а не спеть ли мне песню о любви"... "велосипедах с костылями".
Можно же организовать в форме внешнего отчета документа отбор.
10. кольщик 02.07.19 15:58 Сейчас в теме
А как по кнопке с формы документа, открыть дополнительный отчет на СКД, загруженный в доп. отчеты и обработки, чтобы загружался в небезопасном режиме?

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



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

&НаСервере
Функция ПолучитьСсылкуНаОбработку(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
КонецФункции
Показать

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

{ОбщаяФорма.ФормаНастроекОтчета.Форма(34)}: Не передан служебный параметр "НастройкиОтчета".
ВызватьИсключение НСтр("ru = 'Не передан служебный параметр ""НастройкиОтчета"".'");
11. ellavs 1024 03.07.19 09:13 Сейчас в теме
(10) не наблюдала такой проблемы. При написании примеров кода отчет подключался как раз в небезопасном режиме и сообщение о небезопасном режиме не было. Попробуйте открывать отчет, используя пример кода из статьи.
12. German_Tagil 42 23.06.20 10:02 Сейчас в теме
я может чего-то не допонял - и вообще это возможно или нет?


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

нужна строка в отчете типа

НоваяСтрока = ВладелецФормы.Объект .Товары.Добавить();

вот как передать и определить ВладелецФормы.Объект не пойму...
13. user797130 09.10.20 09:23 Сейчас в теме
ellavs, добрый день.
А зачем Вы за ссылкой "на сервер" ходите с контекстом?

&НаСервере
Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере(ИмяОтчетаОбработки)
    Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОтчетаОбработки).Ссылка;
КонецФункции
14. ellavs 1024 09.10.20 09:53 Сейчас в теме
(13) спасибо, что заметили, конечно, нужно исправить.
user797130; +1 Ответить
15. newvideo 10.11.20 13:20 Сейчас в теме
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

АдресХранилища = "";
Результат = ПоместитьФайл(АдресХранилища, "\\Разработка\Отчеты\АкционныеСкидки.erf", , Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
ОткрытьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма");

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

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)

Возврат ВнешниеОтчеты.Подключить(АдресХранилища);

КонецФункции
16. mikl79 118 18.05.22 12:38 Сейчас в теме
Добрый день.
У меня срабатывает открытие Внеш.отчета на СКД с параметрами, но только если Публикация Внеш.отчета отключена.
В чем может быть причина и как это устранить?
17. websamson 306 12.08.22 10:11 Сейчас в теме
&НаКлиенте
Процедура ОткрытьВнешнийОтчетОбработку(ИмяОтчетаОбработки, ПараметрыОтчетаОбработки) Экспорт
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
    УИД = Новый УникальныйИдентификатор;
    Адрес = ПолучитьАдресВнешнейОбработкиНаСервере(УИД, ИмяОтчетаОбработки);
    ИмяОбработки = ПодключитьВнешнююОбработку(Адрес);
    ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОтчетаОбработки, , УИД);
КонецПроцедуры

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

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища) Экспорт

    Возврат ВнешниеОбработки.Подключить(АдресХранилища);

КонецФункции
Показать
18. silverr 15 20.01.23 13:31 Сейчас в теме
Всем доброго дня!
Подскажите, как из внешней обработки (подключена) сформировать отчет на основе СКД (находится в макетах обработки) и вывести его в отдельное окно. Есть в составе конфигурации БП 3.0 в общих формах "ФормаОтчета", по коду, как я понял, эта форма используется для формирования и вывода отчетов. Но вот ссылок на использование оной я не нашел.
19. davlen 62 05.05.23 17:58 Сейчас в теме
при открытии отчета, параметр пустой, хотя формируется отчет сразу правильно с параметром.
20. aleksey2 86 08.12.23 11:57 Сейчас в теме
печатные формы можно так открыть ?
Оставьте свое сообщение