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

02.11.17

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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

01.03.2024    1304    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    5212    PROSTO-1C    5    

45

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

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

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

15.01.2024    3804    0    Infostart    0    

20

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

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

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

28.12.2023    4836    mrXoxot    11    

99
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 15 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 15 05.05.21 18:44 Сейчас в теме
Господа и дамы. Извиняюсь, что не отвечал. Жизнь сделала крутой поворот, сменил поле деятельности и стало не до 1С...
Теперь поворот в обратную сторону. От чего ушел, практически к тому же и пришел. Придется навыки восстанавливать.
Посмотрел свою статью. Неужели это я написал... Половины не понял.

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

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