1с внешний отчет передать параметр

Обновлено: 07.07.2024

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

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

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

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

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

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

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

ДополнительныеОтчетыИОбработкиКлиент . ВыполнитьОткрытиеФормыОбработки ( ВыполняемаяКоманда , Форма , ОбъектыНазначения )

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

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

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

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

// имя внешней обработки - ВнешняяОбработкаПример (в допобработках)

// имя внешнего отчета - ВнешнийОтчетСКДПример (в допобработках)

// во внешнем отчете/обработке, даже если это СКД, должна быть создана форма

// (для СКД - это стандартная форма отчета по умолчанию)

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

Процедура ОткрытьВнешнююОбработкуСПараметром ( Команда )

ПараметрыОбработки . Вставить ( НазваниеПараметра , ЗначениеПараметра );

ОткрытьВнешнийОтчетОбработкуПоИмениСДопПараметрами ( "ВнешняяОбработкаПример" , ПараметрыОбработки , Ложь );

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

// Открытие внешнего отчета СКД с передачей параметров

Процедура ОткрытьВнешнийОтчетСКДсПараметром ( Команда )

ПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных ;

ПользовательскиеНастройки . ДополнительныеСвойства . Вставить ( НазваниеПараметра , ЗначениеПараметра );

//ПользовательскиеНастройки.ДополнительныеСвойства.Вставить(НазваниеПараметра2, ЗначениеПараметра2);

//ПользовательскиеНастройки.ДополнительныеСвойства.Вставить("Период", Новый СтандартныйПериод(ДатаНачала,ДатаОкончания));

ПараметрыОтчета . Вставить ( "СформироватьПриОткрытии" , Истина );

ПараметрыОтчета . Вставить ( "КлючВарианта" , "ФормированиеПоПараметрам" );

ПараметрыОтчета . Вставить ( "ПользовательскиеНастройки" , ПользовательскиеНастройки );

ОткрытьВнешнийОтчетОбработкуПоИмениСДопПараметрами ( "ВнешнийОтчетСКДПример" , ПараметрыОтчета , Истина );

// процедура, открывающая отчет/обработку по имени, заданному в допобработках

Процедура ОткрытьВнешнийОтчетОбработкуПоИмениСДопПараметрами ( ИмяОтчетаОбработки , ПараметрыОткрытия , ЭтоОтчет , РодительскаяФорма = Неопределено )

ВнешнийОтчетОбработкаДляОткрытияСсылка = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере ( ИмяОтчетаОбработки );

// ВЫЗОВ ИЗ БСП ФУНКЦИИ ПОДКЛЮЧЕНИЯ ВНЕШНЕЙ ОБРАБОТКИ

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

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

ОткрытьФорму ( "ВнешняяОбработка." + ИмяОбработкиСлужебное + ".Форма" , ПараметрыОткрытия , РодительскаяФорма );

Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере ( ИмяОтчетаОбработки )

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

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

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



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

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

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

ДополнительныеСвойства = КомпоновщикНастроек . ПользовательскиеНастройки . ДополнительныеСвойства ;

Параметры = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы ;

Отборы = КомпоновщикНастроек . Настройки . Отбор . Элементы ;

Если ДополнительныеСвойства . Свойство ( ИмяПараметра , ЗначениеПараметра ) Тогда

Настройка = КомпоновщикНастроек . ПользовательскиеНастройки . Элементы . Найти ( Элемент . ИдентификаторПользовательскойНастройки );

Если ДополнительныеСвойства . Свойство ( ИмяПараметра , ЗначениеПараметра ) Тогда

Настройка = КомпоновщикНастроек . ПользовательскиеНастройки . Элементы . Найти ( Элемент . ИдентификаторПользовательскойНастройки );

//Настройка.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

КомпоновщикНастроек . ПользовательскиеНастройки . ДополнительныеСвойства . Очистить ();

1с УНФ.
Есть типовый отчет акт сверки.
Нужно этот отчет переделать. Т.е. взять копию и изменить макет, чтобы затем из покупателей этот отчет открывался и формировался, как типовый. Собственно с изменением макета проблем нет.

Но я не пойму, как в этот отчет передается контекст. В самом отчете нельзя зайти в настройки, их там нет. Как мне сказали, вроде бы его переписывали, но не в этом суть.

Я копирую отчет, он у меня появляется в отчетах покупателей, но при открытии не формируется сразу. После формирования вручную, он формируется пустым.

