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

02.11.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Внешняя печатная с использованием БСП и вызовом клиентского метода:
.epf 29,65Kb
110
110 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

1800 руб.

21.11.2024    3647    16    15    

18

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

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

27.12.2024    3446    PROSTO-1C    15    

43

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

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

11.12.2024    3906    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    997    Iaskeliainen    2    

7

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

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3342    milkers    3    

12

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

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

24.10.2024    1684    PROSTO-1C    0    

18

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

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1374    PROSTO-1C    4    

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

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

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