Введение
Привет всем! В данной статье предлагаю разобрать методику вывода макетов печатных форм в формате MS Word (*.docx) с применением самых актуальных методов библиотеки стандартных подсистем (БСП). Данная методика позволит вам создавать печатные формы MS Word (*.docx) для любых документов в конфигурациях, основанных на БСП. Актуальная версия БСП на момент написания статьи - это версия 3.1.4.159 - середина февраля 2021 года.
Хочу так же отметить, что методика является так же и клиент-серверной. Возможно выводить макеты печатных форм MS Word (*.docx) на клиентах серверной базы, а это немаловажный момент.
Первоначальная подготовка и настройка документа конфигурации для подсистемы печати.
Итак, в данном разделе быстро пробежимся по алгоритму подключения документа конфигурации к подсистеме печати библиотеки стандартных подсистем по-шагово. Прошу обратить на него внимание, он будет чуток посложнее, чем в предыдущей статье:
Шаг 1. Регистрация документа в общем модуле - УправлениеПечатьюПереопределяемый:
Создаем документ - ДокументWord. Добавляем запись о нашем документе в процедуру
ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт. Выглядит это так:
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
// _Демо начало примера
СписокОбъектов.Добавить(Справочники._ДемоКонтактныеЛицаПартнеров);
СписокОбъектов.Добавить(Справочники._ДемоКонтрагенты);
СписокОбъектов.Добавить(Справочники._ДемоОрганизации);
СписокОбъектов.Добавить(Справочники._ДемоПартнеры);
СписокОбъектов.Добавить(Справочники._ДемоФизическиеЛица);
СписокОбъектов.Добавить(Документы._ДемоОприходованиеТоваров);
СписокОбъектов.Добавить(Документы._ДемоПеремещениеТоваров);
СписокОбъектов.Добавить(Документы._ДемоРеализацияТоваров);
СписокОбъектов.Добавить(Документы._ДемоСписаниеТоваров);
СписокОбъектов.Добавить(Документы._ДемоСчетНаОплатуПокупателю);
СписокОбъектов.Добавить(Документы._ДемоРасходныйКассовыйОрдер);
СписокОбъектов.Добавить(Документы.ДокументWord); // это наш документ
// _Демо конец примера
КонецПроцедуры
Шаг 2. Добавление события выполнения печати в ФормуДокумента (в данной статье будем ставить кнопку печати только в "ФормеДокумента"):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Шаг 3. Добавляем команду печати и ее обработку, а так же функцию "ПолучитьДанныеПечати" в модуль менеджера документа:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// В формате Microsoft Word.
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ТестовыйДокументВорд"; // ид
КомандаПечати.Представление = НСтр("ru = 'Документ пример Ворд'");
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007; // картинка на кнопку
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; // проверка проведения
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ТестовыйДокументВорд");
// ****** **** ****
КонецПроцедуры
Функция ПолучитьДанныеПечати(Знач Согласия, Знач МассивИменМакетов) Экспорт
ДанныеПоВсемОбъектам = Новый Соответствие;
// **** **** ****
Возврат ДанныеПечати;
КонецФункции
Шаг 4. Подготовим шаблон документа MS Word и загрузим его в макет с типом бинарные данные.
Здесь я приведу небольшой код шаблона документа MS Word, который разбит по областям с параметрами. Макет назовем "ТестовыйПечатныйМакетРу". Выглядит он вот так:
{v8 Область.НомерДата}
{v8 ДатаСогласия}
{/v8 Область.НомерДата}
{v8 Область.Преамбула}
{v8 ФИО}, именуемый в дальнейшем «Субъект персональных данных», разрешает {v8 ОрганизацияВДательномПадеже}, в лице ответственного за обработку персональных данных {v8 ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже}, далее «Оператор», обработку персональных данных, приведенных в пункте 2 настоящего согласия на следующих условиях:
{/v8 Область.Преамбула}
Так, мы создали стандартную подготовку любого документа конфигурации для подсистемы печати (немного подробнее можно прочитать в предыдущей моей статье - вот здесь), теперь перейдем к описанию процедур и функций, позволяющих получить макет MS Word (*.docx), заполнить его и вывести на печать готовую печатную форму.
Получение макета MS Word, его заполнение и вывод на печать.
В данном разделе мы доработаем нашу процедуру
Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт и функцию ПолучитьДанныеПечати(Знач Согласия, Знач МассивИменМакетов) Экспорт
Код процедуры вот такой:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ТестовыйДокументВорд");
Если ПечатнаяФорма <> Неопределено Тогда
ИмяМакета = "ТестовыйДокументВорд";
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати("Документ.Документ2", ИмяМакета, МассивОбъектов);
ОфисныеДокументы = Новый Соответствие;
Шаблон = НСтр("ru = 'Заголовок документа (№[Номер] получено [Дата])'");
ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Номер,Дата,Ссылка");
Для Каждого Ссылка Из МассивОбъектов Цикл
ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка];
ЗначенияРеквизитовДокумента.Дата = Формат(ЗначенияРеквизитовДокумента.Дата, "ДЛФ=D");
// используем стандартную подсистему - префиксация объектов
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда
МодульПрефиксацияОбъектовКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовКлиентСервер");
ЗначенияРеквизитовДокумента.Номер = МодульПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ЗначенияРеквизитовДокумента.Номер);
КонецЕсли;
ИмяДокумента = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]);
АдресХранилищаОфисныйДокумент = НапечататьСогласиеНаОбработкуПерсональныхДанныхСубъекта(Ссылка, МакетИДанныеОбъекта, ИмяМакета);
ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента);
КонецЦикла;
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Тестовый документ Ворд (документ MS Word)'");
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецЕсли;
КонецПроцедуры
Далее, дорабатываем функцию:
Функция ПолучитьДанныеПечати(Знач Согласия, Знач МассивИменМакетов) Экспорт
ДанныеПоВсемОбъектам = Новый Соответствие;
СоответствиеПоСогласиям = СоответствиеДанныхДляПечатиСогласий(Согласия);
Для Каждого ОбъектСсылка Из Согласия Цикл
ДанныеОбъектаПоМакетам = Новый Соответствие;
Для Каждого ИмяМакета Из МассивИменМакетов Цикл
ДанныеОбъектаПоМакетам.Вставить(ИмяМакета, СоответствиеПоСогласиям[ОбъектСсылка]);
КонецЦикла;
ДанныеПоВсемОбъектам.Вставить(ОбъектСсылка, ДанныеОбъектаПоМакетам);
КонецЦикла;
ОписаниеОбластей = Новый Соответствие;
ДвоичныеДанныеМакетов = Новый Соответствие;
Для Каждого ИмяМакета Из МассивИменМакетов Цикл
Если ИмяМакета = "ТестовыйДокументВорд" Тогда
ДвоичныеДанныеМакетов.Вставить(ИмяМакета, УправлениеПечатью.МакетПечатнойФормы("Документ.Документ2.ТестовыйПечатныйМакетРу"));
КонецЕсли;
ОписаниеОбластей.Вставить(ИмяМакета, ОписаниеОбластейМакетаОфисногоДокумента());
КонецЦикла;
Макеты = Новый Структура("ОписаниеОбластей, ДвоичныеДанныеМакетов");
Макеты.ОписаниеОбластей = ОписаниеОбластей;
Макеты.ДвоичныеДанныеМакетов = ДвоичныеДанныеМакетов;
ДанныеПечати = Новый Структура("Данные, Макеты");
ДанныеПечати.Данные = ДанныеПоВсемОбъектам;
ДанныеПечати.Макеты = Макеты;
Возврат ДанныеПечати;
КонецФункции
Далее, вспомогательные функции для заполнения параметров макета и получения областей (и этого будет достаточно):
Функция ОписаниеОбластейМакетаОфисногоДокумента()
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НомерДата", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Преамбула", "Общая");
Возврат ОписаниеОбластей;
КонецФункции
Функция ДанныеДляПечатиСогласий(Согласия)
ДанныеДляПечати = Новый Массив;
Описание = ОписаниеСогласия();
Описание.ДокументОснование = Согласия[0];
Описание.ДатаСогласия = ТекущаяДата();
Описание.ФИО = "Иванов Иван Иванович";
Описание.ОрганизацияВДательномПадеже = "ООО Перспектива";
Описание.ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже = "Федоров Федор";
ДанныеДляПечати.Добавить(Описание);
Возврат ДанныеДляПечати;
КонецФункции
Функция СоответствиеДанныхДляПечатиСогласий(Согласия)
Соответствие = Новый Соответствие;
ДанныеДляПечати = ДанныеДляПечатиСогласий(Согласия);
Для Каждого ОписаниеСогласия Из ДанныеДляПечати Цикл
Соответствие.Вставить(ОписаниеСогласия.ДокументОснование, ОписаниеСогласия);
КонецЦикла;
Возврат Соответствие;
КонецФункции
Функция НапечататьСогласиеНаОбработкуПерсональныхДанныхСубъекта(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета)
ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
ДанныеОбъекта = МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета];
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакетов[ИмяМакета], ТипМакета, ИмяМакета);
Если Макет = Неопределено Тогда
Возврат "";
КонецЕсли;
ЗакрытьОкноПечатнойФормы = Ложь;
Попытка
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет);
АдресХранилищаПечатнойФормы = "";
Если ПечатнаяФорма = Неопределено Тогда
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат "";
КонецЕсли;
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["НомерДата"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Преамбула"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
Исключение
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗакрытьОкноПечатнойФормы = Истина;
Возврат "";
КонецПопытки;
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат АдресХранилищаПечатнойФормы;
КонецФункции
Функция ОписаниеСогласия()
ОписаниеСогласия = Новый Структура(
"ДатаСогласия,
|ДокументОснование,
|ОрганизацияВДательномПадеже,
|ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже,
|ФИО");
Возврат ОписаниеСогласия;
КонецФункции
Все. Теперь, мы доработали модуль менеджера нашего документа для работы с макетами MS Word. Переходим к заключению и делаем выводы.
Заключение и выводы
В данной статье мы рассмотрели базовый стандарт разработчика (в рамках БСП) по выводу печатных форм в формате MS Word. Данный алгоритм - клиент-серверный. Разработка примера велась на библиотеке стандартных подсистем 3.1.4.159 и Платформе 1с 8.3.18.1208.
Хочу отметить, что данная статья представляет собой разработку полноценного примера вывода печатной формы - ничего лишнего здесь не нужно (на формы дополнительные группы добавлять не нужно - это все очень старые версии БСП).
Спасибо, что прочитали данную статью, надеюсь, что она внесет ясность работы с формами MS Word.
Другие мои материалы по БСП
Так же прошу ознакомиться с другими моими статьями по функционалу библиотеки стандартных подсистем и типовым конфигурациям:
Базовое понимание внедрения механизма печати в любом документе конфигурации на БСП
Работаем с контактной информацией в конфигурациях на БСП
Готовое решение
Универсальная печать по шаблонам Word в 1С 8.3
Универсальная печать предназначена для формирования печатных форм на основе шаблонов в формате Word из любой конфигурации 1С. С помощью данного инструмента можно самостоятельно заполнить шаблон реквизитами справочника или документа 1С и сформировать печатные формы на основании ссылки на любой объект.