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

Печать - Универсальные печатные формы

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4

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

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

См. также

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

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

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


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

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

т.к. эти переменные не определены в коде
4. its_user2 17.08.18 09:02 Сейчас в теме
Да автор не может нормально статью написать, у меня такие же ошибки. Только при печати они не появляются, т.к. в эту процедуру программа даже не заходит. Буду дальше искать...
3. Andrew189100 4 04.11.17 20:15 Сейчас в теме
Выполняемая команда - элемент стандартной структуры. Массив объектов, переменная передающаяся в процедуру печать.
В справке по БСП это описано, хоть и, как обычно, криво. Что там надо определять в коде известно только вам...
Оставьте свое сообщение