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

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

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

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

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

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

Заготовка печатной формы.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

45 Comments

  1. EddieTocha

    Бухгалтерия предприятия, редакция 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’:

    форма: Элемент

    Reply
  2. Поручик

    (1) Откуда мне знать, куда вы что скопировали и как что сделали.

    Reply
  3. Поручик

    (1) Добавил печатную форму с выбором для Бухгалтерии предприятия 3.0. Ссылку найдёте в описании. Учитесь.

    Reply
  4. Поручик

    Ещё одна обработка с использованием методики.

    Внешняя печатная форма «Счет на оплату покупателю» для БУ 3.0 с ручным выбором параметров http://infostart.ru/public/248458/

    Reply
  5. Поручик

    Небольшие изменения в обработке для БСП недавних релизов.

    Reply
  6. SlavaVNL

    Отлично! Спасибо!

    Reply
  7. Dima69

    Небольшие изменения в обработке для БСП недавних релизов.?????????

    А что за изменения, а то моя обработка вдруг перестала работать

    выдает ошибку МЕТОД ОБЪЕКТА НЕ ОБНАРУЖЕН (МЕТАДАННЫЕ)

    Reply
  8. Поручик

    (7) Одноэсники через одного дятлы, точнее из трёх два дятла. И вот почему — что за обработка, какая конфигурация, типа протелепатируй, мне лень писать.

    Короче, разбирайся сам как знаешь. Приложенная ВПФ нормально работает в Управление торговлей 11.0.9 — 11.1.4.

    Reply
  9. alexpvs

    Большое спасибо за подсказанную методику по использованию общей формы ПечатьДокументов. У меня как раз с этим был затык, открытие формы для ввода параметров делается без проблем просто в описании сведений о внешней обработке

    Reply
  10. Поручик

    Обработка портирована для использования с БСП 2.2.3

    Reply
  11. Поручик

    Обработка портирована для использования с УТ 11.1.6

    Reply
  12. davdykin

    Поручик, спасибо большое за классную инструкцию. Хотелось бы уточнить:

    1. Где можно почитать мануал про БСП, на ИТС разбирался с данной обработкой печати — ни хорошего примера, нифига не нашел.

    2. Как отлаживать такую обработку?

    Reply
  13. jobkostya1c8

    Хорошо написано. Главное по делу и с примером.

    Возможность то вызова есть

    Для конфигураций линии УТ 10.3, БП 2.0 есть возможность передачи параметров, а также возможность без особых ухищрений вызвать форму обработки перед печатью с последующим выводом результата печати в штатное окно.

    вот только никто не использует 🙁

    В отраслевом ВДГБ Ломбард столкнулся. Печатные формы реализованы в виде отчета в конфигурации. Чтоб не передавать параметры (или, вернее чтоб передать параметр-объект документа, для вызова его (ДокументОбъекта) методов:

    ИначеЕсли ИмяМакета = «ЗалоговыйБилетМакетНаБланке» Тогда
    
    ОтчетЗБ = Отчеты.ЛМБ_ЗалоговыйБилетПоМакету.Создать();
    ОтчетЗБ.мДокументОбъект          = ЭтотОбъект;
    ОтчетЗБ.СсылкаНаОбъект           = Ссылка;
    ОтчетЗБ.мДанныеОСхеме            = мДанныеКредитования;
    ОтчетЗБ.мУчетнаяПолитикаЛомбарда = мУчетнаяПолитикаЛомбарда;
    
    ТабДокумент = ОтчетЗБ.Печать(Истина);
    
    КонецЕсли;
    

    Показать

    А уже от нажатой кнопки и как параметра «галочки» зависит вариант печати. Такой вот «штатный» механизм передачи параметров.

    Reply
  14. jobkostya1c8

    (12) davdykin, (12) davdykin, найти то в закрытке на ИТС, но там паролик нужен. Отдельно то конфигурация БСП поставляется как демка, но она, как и вся документация больше разработчикам в крупных фирмах нужна, где есть корпоративные стандарты.

    И это только для разработчиков новых конфигураций. Все равно подстраиваться приходится под то что есть.

    Reply
  15. Pipapalamm

    Автору спасибо.

    Разжевано специально для ленивых программистов.

    Reply
  16. cassyan

    Спасибо за статью. Всё разжёвано, и при этом ни капли воды. То, что нужно.

    Reply
  17. markgenuine

    Спасибо за статью, очень интересный метод.

    Reply
  18. Sam13

    Все верно. Кроме как таких «танцев с бубном» передать в обработку печати свое значение невозможно.

    Почему в БСП процедура написана таким образом? Что мешает добавить еще один параметр для передачи произвольных значений в эту процедуру. Непонятно.

    Если бы в процедуре печати была доступна ссылка на внешнюю обработку (справочник «ДополнительныеВнешниеОтчетыИОбработки»), то это облегчило бы жизнь.

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

    Я использовал такой метод: сделал две команды печати, одна команда печатной формы — для настройки параметров печати, вторая команда — для печати с уже настроенными ранее параметрами.

    Форма для настройки параметров открывается и сохраняет значения в реквизит «ХранилищеНастроек» справочника «ДополнительныеВнешниеОтчетыИОбработки».

    Вторая команда (печать с готовыми настройками) при открытии имея ссылку на справочник «ДополнительныеВнешниеОтчетыИОбработки» читает сохраненные настройки и сразу уходит на печать не открывая форму.

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

    Reply
  19. andreycom

    При запуске печатной формы такие проблемы:

    {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(54)}: Поле объекта не обнаружено (БезопасныйРежим)

    ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(ИсточникДанных, ПараметрыИсточника.БезопасныйРежим);

    Подскажите пжл куда копать?

    Reply
  20. Поручик

    (21) И как мне протелепатировать релиз используемой БСП или конфы? И какая именно обработка?

    Reply
  21. andreycom

    обработка — «Расходная накладная с диалогом выбора» (параметры в печатную форму передать нужно)

    конфигурация — УТ11.0.6.9 платформа 8.3.5.1383

    При выборе печатной формы с документа происходит открытие диалогового окна, после нажатия «печать» вываливается в данную ошибку.

    Reply
  22. Поручик

    (23) Спасибо, поржал. Вы бы ещё УТ 11.0.4 от 2010 года использовали. Со старой УТ разбирайтесь сами.

    Reply
  23. WhiteOwl

    Благодарю, пригодилось!

    Reply
  24. FarFar

    Нашел, скачал, заработало.

    Хороший пример!

    УТ 11.1.9.66

    Reply
  25. Nx6600

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

    Имеется ввиду комплект, настраиваемый через форму «НастройкаПечатиКомплекта». Готовый комплект (список форм и их количество) печатаются модулем менеджера регистра НастройкаПечатиОбъектов (процедура СформироватьКомплектВнешнихПечатныхФорм). Я не знаю как вызвать форму (причем логично и удобней) один раз для всего комплекта. (это где то в БСП 2.1.9)

    Reply
  26. Поручик

    (27) Наверное, можно. Сам не интересовался

    Reply
  27. avsav

    Работает ли подобный код в Бухгалтерии предприятия 3.0?

    У меня возникает ошибка «Поле объекта не обнаружено(ИдентификаторКоманды)»

    Reply
  28. Поручик

    (29) С чего она у тебя возникает? Скачай обработку для БП 3.0 и сделай по образцу. Предварительно вкурись в матчасть.

    Reply
  29. smallwood13

    Спасибо, хоть и не с первого раза, но всё получилось.

    Reply
  30. JimmyBacsk

    Спасибо ERP 2.0 все работает. Долго парился с задачей пока не нашел эту статью.

    Reply
  31. tofree

    Отличная статья. Можно еще ВызовКлиентскогоМетода вместо ОткрытиеФормы опробывать, все равно в итоге общая форма .печатьдокументов вызывается.

    Reply
  32. Perk0n

    Подскажите, как методами БСП вывести ВПФ документа (Акт) из произвольной обработки?

    Сама ВПФ превосходно зарегистрирована и печатается из самого документа, а вот из обработки/другого документа (Реализация) не получается.

    Разобрался. При вызове общей формы «ПечатьДокументов» в качестве «ПараметрыОткрытия.ИсточникДанных» передал Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(Моя_ВПФ).

    Reply
  33. user597906_kivolgin

    Добрый день,

    Очень интересная и разжеванная статья!

    Подскажите как модуле формы обработки можно получить ссылку на документ? Мне необходимо вывести для пользователя некоторые реквизиты из документа.

    Reply
  34. Поручик

    (35)

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

    Передо мной стояла аналогичная задача и я решил её таким же способом — посредством передачи параметра в первом элементе массива ОбъектыНазначения. Решение не очень красивое, но работает и альтернативы ему я не вижу. Жаль что 1С не предоставила удобного механизма решения этой задачи.

    Reply
  36. ulovka

    Добрый вечер!

    Подскажите пожалуйста: у вас в форме обработки есть реквизит ТаблицаНоменклатуры, в которую попадает номенклатура из документа, и можно установить пометку. А как сделать так, чтоб в печатную форму попадала только помеченная номенклатура? У меня аналогичная задача. С обычными реквизитами все ок, а вот с тз что-то никак (((

    Reply
  37. Поручик

    (38) Только помеченная и попадает, что не так?

    Reply
  38. Поручик

    (38) https://infostart.ru/public/73548/

    ТоварныйЧек для УТ 11078 (с выбором товара).epf — для Управление Торговлей 11.0.7.8 и позднее (для документов Чек ККМ, реализация товаров/услуг, заказ клиента) с формой выбора позиций для печати

    Reply
  39. ulovka

    (39) Странно, попадает вся. Приложу скриншоты, чтоб не быть голословным. УТ 11.3.4.103

    Reply
  40. koloss

    Использовал Вызов клиентского метода. В форме обработки в процедуре Печать(ИдентификаторКоманды,ОбъектыНазначения) Экспорт

    АдресХранилища=ПоместитьВоВременноеХранилище(ОбъектыНазначения,Новый УникальныйИдентификатор);
    КлючУникальностиФормы = АдресХранилища;
    ОткрытьФорму(ПолучитьПолноеИмяФормы(«Форма»),,ЭтаФорма,КлючУникальностиФормы);
    
    Функция ПолучитьПолноеИмяФормы(ИмяФормы)
    Возврат Лев(ЭтотОбъект.ИмяФормы, СтрНайти(ЭтотОбъект.ИмяФормы, «.», НаправлениеПоиска.СКонца)) + ИмяФормы;
    КонецФункции

    На кнопку Выполнить формы повесил команду, в ней написал

    ОбъектыНазначения = ПолучитьИзВременногоХранилища(ЭтаФорма.КлючУникальности);

    Через реквизиты формы(обработки) достал нужные данные (ЭтаФорма.Объект.ИмяРеквизита)

    https://infostart.ru/public/310553/

    Reply
  41. XelOla

    А как перед печатью ВПФ задать вопрос и по ответу печатать ту или иную форму (без кнопочки печать)

    Reply
  42. lisav

    ошибка как в первом посте «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.» может возникнуть, когда в список в качестве значения добавляется элемент списка, а не его значение. Надо тогда исправить следующую строчку:

    ОбъектыНазначения.Добавить(ОбъектНазначения.Значение);
    
    Reply
  43. leda69@list.ru

    Спасибо большое за подробное объяснение! Всё получилось.

    Reply
  44. tmixsam
    Reply
  45. Yelloow1

    Спасибо)

    Reply

Leave a Comment

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