Изменение существующих или создание новых печатных форм – задача довольно распространённая. Как правило, в таких случаях создаётся внешняя печатная форма и подключается через стандартную подсистему дополнительных отчётов и обработок. Однако, иногда возникают задачи, в которых печатная форма должна формироваться с учётом данных, вводимых пользователями непосредственно перед печатью. То есть, сначала должна открыться форма, в которую пользователь вводит данные, и только потом выполняется команда "Печать".

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

Создаём внешнюю обработку. В модуле обработки, в функции СведенияОВнешнейОбработке(), устанавливаем параметры регистрации внешней обработки.

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

В этой же функции СведенияОВнешнейОбработке() при обращении к процедуре ДобавитьКоманду() для внешних печатных форм в параметр "Использование" обыкновенно передаётся значение "ВызовСерверногоМетода" или "ВызовКлиентскогоМетода". Здесь же мы укажем значение "ОткрытиеФормы".

В итоге функция будет выглядеть так:

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
	ПараметрыРегистрации.Вставить("Наименование", "Справка");
	ПараметрыРегистрации.Вставить("Версия", "2.0");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
	ПараметрыРегистрации.Вставить("Информация", "Справка");
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	ДобавитьКоманду(ТаблицаКоманд,
    "Справка",
    "ПФ_MXL_Справка",
    "ОткрытиеФормы",
    Истина,"");
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	Возврат ПараметрыРегистрации;
	
КонецФункции

Создаём макет печатной формы.

Далее создаём основную форму обработки и необходимые реквизиты формы. Создаём и размещаем на форме команду "Печать". Формировать табличный документ для печати будем в обработчике этой команды. В зависимости от того, какие данные требуются для печатной формы, организовываем заполнение табличного документа либо на клиенте, либо на сервере. В данном примере заполняем на сервере и затем возвращаем табличный документ на клиент.

Итак, в модуле формы:

&НаКлиенте
Процедура Печать(Команда) Экспорт
	
	ТабДок = СформироватьТабДокНаСервере();
	
КонецПроцедуры


&НаСервере
Функция СформироватьТабДокНаСервере()
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	//Получим макет
	ПечатнаяФормаОбъект = РеквизитФормыВЗначение("Объект");
	Макет = ПечатнаяФормаОбъект.ПолучитьМакет("ПФ_MXL_Справка");
	
	// Заполняем табличный документ:
	
	//Область Шапка
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьШапка.Параметры.ДатаВыдачи = //Заполняем параметры
	ТабличныйДокумент.Вывести(ОбластьШапка);
	
	//Область ОсновнаяЧасть
	ОбластьОсновнаяЧасть = Макет.ПолучитьОбласть("ОсновнаяЧасть");
	ОбластьОсновнаяЧасть.Параметры.ТекстСправки = //Заполняем параметры
	ТабличныйДокумент.Вывести(ОбластьОсновнаяЧасть);

	Возврат ТабличныйДокумент;
	
КонецФункции

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

Дополним обработчик команды "Печать":

&НаКлиенте
Процедура Печать(Команда) Экспорт
	
	ТабДок = СформироватьНаСервере();
	
	//Создаём новую коллекцию печатных форм
	КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Справка");
	
	//Добавляем в коллекцию сформированный табличный документ
	КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДок;
	
	//Устанавливаем параметры печати (при необходимости)
	КоллекцияПечатныхФорм[0].Экземпляров = 1;
	КоллекцияПечатныхФорм[0].СинонимМакета = "Справка";  //Так будет выглядеть имя файла при сохранении в файл из формы "Печать документов"
	
	//Вывод через стандартную процедуру БСП
 	УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, Неопределено, ЭтаФорма);
	
КонецПроцедуры

Теперь в результате выполнения команды "Печать" из формы нашей внешней обработки, табличный документ будет выводиться в форму "Печать документов", которая предоставляет удобный интерфейс для печати:

Комментарии   

0 #2 Борис 23.02.2022 20:48
Простите, а как получить данные того объекта, к которому будет привязана эта форма?
Печатная форма же должна заполняться данными из документа или справочника, к которому привязана.
Цитировать
+4 #1 Олег 22.02.2022 12:40
Реально работающий пример в отличие от других советов. Большое спасибо, у меня наконец все получилось !!!
Цитировать