Внешняя печатная форма прикрепляется к базе как дополнительная обработка через "Дополнительные отчеты и обработки". Для отладки все выведено на форму.
Все тесты производились на платформе 8.3.20.1914, однако код отработает на любой из 8.2, 8.3. База КА 2.4.
Текст модуля объекта
Функция СведенияОВнешнейОбработке() Экспорт
оМетаданные = Метаданные();
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Наименование = оМетаданные.Синоним;
ПараметрыРегистрации.Версия = оМетаданные.Комментарий;
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Информация = оМетаданные.Синоним;
Назначение = Новый Массив;
Назначение.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Вставить("Назначение", Назначение);
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = оМетаданные.Синоним;
НоваяКоманда.Идентификатор = оМетаданные.Имя;
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ВнешняяПечатнаяФормаСОтладкой") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ВнешняяПФ",
НСтр("ru='Внешняя ПФ'"),
СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, Неопределено));
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецЕсли;
КонецПроцедуры
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ОтображатьСетку = Ложь;
ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ВНЕШНЯЯ_ПФ";
Макет = ПолучитьМакет("Макет");
ЭтоПервыйДокумент = Истина;
УстановитьПривилегированныйРежим(Истина);
Для Каждого ЗаказКлиента Из МассивОбъектов Цикл
Если ЭтоПервыйДокумент Тогда
ЭтоПервыйДокумент = Ложь;
Иначе
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
// ШАПКА
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьМакета);
// Заполнение табличного документа
Итого = 0;
Валюта = ЗаказКлиента.Валюта;
// ПОДВАЛ
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.Итого = Итого;
ОбластьПодвал.Параметры.ИтоговаяСтоимостьЧисло = "" + Итого + " " + Валюта;
ОбластьПодвал.Параметры.ИтоговаяСтоимостьТекст = "(" + ЧислоПрописью(Итого, "Л=ru_RU; ДП=Истина", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2") + ")";
// Получение данных ответсвенных лиц из ДО по связанному документу.
ПодписантОрганизация = "";
ПодписантКонтрагент = "";
ДолжностьПодписантОрганизация = "";
ДолжностьПодписантКонтрагент = "";
Результат = ИнтеграцияС1СДокументооборотВызовСервера.ДанныеОбъектаДОПоВнешнемуОбъекту(ЗаказКлиента);
Если Результат <> Неопределено Тогда // найден
Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьПрокси();
ОбъектXDTO = ИнтеграцияС1СДокументооборот.ПолучитьОбъект(Прокси, Результат.type, Результат.ID);
Если ОбъектXDTO.objects.Количество() > 0 И ОбъектXDTO.objects[0].partyRows.rows.Количество() > 0
И ОбъектXDTO.objects[0].partyRows.rows[0].signedBy <> Неопределено Тогда
ПодписантОрганизация = ОбъектXDTO.objects[0].partyRows.rows[0].signedBy.name;
КонецЕсли;
Если ОбъектXDTO.objects.Количество() > 0 И ОбъектXDTO.objects[0].partyRows.rows.Количество() > 1
И ОбъектXDTO.objects[0].partyRows.rows[1].signedBy <> Неопределено Тогда
ПодписантКонтрагент = ОбъектXDTO.objects[0].partyRows.rows[1].signedBy.name;
ФИОПодписант = СтрРазделить(ПодписантКонтрагент, " ", Истина);
Если ФИОПодписант.Количество() = 3 Тогда
ПодписантКонтрагент = ФИОПодписант[0] + " " + Лев(ФИОПодписант[1], 1) + ". " + Лев(ФИОПодписант[2], 1) + ".";
КонецЕсли;
ПодписантXDTO = ИнтеграцияС1СДокументооборот.ПолучитьОбъект(Прокси, ОбъектXDTO.objects[0].partyRows.rows[1].signedBy.objectID.type, ОбъектXDTO.objects[0].partyRows.rows[1].signedBy.objectID.ID);
Если ПодписантXDTO.objects.Количество() > 0 Тогда
ДолжностьПодписантКонтрагент = ПодписантXDTO.objects[0].position;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ПодписантОрганизация) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтветственныеЛицаОрганизаций.ФизическоеЛицо КАК ФизическоеЛицо,
| ОтветственныеЛицаОрганизаций.Должность КАК Должность
|ИЗ
| Справочник.ОтветственныеЛицаОрганизаций КАК ОтветственныеЛицаОрганизаций
|ГДЕ
| ОтветственныеЛицаОрганизаций.ОтветственноеЛицо = ЗНАЧЕНИЕ(Перечисление.ОтветственныеЛицаОрганизаций.Руководитель)
| И ОтветственныеЛицаОрганизаций.Владелец = &Владелец
| И ОтветственныеЛицаОрганизаций.ДатаНачала <= &Дата
| И (ОтветственныеЛицаОрганизаций.ДатаОкончания >= &Дата
| ИЛИ ОтветственныеЛицаОрганизаций.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))
| И ОтветственныеЛицаОрганизаций.ФизическоеЛицо.Наименование = &Наименование";
Запрос.УстановитьПараметр("Владелец", ЗаказКлиента.Организация);
Запрос.УстановитьПараметр("Дата", ЗаказКлиента.Дата);
Запрос.УстановитьПараметр("Наименование", ПодписантОрганизация);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПодписантОрганизация = ФизическиеЛицаУТ.ФамилияИнициалыФизЛица(Выборка.ФизическоеЛицо, ЗаказКлиента.Дата);
ДолжностьПодписантОрганизация = Выборка.Должность;
КонецЕсли;
Иначе
ОтвЛ = ОтветственныеЛицаБП.ОтветственныеЛица(ЗаказКлиента.Организация, ЗаказКлиента.Дата);
ПодписантОрганизация = ОтвЛ.РуководительПредставление;
ДолжностьПодписантОрганизация = ОтвЛ.РуководительДолжностьПредставление;
КонецЕсли;
ОбластьПодвал.Параметры.Организация = ЗаказКлиента.Организация.НаименованиеСокращенное;
ОбластьПодвал.Параметры.Контрагент = ЗаказКлиента.Контрагент.НаименованиеПолное;
ОбластьПодвал.Параметры.ДолжностьПодписантОрганизация = ?(ЗначениеЗаполнено(ДолжностьПодписантОрганизация), ДолжностьПодписантОрганизация, "Представитель");
ОбластьПодвал.Параметры.ДолжностьПодписантКонтрагент = ?(ЗначениеЗаполнено(ДолжностьПодписантКонтрагент), ДолжностьПодписантКонтрагент, "Представитель");
ОбластьПодвал.Параметры.ПодписантОрганизация = ПодписантОрганизация;
ОбластьПодвал.Параметры.ПодписантКонтрагент = ПодписантКонтрагент;
// Окрасим незаполненные поля
Если НЕ ЗначениеЗаполнено(ДолжностьПодписантКонтрагент) Тогда
ОбластьПодвал.Область(6,3,6,4).ЦветФона = ЦветаСтиля.ПолеСОшибкойФон;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьПодвал);
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь);
Возврат ТабличныйДокумент;
КонецФункции
Текст формы
&НаСервере
Функция ВыполнитьПечатьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.ивЗаказ);
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(Объект.ивЗаказ);
ТабличныйДокумент = ОбработкаОбъект.СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, Неопределено);
Возврат ТабличныйДокумент;
КонецФункции
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
ВыполнитьПечатьНаСервере().Показать();
КонецПроцедуры
Данный шаблон внешней печатной формы был добавлен для ускорения поиска нужного кода и разработки.
Статья будет дорабатываться, будет добавлен полезный функционал, используемый в ПФ.