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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9 Comments

  1. sansys

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

    Reply
  2. nytlenc

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

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

    Показать

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

    {ВнешняяОбработка.НакладнаяНаСписание.Форма.Форма.Форма(8,37)}: Переменная не определена (ВыполняемаяКоманда)

    ПараметрыОткрытия.ИсточникДанных = <<?>>ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка; (Проверка: Тонкий клиент)

    {ВнешняяОбработка.НакладнаяНаСписание.Форма.Форма.Форма(11,59)}: Переменная не определена (МассивОбъектов)

    ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = <<?>>МассивОбъектов; (Проверка: Тонкий клиент)

    т.к. эти переменные не определены в коде

    Reply
  3. Andrew189100

    Выполняемая команда — элемент стандартной структуры. Массив объектов, переменная передающаяся в процедуру печать.

    В справке по БСП это описано, хоть и, как обычно, криво. Что там надо определять в коде известно только вам…

    Reply
  4. its_user2

    Да автор не может нормально статью написать, у меня такие же ошибки. Только при печати они не появляются, т.к. в эту процедуру программа даже не заходит. Буду дальше искать…

    Reply
  5. staheev

    Ругается на Недопустимое значение параметра ПараметрКоманды при вызове метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.

    Ожидалось: Массив, ЛюбаяСсылка. Возникает при открытии общей формы. Дело в том, что ДополнительнаяОбработкаСсылка не присваивает значение ссылки на обработку, а равняется пустому значению.

    Reply
  6. surinat

    Согласна с staheev 15.05.19 14:39.

    Ошибка: ДополнительнаяОбработкаСсылка не присваивает значение ссылки на обработку, а равняется пустому значению.

    Не запускается ни как тест как внешняя обработка , ни из Дополнительных печатных форм.

    Не смогла отправить сообщение автору.

    При попытке написать выдалось сообщение — отложенная группа.

    Reply
  7. surinat

    Получается, что процедура не работающая.

    Ждем комментов автора. 🙂

    Reply
  8. surinat

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

    Reply
  9. michaelbag
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *