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

02.11.17

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

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

Скачать исходный код

Наименование Файл Версия Размер
Внешняя печатная с использованием БСП и вызовом клиентского метода:
.epf 29,65Kb
107
.epf 29,65Kb 107 Скачать

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

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

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

В дополнении указано, что в параметре формы "ДополнительнаяОбработкаСсылка", передается ссылка этого объекта с типом Справочники.ДополнительныеОтчетыИОбработки. И на этом все.

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

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)  и далее 

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


Но, при прямом вызове этой процедуры с помощью 

РеквзитФормыВЗначение(Объект).Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);

работать не будет. Табличный документ формируется, выводится в коллекцию, но не отображается.

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

Итак, для реализации задачи необходимо:

Указать в интерфейсе регистрации обработки использование "ВызвовКлиентскогоМетода"

ДобавитьКоманду(ТаблицаКоманд, "ПредставлениеКоманды,"ИдентификаторКоманды",Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода,

,Истина, "ПечатьMXL");

Реализовать две процедуры "Печать" в соответствии с требованиями БСП, в основной форме обработки "НаКлиенте" и в модуле объекта обработки.

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

Код процедуры "Печать" в форме выглядит так: 

//Идентификатор - Идентификатор команды заданный в интерфейсе регистрации

//ОбъектыНазначенияМассив - массив объектов печати.

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

//Структура параметров формы, которую необходимо передать в форму при открытии   

ПараметрыОткрытия  =  Новый Структура("ИсточникДанных, ПараметрыИсточника");

//Получаем параметр ДополнительнаяОбработкаСсылка, который так скупо описан в БПС, т. е.

//мы указываем ссылку на объект справочника "ДополнительныеОтчетыИОбработки, как источних данных для формы.    

ПараметрыОткрытия.ИсточникДанных=ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;

//Еще одна структура описывающая параметры источника данных, вставляем в структуру идентификатор команды

//и массив объектов печати

ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ИдентификаторКоманды;
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = МассивОбъектов;

//И открываем стандартную форму БСП, она сама вызовет процедуру печати модуля объекта обработки о отобразит табличный документ
   ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);

На этом, в общем то, и все.

В файле пример обработки, использующей данный метод. Обработка печатает "Международную транспортную накладную (CMR)", на основе документов "РеализацияТоваровУслуг" и "ТранспортнаяНакладная". В случае отсутствия транспортных накладных, пользователю выводится предложение их создать и форма со ссылкой на созданный документ в случае согласия, для заполнения транспортной накладной согласно требованиям. 

Обработка разработана для конфигурации УТ 11.2.3.218  (БСП 2.3.2.94).

Пример обработка Печать

См. также

Шаблон многопоточного выполнения фонового задания

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

Пример шаблона для многопоточного выполнения фонового задания на основе БСП. Шаблоны сделаны для процедуры и функции.

2 стартмани

03.05.2024    638    5    Hitcher    2    

7

БСП. Добавляем отчет в меню Отчеты

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

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3498    John_d    10    

92

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

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

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

01.03.2024    2031    dimanich70    8    

14

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

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

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

12.02.2024    846    FilippovRI    0    

15

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

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

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

07.02.2024    2774    YA_418728146    11    

47

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

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

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

19.01.2024    7232    PROSTO-1C    5    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sansys 76 03.11.17 11:37 Сейчас в теме
Статья очень полезная. В БСП всегда найдется что-то, что заставит споткнуться на ровном месте и статьи подобные этой делают разработку намного проще. Однозначно плюс.
mangy; user717534; +2 Ответить
2. nytlenc 04.11.17 16:04 Сейчас в теме
Ничего полезного не нашел. Исходя из статьи смотрим как автор предлагает оформить код процедуры Печать в форме на клиенте.

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

        // Добавил сам
КонецПроцедуры
Показать


как минимум естественно получаем

{ВнешняяОбработка.НакладнаяНаСписание.Форма.Форма.Форма(8,37)}: Переменная не определена (ВыполняемаяКоманда)
ПараметрыОткрытия.ИсточникДанных = <<?>>ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка; (Проверка: Тонкий клиент)
{ВнешняяОбработка.НакладнаяНаСписание.Форма.Форма.Форма(11,59)}: Переменная не определена (МассивОбъектов)
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = <<?>>МассивОбъектов; (Проверка: Тонкий клиент)

т.к. эти переменные не определены в коде
Рамзес; +1 Ответить
4. its_user2 17.08.18 09:02 Сейчас в теме
Да автор не может нормально статью написать, у меня такие же ошибки. Только при печати они не появляются, т.к. в эту процедуру программа даже не заходит. Буду дальше искать...
3. Andrew189100 17 04.11.17 20:15 Сейчас в теме
Выполняемая команда - элемент стандартной структуры. Массив объектов, переменная передающаяся в процедуру печать.
В справке по БСП это описано, хоть и, как обычно, криво. Что там надо определять в коде известно только вам...
5. staheev 15.05.19 14:39 Сейчас в теме
Ругается на Недопустимое значение параметра ПараметрКоманды при вызове метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.
Ожидалось: Массив, ЛюбаяСсылка. Возникает при открытии общей формы. Дело в том, что ДополнительнаяОбработкаСсылка не присваивает значение ссылки на обработку, а равняется пустому значению.
6. surinat 01.07.19 11:52 Сейчас в теме
Согласна с staheev 15.05.19 14:39.
Ошибка: ДополнительнаяОбработкаСсылка не присваивает значение ссылки на обработку, а равняется пустому значению.
Не запускается ни как тест как внешняя обработка , ни из Дополнительных печатных форм.
Не смогла отправить сообщение автору.
При попытке написать выдалось сообщение - отложенная группа.
7. surinat 01.07.19 11:53 Сейчас в теме
Получается, что процедура не работающая.
Ждем комментов автора. :)
8. surinat 01.07.19 11:54 Сейчас в теме
А задумка была хорошая. На эту тему действительно мало информации, но она очень нужная.
9. michaelbag 18.07.19 16:10 Сейчас в теме
Коллеги. Я поправил кое-что. Вот что в итоге в модуле формы:

&НаКлиенте
Процедура ПечатьОбъекта(Команда)
	ТаблДокум = Новый  ТабличныйДокумент;
	ПечатьОбъектаНаСервере(ТаблДокум);
	ТаблДокум.Показать("Печать документа");	
КонецПроцедуры

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

&НаСервере
Процедура ПриОткрытииНаСервере()
	СведенияОВнешнейОбработке = РеквизитФормыВЗначение("Объект").СведенияОВнешнейОбработке();
	Версия = СведенияОВнешнейОбработке.Версия;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПриОткрытииНаСервере();
КонецПроцедуры
Показать


...работает.

В модуле обработки местами код следующий:

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.3.43");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Версия = "1.0.2.31";
	ПараметрыРегистрации.БезопасныйРежим = Истина;
	ПараметрыРегистрации.Информация = "Спецификация заказа клиента с данными по срокам годности / сериям (#383, #382)";
	
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	ДобавитьКоманду(ТаблицаКоманд,
		НСтр("ru = 'Спецификация заказа'; en='Order Specification'"),
		"СпецификацияЗаказаКлиента",
		ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(), // Печатная форма
		Истина
		, "ПечатьMXL"
	);
		
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());
		
	Возврат ПараметрыРегистрации;
	
КонецФункции

...


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


Обратите внимание, что я вернулся к серверному вызову команды печати:

ТипКомандыВызовСерверногоМетода
10. alx7304 27.02.20 16:22 Сейчас в теме
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");

ПараметрыОткрытия.ИсточникДанных = НайтиЭлемент();

ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ИдентификаторКоманды;
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначенияМассив;

