---
title: Внешняя печатная форма (Только программно)
slug: общие-дополнительные-отчеты-и-обработки/внешняя-печатная-форма-только-программно
---

# Настройка обработки

Создаем новую **`внешнюю обработку`**

Создаем **`макет печатной формы`** и **`форму обработки`** для тестирования. **На форме ничего не делаем**

# Модуль формы
```bsl
////////////////////////////////////////////////////////////////////////////////
// Не забудь забиндить событие формы ПриСозданииНаСервере к обработчику
// В обработчике ПриСозданииНаСервере нужно указать описание типов для списка объектов печати
//  
////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
    ДополнительнаяОбработка = Неопределено;
    ИдентификаторКоманды = "";
    ОбъектыНазначения = Новый Массив;
    
    Параметры.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработка);
    Параметры.Свойство("ИдентификаторКоманды", ИдентификаторКоманды);
    Параметры.Свойство("ОбъектыНазначения", ОбъектыНазначения);
   
    Если ТипЗнч(ОбъектыНазначения) <> Тип("Массив") Тогда
        ВызватьИсключение "Неверный тип параметра ""Объекты назначения""";
    КонецЕсли;

    ДобавляемыеРеквизиты = Новый Массив;
    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ДополнительнаяОбработкаСсылка",
        Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")));
    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИдентификаторКоманды", ОбщегоНазначения.ОписаниеТипаСтрока(0)));
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОбъектыНазначения", Новый ОписаниеТипов("СписокЗначений")));   
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СписокОбъектовПечати", Новый ОписаниеТипов("СписокЗначений")));
       
    ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    ЭтотОбъект["ДополнительнаяОбработкаСсылка"] = ДополнительнаяОбработка;
    ЭтотОбъект["ИдентификаторКоманды"] = ИдентификаторКоманды;
    ЭтотОбъект["ОбъектыНазначения"].ЗагрузитьЗначения(ОбъектыНазначения);
    
    НовыйЭлемент = Элементы.Добавить("СписокОбъектовПечати", Тип("ПолеФормы"), ЭтотОбъект);
    НовыйЭлемент.Заголовок = "Список объектов печати";
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "СписокОбъектовПечати";
    НовыйЭлемент.УстановитьДействие("НачалоВыбора", "СписокОбъектовПечатиНачалоВыбора");
    
    НоваяКоманда = ЭтотОбъект.Команды.Добавить("ТестПечати");
    НоваяКоманда.Заголовок = "Тест печати";
    НоваяКоманда.Действие = "ТестПечати";
    
    НовыйЭлемент = Элементы.Добавить("КомандаТестПечати", Тип("КнопкаФормы"), КоманднаяПанель);
    НовыйЭлемент.Заголовок = "Тест печати";
    НовыйЭлемент.ИмяКоманды = "ТестПечати";
    НовыйЭлемент.КнопкаПоУмолчанию = Истина;   
    
    // ================================================== ВАЖНО =========================================================
    // Тут укажи нужжный тип
    СписокДокументов = Новый СписокЗначений;
    СписокДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСсылка.МойДокумент");
    
    ЭтотОбъект["СписокОбъектовПечати"] = СписокДокументов;
    // ==================================================================================================================
    
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ТестПечати(Команда)

    МассивДокументов = ЭтотОбъект["СписокОбъектовПечати"].ВыгрузитьЗначения();
    МассивПечатныхФорм = СписокСформированныхПечатныхФорм(МассивДокументов);
    УправлениеПечатьюКлиент.ПечатьДокументов(МассивПечатныхФорм, МассивДокументов ,ЭтотОбъект);

КонецПроцедуры

#КонецОбласти  
 
#Область СлужебныеПроцедурыИФункции

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

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

&НаСервере
Функция СписокСформированныхПечатныхФорм(МассивДокументов)

    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    
    // ТУТ ТОТ ЖЕ ИДЕНТИФИКАТОР, ЧТО И В МОДУЛЕ ОБЪЕКТА ОБРАБОТКИ
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ПФ_MXL_БиркаНесоответствующейПродукции");
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    ОбработкаОбъект.Печать(МассивДокументов, КоллекцияПечатныхФорм, МассивДокументов, ПараметрыВывода);
    
    МассивПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
    
    Возврат МассивПечатныхФорм;

КонецФункции

#КонецОбласти
```

# Модуль объекта обработки
```bsl
#Область СлужебныйПрограммныйИнтерфейс
 
Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
	Представление = "Моя печатная форма. Это будет видеть пользователь";
	Идентификатор = "УникальноеИмяКомандыКонкретноЭтойПечатнойФормы"; // произвольное имя. используется далее по коду и в модуле формы
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Назначение = МассивНазначений();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	ПараметрыРегистрации.Информация = "Это будет видно в карточке дополнительной обработки. Сюда пишем всякую полезную информацию";
	
	Команда = ПараметрыРегистрации.команды.Добавить();
	Команда.Представление = Представление;
	Команда.Идентификатор = Идентификатор;
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
	Команда.ПоказыватьОповещение = Истина;
	Команда.Модификатор = "ПечатьMXL"; // ВАЖНО
	
	Возврат ПараметрыРегистрации;
	
КонецФункции
 
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
 
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "УникальноеИмяКомандыКонкретноЭтойПечатнойФормы") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"УникальноеИмяКомандыКонкретноЭтойПечатнойФормы",
			"Синоним макета",
			СформироватьСобственнуюПечатнуюФорму(МассивОбъектов, ОбъектыПечати)); // тут вызов нашей функции, которая будет возвращать заполненный ТабДок
	КонецЕсли;
	
КонецПроцедуры
 
#КонецОбласти
 
#Область СлужебныеПроцедурыИФункции
 
Функция МассивНазначений()
	
	МассивНазначений = Новый Массив;
	// Имя документа, для которого нацелена эта печатка. Пишем как в запросе
	// Можно добавлять несколько назначений, но тогда нужно при получении данных для ПФ это учитывать
	// Это назначение определяет, для каких документов будет выведена команда в группу "Печать"
	МассивНазначений.Добавить("Документ.ПриобретениеТоваровУслуг"); 
	Возврат МассивНазначений;
	
КонецФункции
 
Функция СформироватьСобственнуюПечатнуюФорму(МассивОбъектов, ОбъектыПечати) Экспорт
	
	ТабДок = Новый ТабличныйДокумент;
	
	ДанныеДляПечати = ДанныеДляПечатиМоихДокументов(МассивОбъектов); // тут получаем данные для вывода
	
	// Получаем данные, получаем макет, заполняем, возвращаем
	
	ТабДок.Область("R1C1").Текст = "Пример вывода";
	
	Возврат ТабДок;
	
КонецФункции
 
Функция ДанныеДляПечатиМоихДокументов(МассивОбъектов)
	
	// Тут получаем данные
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ * Из Документ.ПриобретениеТоваровУслуг КАК Т ГДЕ Т.Ссылка В(&МассивОбъектов)";
	Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Возврат Выборка;
	
КонецФункции
 
#КонецОбласти
```


