Статья была инициирована поиском способа отладить одну из нескольких печатных форм, которую не доделал внештатный программист, который, затем, как это обычно бывает, пропал. Погуглил - везде предлагают использовать обработку. Но это долго и не удобно..
А мысль была использовать механизмы привычные еще по работе в толстом клиенте.
Описываемый пример был сделан на конфигурации УТ 11 (печатная форма для документа Заказ клиента)
Все оказалось очень просто. Поискав в коде вызов метода печать, я просмотрел необходимые параметры к нему, добавил во внешнюю обработку форму (конечно, управляемую), реквизит формы со ссылкой на документ и кнопку печать.
Форму, которая получилась, можно увидеть на скрншоте.
А текст формы ниже:
&НаКлиенте
Процедура Печать(Команда)
ТабДок=Новый ТабличныйДокумент;
ЗаголовокТабДок="";
ПечатьНаСервере(СсылкаНаДок,ТабДок,ЗаголовокТабДок);
ТабДок.Показать(ЗаголовокТабДок);
КонецПроцедуры
&НаСервере
Процедура ПечатьНаСервере(СсылкаНаДок, ТабДок, ЗаголовокТабДок)
Массив=Новый Массив;
Массив.Добавить(СсылкаНаДок);
КоллекцияПечатныхФорм=Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("Картинка");
КоллекцияПечатныхФорм.Колонки.Добавить("ПолныйПутьКМакету");
КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
КоллекцияПечатныхФорм.Колонки.Добавить("Экземпляров");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяФайлаПечатнойФормы");
ПечФорма=КоллекцияПечатныхФорм.Добавить();
ПечФорма.ИмяВРЕГ=ВРег("СЧЕТ НА ОПЛАТУ_1");
ПечФорма.Экземпляров=1;
ПараметрыОтправки=Новый Структура;
ПараметрыОтправки.Вставить("Получатель");
ПараметрыОтправки.Вставить("Текст","");
ПараметрыОтправки.Вставить("Тема","");
ПараметрыВывода=Новый Структура;
ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно",Ложь);
ПараметрыВывода.Вставить("ПараметрыОтправки",ПараметрыОтправки);
ОбъектыПечати=Новый СписокЗначений;
ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
ОбъектДляСервера.Печать(
Массив,
КоллекцияПечатныхФорм,
ОбъектыПечати,
ПараметрыВывода
);
// Проверим, все ли макеты были сформированы
Для Каждого Стр Из КоллекцияПечатныхФорм Цикл
Если Стр.ТабличныйДокумент = Неопределено Тогда
ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В обработчике печати не был сформирован табличный документ для: %1'"),
Стр.ИмяМакета
);
ВызватьИсключение(ТекстСообщенияОбОшибке);
КонецЕсли;
Стр.ТабличныйДокумент.КоличествоЭкземпляров = Стр.Экземпляров;
КонецЦикла;
ТабДок=КоллекцияПечатныхФорм[0].ТабличныйДокумент;
ЗаголовокТабДок=КоллекцияПечатныхФорм[0].СинонимМакета;
КонецПроцедуры
Короче, все просто.
Пытливый ум может попробовать использовать все параметры, которые отправляются в процедуру Печать, но это надо далеко не всегда ))
Да, с тем табличным документом, что возвращает обработка, можно в принципе сделать что-то еще, не только Показать, но для целей отладки этого обычно не требуется.