Тоже самое, если я делаю его внешним. Он появляется в списке отчетов у покупателя, но формируется пустым. Отчет один в один с типовым. Не могу сообразить, как передать в открываемый отчет параметры. Я вижу, что при формировании типовый отчет берет параметры из компоновщика. Но не могу найти, где заполняется компоновщик. Отчет без формы.

(0) берется форма по умолчанию. Щелкаешь на корне конфигурации Свойства и там находишь, форма отчета, форма настроек отчета, форма вариантов отчета.

(0) Смотря какая конфигурация.
в БП3 это просто, есть ряд предопределённых процедур, которые вызываются в зависимости от указанных параметров.

Вот тут настройки задаются.

А вот тут полный модуль одного из отчета.
Просто я вот так делаю, в последнее время :)
. Запрос там подменяется для обхода блокировок безопасности в СКД.
. Думаю надо начать переделывать такое на СхемеЗапросоа. но это потом.

(0) И да, Утро, не обессудь.

(6) К сожалению, у меня нет формы отчета. Используется общая форма УНФ.

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

В ней есть некоторая структура - параметры, со значение Данные формы структура. К сожалению, что это за параметры и откуда берутся я не смог найти, не так давно на УФ работаю. Если открываю типовый отчет, то в параметрах есть свойства отбора, где и указан ключ и значение.

При открытии внешнего или скопированного типового отчета, в параметрах этого свойства нет. Судя по всему, нужно как-то передать это свойств в параметры. А вот как передать непонятно.

Я уже много ссылок перерыл, но в целом, выходит, что проще написать отчет с нуля. Тогда скорее всего все заработает. Но хотелось бы взять и именно типовый, с минимальными изменениями.

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

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

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

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

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

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

  1. Процедура ВыполнитьОткрытиеФормыОбработки
  1. Функция ПодключитьВнешнююОбработку

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

В некоторых случаях перед печатью документа требуется вручную указать какие-либо значения или параметры и передать в процедуру Печать() обработки. Для конфигураций линии УТ 10.3, БП 2.0 есть возможность передачи параметров, а также возможность без особых ухищрений вызвать форму обработки перед печатью с последующим выводом результата печати в штатное окно. В конфигурациях на основе Библиотеки стандартных процедур (Управление торговлей 11, Розница 2, УНФ, Бухгалтерия предприятия 3 и прочие) предусмотрены способы вызова команды печати в виде "ОткрытиеФормы" или "ВызовКлиентскогоМетода", но в этом случае вывод сформированного табличного документа необходимо реализовывать самостоятельно.

Рассмотрим один из способов передачи параметров для печати, не претендующий на оригинальность, так как используются штатные процедуры БСП.

В качестве примера выбрана печать простой накладной для УТ 11.0.9.15 - УТ 11.3 с возможностью печати со скидками или без них.

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

Заготовка печатной формы.jpg

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

Параметры обработки

Ключевой параметр

Далее определяем команду для печати или вывода печатной формы, навешиваем кнопку на форму.

Команда Печать

Присваиваем команде обработчик действия ( код следует поместить в модуль формы )

&НаСервереБезКонтекста
Функция ЕстьОбщийМодуль ( НазваниеМодуля )
Возврат Метаданные . ОбщиеМодули . Найти ( НазваниеМодуля ) <> Неопределено;
КонецФункции

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

&НаКлиенте
Процедура ВыполнитьОткрытиеПечатнойФормы ( Команда )

СтандартнаяОбработка = Истина;
//Проверка на релиз БСП для универсальности.
//Общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый существует в версии БСП выше 2.0.1.19
Если ЕстьОбщийМодуль ( "ДополнительныеОтчетыИОбработкиКлиентПереопределяемый" ) Тогда
Выполнить( "ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ВыполняемаяКоманда.ОбъектыНазначения, СтандартнаяОбработка);" );
КонецЕсли;

