gifts2017

Передача параметров/значений во внешнюю печатную форму для конфигураций на БСП (1С:Предприятие 8.2/8.3)

Опубликовал Сергей Ожерельев (Поручик) в раздел Печать - Универсальные печатные формы

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

 

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

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

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

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

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

 

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

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

    

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

 

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

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

 

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

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

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

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

   
ВыполняемаяКоманда = Параметры;

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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


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

 

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

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

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

   
ТаблицаКоманд = ПолучитьТаблицуКоманд();

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

 

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

Диалог перед печатью

 

Всё описанное выше изложено и прокомментировано в прилагаемой обработке.

Другой пример обработки можно скачать в  Cпецификация на товар к договору с контрагентом - Бухгалтерия предприятия 3.0

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

Наименование Файл Версия Размер Кол. Скачив.
Расходная накладная для УТ 11.0-11.2 с диалогом выбора- РеализацияТоваров.epf
.epf 29,24Kb
24.03.16
293
.epf 1.0.4 29,24Kb 293 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Эдуард Анатольевич (EddieTocha) 02.12.13 21:26
Бухгалтерия предприятия, редакция 3.0 (3.0.26.11)

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

Результат работы, ошибка:

{Форма.ФормаПечати.Форма(83)}: Ошибка при вызове метода контекста (ОткрытьФорму)
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'val':
форма: Элемент
имя: {http://v8.1c.ru/8.2/mngsrv/ws}val
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}value
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
форма: Элемент
2. Сергей Ожерельев (Поручик) 02.12.13 21:33
(1) Откуда мне знать, куда вы что скопировали и как что сделали.
3. Сергей Ожерельев (Поручик) 02.12.13 23:45
(1) Добавил печатную форму с выбором для Бухгалтерии предприятия 3.0. Ссылку найдёте в описании. Учитесь.
4. Сергей Ожерельев (Поручик) 28.12.13 14:38
Ещё одна обработка с использованием методики.
Внешняя печатная форма "Счет на оплату покупателю" для БУ 3.0 с ручным выбором параметров http://infostart.ru/public/248458/
MaximKor; qwinter; SlavaVNL; TorLink; +4 1 Ответить
5. Сергей Ожерельев (Поручик) 04.03.14 09:37
Небольшие изменения в обработке для БСП недавних релизов.
6. Слава (SlavaVNL) 16.04.14 08:10
7. Дмитрий Лумбов (Dima69) 18.04.14 10:16
Небольшие изменения в обработке для БСП недавних релизов.?????????

