В режиме "Конфигуратор" создаём новый файл с типом "Внешняя обработка".

Создаём макет внешней обработки. В соответствии со стандартами "Библиотеки стандартных подсистем" название макета должно начинаться с символов "ПФ_MXL_НазваниеМакета”.

Пример макета:

1С. Создание внешней печатной формы.

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

# Область ПодключениеОбработки

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


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


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

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

Нужно обратить внимание на функцию СведенияОВнешнейОбработке(). А именно на параметры процедуры ДобавитьКоманду().

Если мы указываем в параметрах "ВызовСерверногоМетода", то в модуле обработки должна находиться процедура Печать(). При печати система будет обращаться к ней.

Если же мы указываем параметр "ВызовКлиентскогоМетода", то процедура Печать() должна находиться в модуле формы обработки.

Рассмотрим вариант "ВызовСерверногоМетода".

Размещаем процедуру Печать() в модуле объекта обработки. Процедуру копируем из менеджера объекта, для которого делаем печатную форму. В данном случае процедура Печать() взята из менеджера объекта конфигурации "Документ.ПоступлениеТоваровУслуг". Удаляем из процедуры всё лишнее и прописываем данные своей печатной формы, которые мы задали в функции СведенияОВнешнейОбработке().

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, ПараметрыПечати = Неопределено) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПФ_MXL_АктОСоответствииНоменклатуры") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм, "ПФ_MXL_АктОСоответствииНоменклатуры", НСтр("ru='Акт о соответствии номенклатуры'"),
			СформироватьПечатнуюФормуАктаОСоответствииНоменклатуры(МассивОбъектов, ОбъектыПечати, ПараметрыПечати));
	КонецЕсли;
		
	ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
	
КонецПроцедуры

В параметры процедуры УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию() вписываем свою функцию, в которой будем получать данные для печатной формы и заполнять ими наш макет.

Наша функция в параметрах процедуры УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию() выглядит так:

СформироватьПечатнуюФормуАктаОСоответствииНоменклатуры(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)

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

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

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПоступлениеТоваровУслугТовары.НоменклатураПоставщика.Наименование КАК НоменклатураПоставщика,
		|	ПоступлениеТоваровУслугТовары.Количество КАК Количество,
		|	ПоступлениеТоваровУслугТовары.Сумма КАК Стоимость,
		|	ПоступлениеТоваровУслугТовары.Номенклатура.Наименование КАК НоменклатураВнутренняя,
		|	ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК Артикул,
		|	ПоступлениеТоваровУслугТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдИзмВнутренняя,
		|	ПоступлениеТоваровУслугТовары.Ссылка КАК ДокументСсылка,
		|	ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата
		|ИЗ
		|	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
		|ГДЕ
		|	ПоступлениеТоваровУслугТовары.Ссылка В(&МассивОбъектов)
		|	И НЕ ПоступлениеТоваровУслугТовары.НоменклатураПоставщика.Наименование ЕСТЬ NULL ";
		
	Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов[0]);
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	
	Для Каждого ТекущаяСтрока Из РезультатЗапроса Цикл
	ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, ТекущаяСтрока);
	ТабличныйДокумент.Вывести(ОбластьСтроки);
	КонецЦикла;

	ОбластьНижняяСтрокаТаблицы = МакетОбработки.ПолучитьОбласть("НижняяСтрокаТаблицы");
	ТабличныйДокумент.Вывести(ОбластьНижняяСтрокаТаблицы);

	//Заполняем подвал
	ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
	ОбластьПодвал.Параметры.ДатаДокумента = ДокументСсылка.Дата;
	ТабличныйДокумент.Вывести(ОбластьПодвал);

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

При заполнении табличной части использована полезная процедура ЗаполнитьЗначенияСвойств().

Данная процедура позволяет копировать значения свойств объекта-источника в свойства объекта-приемника. Одним из применений данной процедуры может являться заполнение реквизитов одного документа реквизитами другого. Если объекты имеют сходную структуру, то использование процедуры встроенного языка ЗаполнитьЗначенияСвойств() позволит скопировать значения одноименных реквизитов из одного объекта в другой.

Внешняя печатная форма готова. Подключается она к программе с помощью стандартной подсистемы "Дополнительные обработки".

Сопутствующая животрепещущая тема – отладка. Про один из вариантов отладки можно почитать в статье Отладка внешней печатной формы.