Отказ = Ложь;
//Проверка на релиз БСП для универсальности.
//Если необходимо печатать из непроведённых документов, удалите этот фрагмент
ВерсияБСП = ПолучитьВерсиюБСП ();
Если СравнитьВерсии ( ВерсияБСП , "2.2.3" ) >= 0 Тогда
Выполнить( "СписокДокументов = ВыполняемаяКоманда.ОбъектыНазначения;
|НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(СписокДокументов);
|Если СтандартнаяОбработка И НепроведенныеДокументы.Количество() > 0 Тогда Отказ = Истина; КонецЕсли;
|" );
Иначе
Выполнить( "Если СтандартнаяОбработка И Не УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ВыполняемаяКоманда.ОбъектыНазначения) Тогда Отказ = Истина; КонецЕсли;" );
КонецЕсли;

Если Не Отказ Тогда

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

//Здесь передаём наши значения в модуль обработки.
//Структура для передачи параметров или значений в процедуру Печать обработки
//В процедуре печати она будет доступна в качестве первого элемента массива МассивОбъектовНазначения
ДополнительныеПараметры = Новый Структура ();
//Значения для передачи
ДополнительныеПараметры . Вставить ( "ПечататьСкидки" , ЭтаФорма . ПечататьСкидки );

//Еще какие-то значения
//ДополнительныеПараметры.Вставить("РеквизитФормы1", РеквизитФормы1);
//ДополнительныеПараметры.Вставить("РеквизитФормы2", РеквизитФормы2);

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

//Ссылки на вызвавшие форму объекты
Для каждого ОбъектНазначения Из ВыполняемаяКоманда . ОбъектыНазначения Цикл
ОбъектыНазначения . Добавить ( ОбъектНазначения );
КонецЦикла; //Для каждого ОбъектНазначения Из
ПараметрыОткрытия . ПараметрыИсточника . ОбъектыНазначения = ОбъектыНазначения ;

//Вывод сформированного табличного документа в штатную форму.
ОткрытьФорму ( "ОбщаяФорма.ПечатьДокументов" , ПараметрыОткрытия );
КонецЕсли;
ЭтаФорма . Закрыть ();

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

// Экспортная процедура печати, вызываемая из основной программы
//
// Параметры:
// ВХОДЯЩИЕ:
// МассивОбъектовНазначения - Массив - список объектов ссылочного типа для печати документа
// Как правило, содержит один элемент с ссылкой на вызвавший форму объект (документ, справочник)
//
// ИСХОДЯЩИЕ:
// КоллекцияПечатныхФорм - ТаблицаЗначений - таблица сформированных табличных документов.
// Как правило, содержит одну строку с именем текущей печатной формы
// ОбъектыПечати - СписокЗначений - список объектов печати.
// ПараметрыВывода - Структура - Параметры сформированных табличных документов. Содержит поля:
// ДоступнаПечатьПоКомплектно - булево - по умолчанию Ложь
// ПолучательЭлектронногоПисьма
// ОтправительЭлектронногоПисьма
//
Процедура Печать ( МассивОбъектовНазначения , КоллекцияПечатныхФорм , ОбъектыПечати , ПараметрыВывода ) Экспорт

ПараметрыВывода . ДоступнаПечатьПоКомплектно = Истина;

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

//Присваиваем значение по умолчанию нашему параметру, переданному из формы
ПечататьСкидки = Истина;

//Смотрим, что содержится в первом элементе массива МассивОбъектовНазначения
//Если это структура, значит есть дополнительные параметры, почти как в прежних конфигурациях
Если ТипЗнч ( МассивОбъектовНазначения [ 0 ]) = Тип ( "Структура" ) Тогда
ДополнительныеПараметры = МассивОбъектовНазначения [ 0 ];
Если ДополнительныеПараметры . Свойство ( "ПечататьСкидки" ) Тогда
ПечататьСкидки = ДополнительныеПараметры . ПечататьСкидки ;
КонецЕсли;
//А теперь структуру из массива объектов можно удалить, больше она там не нужна
МассивОбъектовНазначения . Удалить ( 0 );
КонецЕсли;

//Дальше используем штатный функционал БСП
Если УправлениеПечатью . НужноПечататьМакет ( КоллекцияПечатныхФорм , "РасходнаяНакладнаяСДиалогомВыбора" ) Тогда
УправлениеПечатью . ВывестиТабличныйДокументВКоллекцию ( КоллекцияПечатныхФорм , "РасходнаяНакладнаяСДиалогомВыбора" , "Расходная накладная" , СформироватьПечатнуюФормуНакладная ( МассивОбъектовНазначения , ОбъектыПечати , ПечататьСкидки ));
КонецЕсли;

Реализация функции СформироватьПечатнуюФормуНакладная() зависит от конкретной задачи и здесь не рассматривается.

В экспортной функции СведенияОВнешнейОбработке() необходимо указать использование команды печати "ОткрытиеФормы" с модификатором "ПечатьMXL".

Подробнее смотрите статью Внешние обработки и отчеты 1С:Предприятие 8.2 или прилагаемый пример обработки.

//Определяем команды для печати формы

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

Если всё сделано правильно, после регистрации внешней печатной формы в справочнике "ДополнительныеОбработки" она будет доступна из формы списка или документа в меню "Дополнительные печатные формы". После выбора из списка ВПФ на экране появится форма обработки.

Читайте также: