С помощью БСП (библиотека стандартных подсистем) можно реализовать заполнение печатной формы в формате office open XML. Для этого необходимо особым образом разметить макет печатной формы. Макет можно подготовить в любом приложении, которое работает со стандартном office open XML (Microsoft Word, OpenOffice.org Writer, Google Docs и др.). Области макета выделяются с помощью разделителей специального вида:
{v8 Область.<ИмяОбласти>}
...
{/v8 Область.<ИмяОбласти>}
Каждая область может содержать параметры:
{v8 <ИмяПараметра>}
Подробное описание создания печатной формы в формате office open XML можно прочитать в документации к БСП. Также в демо базе БСП есть готовые примеры печатных форм в формате office open XML (ссылка на скачивание БСП).
Шаблон печатной формы:
#Область СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.3.223");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "3.0.3.223";
ПараметрыРегистрации.Наименование = НСтр("ru ='Печатная форма (формат Office Open XML)'");
ПараметрыРегистрации.Информация = НСтр("ru ='Печатная форма (формат Office Open XML)'");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Определение объектов, к которым подключается эта обработка.
МассивНазначений = Новый Массив;
ПараметрыРегистрации.Назначение = МассивНазначений;
// Добавление команд.
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru ='Печатная форма (формат Office Open XML)'");
НоваяКоманда.Идентификатор = "ПечатнаяФормаOfficeOpenXML";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.Модификатор = "";
Возврат ПараметрыРегистрации;
КонецФункции
#КонецОбласти
#Область Печать
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПечатнаяФормаOfficeOpenXML");
Если ПечатнаяФорма <> Неопределено Тогда
ИмяМакета = "ПФ_DOC_ПечатнаяФорма";
ДанныеМакетов = МакетыОбъектаДляПечати(ИмяМакета);
ОфисныеДокументы = Новый Соответствие;
Для Каждого Ссылка Из МассивОбъектов Цикл
ИмяДокумента = Строка(Новый УникальныйИдентификатор);
АдресХранилищаОфисныйДокумент = НапечататьДокументOfficeOpenXML(Ссылка, ДанныеМакетов, ИмяМакета);
ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента);
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
КонецЦикла;
ПечатнаяФорма.СинонимМакета = "Печатная форма OfficeOpenXML";
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецЕсли;
КонецПроцедуры
функция НапечататьДокументOfficeOpenXML(Ссылка, ДанныеМакетов, ИмяМакета)
//Тестовые данные, могут быть получены ранее или в этой функции
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("Товары",Новый Массив);
ДанныеОбъекта.Товары.Добавить(Новый Структура("Номенклатура,Количество,Цена,Сумма","Номенклатура тест", "10", "1000", "10000"));
ДанныеОбъекта.Вставить("Номер", "12345");
ДанныеОбъекта.Вставить("Организация", "ООО НАША ОРГАНИЗАЦИЯ");
ДанныеОбъекта.Вставить("Контрагент", "ООО КОНТРАГЕНТ");
ТипМакета = ДанныеМакетов.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакета = ДанныеМакетов.ДвоичныеДанныеМакетов;
Области = ДанныеМакетов.ОписаниеОбластей;
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета[ИмяМакета],ТипМакета,
ИмяМакета);
Если Макет = Неопределено Тогда
Возврат "";
КонецЕсли;
ЗакрытьОкноПечатнойформы = Ложь;
Попытка
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета,
Макет);
АдресХранилищаПечатнойФормы = "";
Если ПечатнаяФорма = Неопределено Тогда
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат "";
КонецЕсли;
// Вывод верхней части документа - обычная область с параметрами.
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Шапка"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
// Вывод коллекции данных из информационной базы в виде таблицы.
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Товары"]);
УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["СтрокаТаблицаТовары"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.Товары);
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
Исключение
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗакрытьОкноПечатнойФормы = Истина;
Возврат "";
КонецПопытки;
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат АдресХранилищаПечатнойФормы;
Конецфункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
функция МакетыОбъектаДляПечати(Знач ИменаМакетов)
МассивИменМакетов = СтрРазделить(ИменаМакетов, ", ", Ложь);
СтруктураМакеты = ПолучитьДанныеМакетов(МассивИменМакетов);
СтруктураМакеты.Вставить("ЛокальныйКаталогФайловПечати", Неопределено); // Для обратной совместимости.
Если НЕ СтруктураМакеты.Свойство("ТипыМакетов") Тогда
СтруктураМакеты.Макеты.Вставить("ТипыМакетов", Новый Соответствие); // Для обратной совместимости.
КонецЕсли;
Возврат СтруктураМакеты;
Конецфункции
функция ПолучитьДанныеМакетов(Знач МассивИменМакетов)
ОписаниеОбластей = Новый Соответствие;
ДвоичныеДанныеМакетов = Новый Соответствие;
ТипыМакетов = Новый Соответствие; // Для обратной совместимости.
Для Каждого ИмяМакета Из МассивИменМакетов Цикл
Если ИмяМакета = "ПФ_DOC_ПечатнаяФорма" Тогда
ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ПолучитьМакет("ПФ_DOC_ПечатнаяФорма"));
КонецЕсли;
ОписаниеОбластей.Вставить(ИмяМакета, ОписаниеОбластейМакетаОфисногоДокумента());
КонецЦикла;
Макеты = Новый Структура;
Макеты.Вставить("ОписаниеОбластей", ОписаниеОбластей);
Макеты.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов);
Макеты.Вставить("ТипыМакетов", ТипыМакетов);
Возврат Макеты;
Конецфункции
функция ОписаниеОбластейМакетаОфисногоДокумента()
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Товары", "СтрокаТаблицы");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СтрокаТаблицаТовары", "СтрокаТаблицы");
Возврат ОписаниеОбластей;
Конецфункции
#КонецОбласти
Внешний вид печатной формы из шаблона:
Данный шаблон разрабатывался и тестировался на БСП версии 3.0.3.223.