Для того, чтобы не захламлять интерфейс печати внешними формами и исключить ошибку печати не той формы, которая нужна в конкретной ситуации был реализован алгоритм печати внешних печатных форм. В форме добавляется Команда "Печать ..." (чтобы было понятно для пользователя), размещается где-нибудь на форме и создаётся Процедура в модуле формы.
Предлагаю на суд читателей два алгоритма печати внешних печатных форм.
1. Печать с выводом шаблона на экран.
&НаКлиенте
Процедура ПечатьАкта(Команда) // команда печати формы
Док = ТекДанные.Ссылка; // получение ссылки Документа
ВПФ = НайтиВПФ(Док); // получение Внешней печатной формы
// у меня ВПФ привязана к реквизиту документа, если нужно найти запись в Справочнике ДополнительныеОтчетыИОбработки,
// то надо переписать Функцию НайтиВПФ
ОбъектыНазначения = Новый Массив;
ОбъектыНазначения.Добавить(Док);
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = ВПФ;
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ИдентификаторКомандыПечати1 = КомандыНаСервере(ВПФ);
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ИдентификаторКомандыПечати1;
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиВПФ(Док) //можно передавать НаименованиеВПФ
ВПФ = Док.Контракт.ПечатнаяФормаАкта; // получаем ссылку на ВПФ из переданного документа
Возврат ВПФ;//Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеВПФ);//если надо найти по имени
КонецФункции
&НаСервереБезКонтекста
Функция КомандыНаСервере(ВПФ)
Возврат ВПФ.Наименование;
КонецФункции
В результате, Вы сможете лицезреть заполненный шаблон печатной формы на экране.
В случае, когда надо печатать массив документов с различными шаблонами форм (внешними печатными формами), то
2. Печать внешней печатной формы прямо на принтер.
&НаКлиенте
Процедура ПечатьАкта(Команда)
Для каждого ТекДанные из Объект.Акты Цикл //массив документов
Док = ТекДанные.Акт;
ВПФ = НайтиВПФ(Док);
ОбъектыНазначения = Новый Массив;
ОбъектыНазначения.Добавить(Док);
ОбъектыПечати = Новый СписокЗначений;
МассивПечатныхФорм = ПечатьФормыНаСервере(ОбъектыНазначения,ВПФ, ОбъектыПечати);
ТабДок = МассивПечатныхФорм[0].ТабличныйДокумент;
ТабДок.Напечатать();//печать сразу на принтер, можно вывести печатную форму если .Показать()
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПечатьФормыНаСервере(ОбъектыНазначения, Форма , ОбъектыПечати)
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Форма.Команды[0].Идентификатор);
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ДвоичныеДанные = Форма.ХранилищеОбработки.Получить();
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ИмяОбр = ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, Ложь);
Об = ВнешниеОбработки.Создать(ИмяОбр);
Об.Печать(ОбъектыНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
МассивПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
Возврат МассивПечатныхФорм;
КонецФункции
&НаСервереБезКонтекста
Функция НайтиВПФ(Док)
ВПФ = Док.Контракт.ПечатнаяФормаАкта;
Возврат ВПФ;//Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеВПФ);//если надо найти по имени
КонецФункции
сразу печатает на принтер.
P.S. Чтобы не потерялось и, может, кому пригодится.