Тестировалось в 1С:ERP Управление предприятием 2 (2.4.13.227) 1С:Предприятие 8.3 (8.3.18.1289)
Как я понимаю, в основе БСП и работать много где должно.
Убил выходные, чтобы с 0 разобраться, как напечатать небольшой документ, с одной таблицей, примеры, которые находил очень громоздки, и не очевидны, да, возможно, для удовлетворения сложных потребностей и требуется так делать, но для понимания базового функционала мой пример очень простой, минимум необходимых функций и процедур.
1. Создаём шаблон в Word *.docx, при этом колонтитулы сами по себе являются областями, вся другая информация должна быть помещена в области, и заменяемые части вставляем в нужные места. В коде нужно будет указать тип области
СтрокаТаблицы
– используется для вывода множества строк таблицы;Список
– используется для вывода множества строк маркированного списка;Общая
– используется для вывода простых областей;ВерхнийКолонтитул
– используется для вывода верхнего колонтитула;НижнийКолонтитул
– используется для вывода нижнего колонтитула;ВерхнийТитульныйКолонтитул
– используется для вывода верхнего титульного колонтитула;НижнийТитульныйКолонтитул
– используется для вывода нижнего титульного колонтитула;ВерхнийЧетныйКолонтитул
– используется для вывода верхнего колонтитула четных страниц;НижнийЧетныйКолонтитул
– используется для вывода нижнего колонтитула четных страниц;
{v8 Область.НаименованиеОбласти}
{v8 НаименованиеЗаменяемойПеременной}
{/v8 Область.НаименованиеОбласти}
// Создаем структуру областей формируемой печатной формы OpenXМL
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СтрокаТаблицы", "СтрокаТаблицы");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
2. Загружаем документ в макет, двоичные данные
3. Полный листинг: прописываем в какие документы прикрепить печать, запрос на выгрузку данных, и собственно редактирование данных единичных в общую структуру, а табличные данные собираем в массиве структур, добавляем необходимые области и заменяем там текст.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "Печатнаяформа");
ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());
ПараметрыРегистрации.Вставить("Наименование", "Печать документа Word"); //Наименование обработки
ПараметрыРегистрации.Вставить("Версия", "1.0.0");
ПараметрыРегистрации.Вставить("Информация", "Печать документов Word"); //Поле дополнительной информации в описании обаботки
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Команды = ПолучитьТаблицуКоманд();
ДобавитьКоманду(Команды, "Печать документа Word", //Надпись в отображении печати документа
"ДокументWordName",
"ВызовСерверногоМетода");
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
//Список документов использования
Функция ПолучитьНазначениеОбработки()
Назначение = Новый Массив;
Назначение.Добавить("Документ.ВнутреннееПотреблениеТоваров");
Возврат Назначение;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
КонецПроцедуры
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ДокументWordName"); //Идентификатор формы в команде
Если ПечатнаяФорма <> Неопределено Тогда
ОфисныеДокументы = НапечататьАктСписания(МассивОбъектов);
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Печать документа Word'");
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецЕсли;
КонецПроцедуры
Функция НапечататьАктСписания(МассивОбъектов) Экспорт
//Запрашиваем документы для печати
ЗапросПоДокументам = Новый Запрос;
ЗапросПоДокументам.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
ЗапросПоДокументам.Текст =
"ВЫБРАТЬ
| Документ.Ссылка КАК Ссылка,
| Документ.Номер КАК Номер,
| Документ.Дата КАК Дата,
| Документ.Товары.(
| Номенклатура.НаименованиеПолное КАК Наименование,
| Характеристика.НаименованиеПолное КАК Характеристика,
| НомерСтроки КАК НомерСтроки,
| Количество КАК Количество,
| ) КАК Товары
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров КАК Документ
|ГДЕ
| Документ.Ссылка В(&МассивОбъектов)
|УПОРЯДОЧИТЬ ПО
| Дата,
| Ссылка,
| НомерСтроки";
// Создаем пустое соответствие для размещения печатных форм OpenXМL – результат функции
ОфисныеДокументы = Новый Соответствие;
//Находим макет в обаботчике
МакетДокумента = ЭтотОбъект.ПолучитьМакет("ПФ_DOC_ПечатьДокументWord"); // Наименование макета
// Создаем структуру областей формируемой печатной формы OpenXМL
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СтрокаТаблицы", "СтрокаТаблицы");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
//Вышрузка документов
ВыборкаДокументы = ЗапросПоДокументам.Выполнить().Выбрать();
Пока ВыборкаДокументы.Следующий() Цикл
ОбщиеДанные = Новый Структура ("Дата, Номер");
ОбщиеДанные.Дата = Формат(ВыборкаДокументы.Дата, "ДФ='''«''dd''»'' MMMM yyyy ''г.'''");
ОбщиеДанные.Номер = ВыборкаДокументы.Номер;
//Строки в таблице должы быть массивом коллекций, запрашиваем номенклатуру в списке таблице Товары
ДанныеСтрок = Новый Массив;
ВыборкаСтроки = ВыборкаДокументы.Товары.Выбрать();
Пока ВыборкаСтроки.Следующий() Цикл
СтрокаТаблицы = Новый Структура ("НомерСтроки, Наименование");
СтрокаТаблицы.НомерСтроки = ВыборкаСтроки.НомерСтроки;
СтрокаТаблицы.Наименование = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(
ВыборкаСтроки.Наименование,
ВыборкаСтроки.Характеристика);
СтрокаТаблицы.Количество = ВыборкаСтроки.Количество;
ДанныеСтрок.Добавить(СтрокаТаблицы);
КонецЦикла;
//Закрузка макета, печатной фармы
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено);
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
//Печать колонтитула с подстановкой данных
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["ВерхнийКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ОбщиеДанные);
// Печать обаластей
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Шапка"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ОбщиеДанные);
// Печать табличной части
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["СтрокаТаблицы"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеСтрок);
//Печать колонтитула с подстановкой данных
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["НижнийКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ОбщиеДанные);
// Помещаем сформированную печатную форму в соответствие ОфисныеДокументы
// Наименоние формировать желательно с изменяющимся параметром
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
ОфисныеДокументы.Вставить(АдресХранилищаПечатнойФормы, "ДокументWordName " + ВыборкаДокументы.Номер);
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(Макет);
КонецЦикла;
Возврат ОфисныеДокументы;
КонецФункции;
4. Добавляем наш обработчик и радуемся легко печати. В документах при выборе печати появляется наш вариант
5. Получившийся документ