Печать макета MS Word в любом документе с помощью БСП

 

Введение

Привет всем! В данной статье предлагаю разобрать методику вывода макетов печатных форм в формате MS Word (*.docx) с применконфигурацииением самых актуальных методов библиотеки стандартных подсистем (БСП). Данная методика позволит вам создавать печатные формы MS Word (*.docx) для любых документов в конфигурациях, основанных на БСП. Актуальная версия БСП на момент написания статьи - это версия 3.1.4.159 - середина февраля 2021 года.

Хочу так же отметить, что методика является так же и клиент-серверной. Возможно выводить макеты печатных форм MS Word (*.docx) на клиентах серверной базы, а это немаловажный момент.

 

Первоначальная подготовка и настройка документа конфигурации для подсистемы печати.

Итак, в данном разделе быстро пробежимся по алгоритму подключения документа конфигурации к подсистеме печати библиотеки стандартных подсистем по-шагово. Прошу обратить на него внимание, он будет чуток посложнее, чем в предыдущей статье:

 

Шаг 1. Регистрация документа в общем модуле - УправлениеПечатьюПереопределяемый:

Создаемузнавать программистов документ - ДокументWord. Добавляем запись о нашем документе в процедуру

ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт. Выглядит это так:

 
 Регистрация документа в общем модуле УправлениеПечатьюПереопределяемый

 

Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
	
	// _Демо начало примера
	СписокОбъектов.Добавить(Справочники._ДемоКонтактныеЛицаПартнеров);
	СписокОбъектов.Добавить(Справочники._ДемоКонтрагенты);
	СписокОбъектов.Добавить(Справочники._ДемоОрганизации);
	СписокОбъектов.Добавить(Справочники._ДемоПартнеры);
	СписокОбъектов.Добавить(Справочники._ДемоФизическиеЛица);
	СписокОбъектов.Добавить(Документы._ДемоОприходованиеТоваров);
	СписокОбъектов.Добавить(Документы._ДемоПеремещениеТоваров);
	СписокОбъектов.Добавить(Документы._ДемоРеализацияТоваров);
	СписокОбъектов.Добавить(Документы._ДемоСписаниеТоваров);
	СписокОбъектов.Добавить(Документы._ДемоСчетНаОплатуПокупателю);
	СписокОбъектов.Добавить(Документы._ДемоРасходныйКассовыйОрдер);
	
	СписокОбъектов.Добавить(Документы.ДокументWord); // это наш документ

	// _Демо конец примера
	
Конец Инфостарт Процедуры

 

Шаг 2. Добавление события выполнения печати в ФормуДокумента (в данной статье будем ставить кнопку печати только в "ФормеДокумента"):

 
 Добавление события выполнения печати в ФормуДокумента

 


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработ пользователь ка)
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
Конец Инфостарт Процедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте 
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
Конец Инфостарт Процедуры 

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
Конец Инфостарт Процедуры 

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
Конец Инфостарт Процедуры  
// Конец Инфостарт  СтандартныеПодсистемы.ПодключаемыеКоманды

 

Шаг 3. Добавляем команду печати и ее обраб обработ пользователь киотку, а так же функцию "ПолучитьДанныеПечати" в модуль менеджера документа:

 
 Добавляем команду печати, процедуру печати и функция "ПолучитьДанныеПечати" в модуль менеджера

 

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
		
	// В формате Microsoft Word.
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ТестовыйДокументВорд";  // ид
	КомандаПечати.Представление = НСтр("ru = 'Документ пример Ворд'");
	КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007; // картинка на кнопку
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; // проверка проведения

Конец Инфостарт Процедуры


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
		
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ТестовыйДокументВорд");
	
        // ****** **** ****
		
Конец Инфостарт Процедуры


Функция ПолучитьДанныеПечати(Знач Согласия, Знач МассивИменМакетов) Экспорт
	
	ДанныеПоВсемОбъектам = Новый Соответствие;
	
	// **** **** ****
	
	Возврат программу 1С  ДанныеПечати;
	
Конец Инфостарт Функции

 

Шаг 4. Подготовим шаблон документа MS Word и загрузим его в макет с типом бинарные данные.