ОткрытьФорму("ВнешняяОбработка.ИнвентарнаяКарточка52н194н_ИнфГ.Форма.Форма",
,
ЭтаФорма,
УникальныйИдентификатор,,,
Новый ОписаниеОповещения("ПечатьЗавершение",ЭтаФорма,ПараметрыОткрытия),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);

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

&НаКлиенте
Процедура ПечатьЗавершение(Результат, ДопПараметры)Экспорт
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ДопПараметры);
КонецПроцедуры

&НаКлиенте
Процедура ПечатьИнвКарточки(Команда)
Закрыть();
КонецПроцедуры

&НаСервере
Функция НайтиЭлемент()
Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Инвентарная карточка (ред. 52н, в ред. 194н) (ИнфГ)");
КонецФункции
Показать
11. alx7304 27.02.20 16:30 Сейчас в теме
ПараметрыОткрытия.ИсточникДанных = НайтиЭлемент();
вот это фигня какая то, но лучше пока не знаю как.
12. alx7304 27.02.20 16:42 Сейчас в теме
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	
	ПараметрыОткрытия  =  Новый Структура("ИсточникДанных, ПараметрыИсточника");
	
	ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка;
		
	ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
	ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ИдентификаторКоманды;
	ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначенияМассив;
			
	ОткрытьФорму("ВнешняяОбработка.ИнвентарнаяКарточка52н194н_ИнфГ.Форма.Форма",
		,
		ЭтаФорма,
		УникальныйИдентификатор,,,
		Новый ОписаниеОповещения("ПечатьЗавершение",ЭтаФорма,ПараметрыОткрытия),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
		);
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьЗавершение(Результат, ДопПараметры)Экспорт 
	ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ДопПараметры);
КонецПроцедуры	

&НаКлиенте
Процедура ПечатьИнвКарточки(Команда)
	Закрыть();
КонецПроцедуры
Показать


Вот по статье https://infostart.ru/public/191796/ переделал
13. karneichik 07.12.20 03:08 Сейчас в теме
...
ПараметрыОткрытия.ИсточникДанных =
		СсылкаДополнительнойПечатнойФормы(ИдентификаторКоманды, "Документ.ЗаказКлиента");
...

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

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


"Легким движением руки брюки превращаются... превращаются брюки... брюки превращаются... В элегантные шорты!"
adhocprog; Stepka1206; farraf; +3 Ответить
14. Stepka1206 28.04.21 10:21 Сейчас в теме
(13)
СсылкаДополнительнойПечатнойФормы(ИдентификаторКоманды, "Документ.ЗаказКлиента")



Красавчег!!! Даже отладка работает во внешней обработке. (При условии что она подключена в доп обработках)
15. Andrew189100 17 05.05.21 18:44 Сейчас в теме
Господа и дамы. Извиняюсь, что не отвечал. Жизнь сделала крутой поворот, сменил поле деятельности и стало не до 1С...
Теперь поворот в обратную сторону. От чего ушел, практически к тому же и пришел. Придется навыки восстанавливать.
Посмотрел свою статью. Неужели это я написал... Половины не понял.

Что касается статьи. Приведенный код активно использовался в "продакшене"(сейчас этой конторы уже нет) на УТ 11 и работал без, каких-либо проблем...
user1346935; +1 Ответить
16. EvgeniyOlxovskiy 55 15.01.24 09:33 Сейчас в теме
У меня этот код сработал
&НаКлиенте
Процедура Сформировать(Команда)
	
	Если НЕ ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	ТабДок = СформироватьВнешнююПечатнуюФорму(Объект.ЗаказКлиента, Объект.ПечатнаяФорма, Объект.ИдентификаторКоманды);

	КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(Объект.ИдентификаторКоманды);
	КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДок;                                 
	
	УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм,, ЭтотОбъект);
	
КонецПроцедуры   
Показать
Оставьте свое сообщение