Поводом для написания послужили трудности с которыми я столкнулся при реализации данной задачи. Необходимо было разработать печатную форму с возможностью формирования дополнительного документа и вывода формы с ссылкой на сформированный документ, с целью его редактирования. После правки форма со ссылкой закрывается и продолжается процесс печати.
При печати с использованием типа команды "ВызовСерверногоМетода" информации много и никаких трудностей его использование не вызывает. Но, по очевидным причинам, использовать его нельзя, т. к. диалог с пользователем ведется "на клиенте". В этом случае справка по БСП предлагает использовать тип команды "ВызовКлиентскогоМетода" и три варианта его использования. В частности, для внешней печатной формы предлагается создать форму обработки и реализовать в ней процедуру печати следующего вида
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив)
//Реализация логики процедуры
КонецПроцедуры
В дополнении указано, что в параметре формы "ДополнительнаяОбработкаСсылка", передается ссылка этого объекта с типом Справочники.ДополнительныеОтчетыИОбработки. И на этом все.
Если с самой реализацией алгоритма выборки данных, созданием дополнительного документа и выводом формы со ссылкой на него проблем никаких, то с выводом на печать итогового документа возникли трудности. По логике, для использования механизма БСП надо вызвать вызвать процедуру печати,
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) и далее
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "МТТН") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ИмяМакета", "СинонимМакета", ТабличныйДокумент)
КонецЕсли;
Но, при прямом вызове этой процедуры с помощью
РеквзитФормыВЗначение(Объект).Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
работать не будет. Табличный документ формируется, выводится в коллекцию, но не отображается.
На этом месте я застрял на пару часов. "Гугление" особого результата не принесло. В основном предлагалось сформировать табличный документ и использовать его метод "Показать()". Но, хотелось получить результат аналогичный полученному с помощью "ВызоваСерверногоМетода", т. е. вывести документ в стандартную форму БСП "ПечатьДокументов". Наконец, на просторах интернета наткнулся на статью, где описана передача параметров во "внешнюю" форму обработки. Адаптировав информацию в статье под свою задачу, все получилось.
Итак, для реализации задачи необходимо:
Указать в интерфейсе регистрации обработки использование "ВызвовКлиентскогоМетода"
ДобавитьКоманду(ТаблицаКоманд, "ПредставлениеКоманды,"ИдентификаторКоманды",Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода,
,Истина, "ПечатьMXL");
Реализовать две процедуры "Печать" в соответствии с требованиями БСП, в основной форме обработки "НаКлиенте" и в модуле объекта обработки.
Далее, что бы вызвать процедуру печати из модуля объекта обработки, необходимо заполнить структуру параметров открытия формы и открыть общую форму "ПечатьДокументов".
Код процедуры "Печать" в форме выглядит так:
//Идентификатор - Идентификатор команды заданный в интерфейсе регистрации
//ОбъектыНазначенияМассив - массив объектов печати.
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив)
//Структура параметров формы, которую необходимо передать в форму при открытии
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
//Получаем параметр ДополнительнаяОбработкаСсылка, который так скупо описан в БПС, т. е.
//мы указываем ссылку на объект справочника "ДополнительныеОтчетыИОбработки, как источних данных для формы.
ПараметрыОткрытия.ИсточникДанных=ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;
//Еще одна структура описывающая параметры источника данных, вставляем в структуру идентификатор команды
//и массив объектов печати
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ИдентификаторКоманды;
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = МассивОбъектов;
//И открываем стандартную форму БСП, она сама вызовет процедуру печати модуля объекта обработки о отобразит табличный документ
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
На этом, в общем то, и все.
В файле пример обработки, использующей данный метод. Обработка печатает "Международную транспортную накладную (CMR)", на основе документов "РеализацияТоваровУслуг" и "ТранспортнаяНакладная". В случае отсутствия транспортных накладных, пользователю выводится предложение их создать и форма со ссылкой на созданный документ в случае согласия, для заполнения транспортной накладной согласно требованиям.
Обработка разработана для конфигурации УТ 11.2.3.218 (БСП 2.3.2.94).