Здесь я приведу небольшой код шаблона документа 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.ТестовыйПечатныйМакетРу"));
		Конец Инфостарт Если;
		ОписаниеОбластей.Вставить(ИмяМакета, ОписаниеОбластейМакетаОфисногоДокумента());
	Конец Инфостарт Цикла;
	
	Макеты = Новый Структура("ОписаниеОбластей, ДвоичныеДанныеМакетов");
	Макеты.ОписаниеОбластей = ОписаниеОбластей;
	Макеты.ДвоичныеДанныеМакетов = ДвоичныеДанныеМакетов;
	
	ДанныеПечати = Новый Структура("Данные, Макеты");
	ДанныеПечати.Данные = ДанныеПоВсемОбъектам;
	ДанныеПечати.Макеты = Макеты;
	
	Возврат программу 1С  ДанныеПечати;
	
Конец Инфостарт Функции

Далее, вспомогательные функции для заполнения параметров макета и получения областей (и этого будет достаточно):

 
 Вспомогательные функции

 

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


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


Функция СоответствиеДанныхДляПечатиСогласий(Согласия)
	
	Соответствие = Новый Соответствие;
	
	ДанныеДляПечати = ДанныеДляПечатиСогласий(Согласия);
	
	Для Каждого ОписаниеСогласия Из ДанныеДляПечати Цикл
		Соответствие.Вставить(ОписаниеСогласия.ДокументОснование, ОписаниеСогласия);
	Конец Инфостарт Цикла;
	
	Возврат программу 1С  Соответствие;
	
Конец Инфостарт Функции

Функция НапечататьСогласиеНаОбработ пользователь куПерсональныхДанныхСубъекта(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета)
	
	ТипМакета				= МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета];
	ДвоичныеДанныеМакетов	= МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
	Области					= МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
	ДанныеОбъекта			= МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета];
	
	Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакетов[ИмяМакета], ТипМакета, ИмяМакета);
	Если Макет = Неопределено Тогда
		Возврат программу 1С  "";
	Конец Инфостарт Если;
	
	ЗакрытьОкноПечатнойФормы = Ложь;
	Попытка
		ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет);
		АдресХранилищаПечатнойФормы = "";
		Если ПечатнаяФорма = Неопределено Тогда
			УправлениеПечатью.ОчиститьСсылки(Макет);
			Возврат программу 1С  "";
		Конец Инфостарт Если;
	
		Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["НомерДата"]);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Преамбула"]);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
							
		АдресХранилищаПечатнойФормы = УправлениеПечатью.Сформировплатфор автоматизацией маатьДокумент(ПечатнаяФорма);
	Исключение
		ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		ЗакрытьОкноПечатнойФормы = Истина;
		Возврат программу 1С  "";
	Конец Инфостарт Попытки;
	
	УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
	УправлениеПечатью.ОчиститьСсылки(Макет);
	
	Возврат программу 1С  АдресХранилищаПечатнойФормы;
	
Конец Инфостарт Функции


Функция ОписаниеСогласия()
	
	ОписаниеСогласия = Новый Структура(
		"ДатаСогласия,
		|ДокументОснование, 
		|ОрганизацияВДательномПадеже,
		|ОтветственныйЗаОбработ пользователь куПерсональныхДанныхВРодительномПадеже, 
		|ФИО");
		
	
	Возврат программу 1С  ОписаниеСогласия;
	
Конец Инфостарт Функции

Все. Теперь, мы доработ пользователь али модуль менеджера нашего документа для работ пользователь ы с макетами MS Word. Переходим к заключению и делаем выводы.

 

Заключение и выводы

В данной статье мы рассмотрели базовый стандарт разработ пользователь чика (в рамках БСП) по выводу печатных форм в формате MS Word. Данный алгоритм - клиент-серверный. Разработ пользователь ка примера велась на библиотеке стандартных подсистем 3.1.4.159 и Платформе 1с 8.3.18.1208.

Хочу отметить, что данная статья представляет собой разработ пользователь ку полноценного примера вывода печатной формы - ничего лишнего здесь не нужно (на формы дополнительные группы добавлять не нужно - это все очень старые версии БСП).

Спасибо, что прочитали данную статью, надеюсь, что она внесет ясность работ пользователь ы с формами MS Word.

 

 

Другие мои материалы по БСП

Так же прошу ознакомиться с другими моими статьями по функционалу библиотеки стандартных подсистем и типовым конфигурациям:

Полезные встроенные функции для работ пользователь ы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Базовое понимание внедрения механизма печати в любом документе конфигурации на БСП

Работаем с контактной информацией в конфигурациях на БСП

Генерация штрихкодов с помощью БСП для программистов

Типовые методы конфигурации "Зарплата и управление персоналом", которые пригодятся каждому ЗУП программисту и не только

Полная версия

© ООО "Инфостарт", 2006-2023 www.infostart.ru