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

02.11.17

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

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

Скачать файл

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

24.10.2024    1088    PROSTO-1C    0    

12

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

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

08.10.2024    978    PROSTO-1C    4    

10

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

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    1829    MadRave    11    

24

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

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

10.09.2024    1816    MadRave    1    

17

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

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1254    n_mezentsev    10    

8

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

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4105    John_d    10    

52

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

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5354    PROSTO-1C    12    

52
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 65 15.01.24 09:33 Сейчас в теме
У меня этот код сработал
&НаКлиенте
Процедура Сформировать(Команда)
	
	Если НЕ ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	ТабДок = СформироватьВнешнююПечатнуюФорму(Объект.ЗаказКлиента, Объект.ПечатнаяФорма, Объект.ИдентификаторКоманды);

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