А что за изменения, а то моя обработка вдруг перестала работать
выдает ошибку МЕТОД ОБЪЕКТА НЕ ОБНАРУЖЕН (МЕТАДАННЫЕ)
8. Сергей Ожерельев (Поручик) 18.04.14 10:30
(7) Одноэсники через одного дятлы, точнее из трёх два дятла. И вот почему - что за обработка, какая конфигурация, типа протелепатируй, мне лень писать.
Короче, разбирайся сам как знаешь. Приложенная ВПФ нормально работает в Управление торговлей 11.0.9 - 11.1.4.
9. Алексей Пантюхов (alexpvs) 19.05.14 17:57
Большое спасибо за подсказанную методику по использованию общей формы ПечатьДокументов. У меня как раз с этим был затык, открытие формы для ввода параметров делается без проблем просто в описании сведений о внешней обработке
10. Сергей Ожерельев (Поручик) 18.06.14 12:44
Обработка портирована для использования с БСП 2.2.3
11. Сергей Ожерельев (Поручик) 23.06.14 13:02
Обработка портирована для использования с УТ 11.1.6
12. Призрак (davdykin) 26.07.14 07:18
Поручик, спасибо большое за классную инструкцию. Хотелось бы уточнить:
1. Где можно почитать мануал про БСП, на ИТС разбирался с данной обработкой печати - ни хорошего примера, нифига не нашел.
2. Как отлаживать такую обработку?
13. Константин Юрин (kostyaomsk) 09.11.14 09:06
Хорошо написано. Главное по делу и с примером.
Возможность то вызова есть
Для конфигураций линии УТ 10.3, БП 2.0 есть возможность передачи параметров, а также возможность без особых ухищрений вызвать форму обработки перед печатью с последующим выводом результата печати в штатное окно.
вот только никто не использует :(
В отраслевом ВДГБ Ломбард столкнулся. Печатные формы реализованы в виде отчета в конфигурации. Чтоб не передавать параметры (или, вернее чтоб передать параметр-объект документа, для вызова его (ДокументОбъекта) методов:
ИначеЕсли ИмяМакета = "ЗалоговыйБилетМакетНаБланке" Тогда
		
		ОтчетЗБ = Отчеты.ЛМБ_ЗалоговыйБилетПоМакету.Создать();
		ОтчетЗБ.мДокументОбъект          = ЭтотОбъект;
		ОтчетЗБ.СсылкаНаОбъект           = Ссылка;
		ОтчетЗБ.мДанныеОСхеме            = мДанныеКредитования;
		ОтчетЗБ.мУчетнаяПолитикаЛомбарда = мУчетнаяПолитикаЛомбарда;
		
		ТабДокумент = ОтчетЗБ.Печать(Истина);
		
	КонецЕсли;
...Показать Скрыть

А уже от нажатой кнопки и как параметра "галочки" зависит вариант печати. Такой вот "штатный" механизм передачи параметров.
Прикрепленные файлы:
14. Константин Юрин (kostyaomsk) 09.11.14 09:42
(12) davdykin, (12) davdykin, найти то в закрытке на ИТС, но там паролик нужен. Отдельно то конфигурация БСП поставляется как демка, но она, как и вся документация больше разработчикам в крупных фирмах нужна, где есть корпоративные стандарты.
И это только для разработчиков новых конфигураций. Все равно подстраиваться приходится под то что есть.
Прикрепленные файлы:
15. Дмитрий Тюняков (Pipapalamm) 13.01.15 10:34
Автору спасибо.
Разжевано специально для ленивых программистов.
16. cassyan (cassyan) 12.02.15 09:12
Спасибо за статью. Всё разжёвано, и при этом ни капли воды. То, что нужно.
17. Mark Genuine (markgenuine) 24.02.15 10:26
Спасибо за статью, очень интересный метод.
20. Дмитрий Семенов (Sam13) 17.03.15 09:55
Все верно. Кроме как таких "танцев с бубном" передать в обработку печати свое значение невозможно.
Почему в БСП процедура написана таким образом? Что мешает добавить еще один параметр для передачи произвольных значений в эту процедуру. Непонятно.
Если бы в процедуре печати была доступна ссылка на внешнюю обработку (справочник "ДополнительныеВнешниеОтчетыИОбработки"), то это облегчило бы жизнь.

Иногда бывает нужно печатать с доп.параметрами, но при этом не открывать предварительно диалоговое окно. Классический пример - печатная форма с какими-нибудь ответственными или должностями, которые меняются время от времени, но не часто. Вбивать их в макет - тупо, показывать каждый раз при печати тоже не айс.
Я использовал такой метод: сделал две команды печати, одна команда печатной формы - для настройки параметров печати, вторая команда - для печати с уже настроенными ранее параметрами.
Форма для настройки параметров открывается и сохраняет значения в реквизит "ХранилищеНастроек" справочника "ДополнительныеВнешниеОтчетыИОбработки".
Вторая команда (печать с готовыми настройками) при открытии имея ссылку на справочник "ДополнительныеВнешниеОтчетыИОбработки" читает сохраненные настройки и сразу уходит на печать не открывая форму.
Единственный недостаток такого метода - видимость двух команд печати в списке команд (с открытием формы и без). Победить можно, но это предмет отдельного поста, пожалуй.
21. andrey mahinov (andreycom) 18.03.15 10:17
При запуске печатной формы такие проблемы:
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(54)}: Поле объекта не обнаружено (БезопасныйРежим)
ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(ИсточникДанных, ПараметрыИсточника.БезопасныйРежим);

Подскажите пжл куда копать?
22. Сергей Ожерельев (Поручик) 18.03.15 10:41
(21) И как мне протелепатировать релиз используемой БСП или конфы? И какая именно обработка?
23. andrey mahinov (andreycom) 18.03.15 11:07
обработка - "Расходная накладная с диалогом выбора" (параметры в печатную форму передать нужно)
конфигурация - УТ11.0.6.9 платформа 8.3.5.1383

При выборе печатной формы с документа происходит открытие диалогового окна, после нажатия "печать" вываливается в данную ошибку.
24. Сергей Ожерельев (Поручик) 18.03.15 11:27
(23) Спасибо, поржал. Вы бы ещё УТ 11.0.4 от 2010 года использовали. Со старой УТ разбирайтесь сами.
25. Римма Герасименко (WhiteOwl) 03.04.15 13:31
Благодарю, пригодилось!
26. FarFar (FarFar) 20.05.15 14:16
Нашел, скачал, заработало.
Хороший пример!
УТ 11.1.9.66
27. Сергей Скр (Nx6600) 04.06.15 10:13
А можно ли как-нибудь реализовать печать с выводом диалоговой формы при печати комплекта? Команда печати комплекта отличается от команды печати отдельной формы тем, что комплект подготавливается полностью серверной процедурой.

Имеется ввиду комплект, настраиваемый через форму "НастройкаПечатиКомплекта". Готовый комплект (список форм и их количество) печатаются модулем менеджера регистра НастройкаПечатиОбъектов (процедура СформироватьКомплектВнешнихПечатныхФорм). Я не знаю как вызвать форму (причем логично и удобней) один раз для всего комплекта. (это где то в БСП 2.1.9)
28. Сергей Ожерельев (Поручик) 04.06.15 11:03
(27) Наверное, можно. Сам не интересовался
29. Александр Савченко (avsav) 01.07.15 11:35
Работает ли подобный код в Бухгалтерии предприятия 3.0?
У меня возникает ошибка "Поле объекта не обнаружено(ИдентификаторКоманды)"
30. Сергей Ожерельев (Поручик) 01.07.15 12:23
(29) С чего она у тебя возникает? Скачай обработку для БП 3.0 и сделай по образцу. Предварительно вкурись в матчасть.
31. Иван Шевкун (smallwood13) 21.08.15 05:27
Спасибо, хоть и не с первого раза, но всё получилось.
32. Дмитрий Соболев (JimmyBacsk) 11.09.15 10:55
Спасибо ERP 2.0 все работает. Долго парился с задачей пока не нашел эту статью.
33. Василий К (tofree) 24.11.15 23:40
Отличная статья. Можно еще ВызовКлиентскогоМетода вместо ОткрытиеФормы опробывать, все равно в итоге общая форма .печатьдокументов вызывается.
34. Константин Перминов (Perk0n) 10.03.16 19:01
Подскажите, как методами БСП вывести ВПФ документа (Акт) из произвольной обработки?
Сама ВПФ превосходно зарегистрирована и печатается из самого документа, а вот из обработки/другого документа (Реализация) не получается.

Разобрался. При вызове общей формы "ПечатьДокументов" в качестве "ПараметрыОткрытия.ИсточникДанных" передал Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(Моя_ВПФ).
35. kkm (user597906_kivolgin) 12.10.16 20:21
Добрый день,

Очень интересная и разжеванная статья!
Подскажите как модуле формы обработки можно получить ссылку на документ? Мне необходимо вывести для пользователя некоторые реквизиты из документа.
36. Сергей Ожерельев (Поручик) 12.10.16 23:42
(35)
        //Ссылки на вызвавшие форму объекты
        Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл
            ОбъектыНазначения.Добавить(ОбъектНазначения);
        КонецЦикла; //Для каждого ОбъектНазначения Из
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа