Заказать звонок

УФ Макет Word – формирование одного итогового документа Word

20.04.2017

Рассмотрим задачу: у нас есть макет Word Макет для печати данных о сотруднике. Имена параметров заключены в символы @, например, @ФИО@. Нужно получить итоговый документ Word, содержащий данные по нескольким сотрудникам.

 Пример реализации:

1. Запуск процедуры формирования печатной формы:

//Сотрудники – массив сотрудников

&НаКлиенте

Процедура СформироватьПечатнуюФорму(Сотрудники)   

Адрес = ФормированиеПечатнойФормыПоШаблону(Сотрудники);

Если Адрес = Неопределено Тогда

Возврат;

КонецЕсли;

               

                Файл = ПолучитьИзВременногоХранилища(Адрес);

                ВремФайл = КаталогВременныхФайлов() + "ПФ.doc";

                Файл.Записать(ВремФайл);       

 

                ЗапуститьПриложение(ВремФайл);               

КонецПроцедуры

2. Функция ФормированиеПечатнойФормыПоШаблону():

&НаКлиенте

Функция ФормированиеПечатнойФормыПоШаблону(МассивДанных)

ИмяМакета = "Макет"; 

               

                АдресФайлаВХранилище = ПолучитьМакетСервер(ИмяМакета);   

                ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);

               

                ИмяФайлаWordTample = ПолучитьИмяВременногоФайла("doc");

                ДвоичныеДанные.Записать(ИмяФайлаWordTample);

               

                ИмяФайлаWord = ПолучитьИмяВременногоФайла("doc");

                ДвоичныеДанные.Записать(ИмяФайлаWord);

               

                ИмяФайлаWordRez = ПолучитьИмяВременногоФайла("doc");

                ДвоичныеДанные.Записать(ИмяФайлаWordRez);

               

                //Документ - шаблон

                Попытка

                               ОбъектWordTample = ПолучитьCOMОбъект(ИмяФайлаWordTample);

                              

                               ДокументWordTample = ОбъектWordTample.Application.Documents(1);

                               ДокументWordTample.Activate();

                Исключение

                               ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());

                КонецПопытки;

               

                //Документ для генерации (документ с данными сотрудника)

                Попытка

                               ОбъектWord = ПолучитьCOMОбъект(ИмяФайлаWord);

                              

                               ДокументWord = ОбъектWord.Application.Documents(1);

                               ДокументWord.Activate();

                Исключение

                               ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());

                КонецПопытки;

               

                //Документ – итог (объединяет все отдельные документы с данными каждого сотрудника)

                Попытка

                               ОбъектWordRez = ПолучитьCOMОбъект(ИмяФайлаWordRez);

                              

                               ДокументWordRez = ОбъектWord.Application.Documents(1);

                               ДокументWordRez.Activate();

                               ОбъектWordRez.Application.Selection.WholeStory();

                Исключение

                               ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());

                КонецПопытки;             

               

                //Заполнение данными документа (поиск и замена)

                // получаем данные для печати          

                ДанныеДляПечати = ПолучитьДанныеДляПечати(МассивДанных); // ДанныеДляПечати: массив, 1 элемент – 1 структура с данными об 1 сотруднике

               

ДокументWord.Activate(); 

               

                ВсегоСтрок = ДанныеДляПечати.Количество(); //кол-во сотрудников в итоговом документе

                ТекущаяСтрока = 0;

                Для Каждого ДанныеДляПечатиСотрудника Из ДанныеДляПечати Цикл                  

                               ТекущаяСтрока = ТекущаяСтрока + 1;

               

                               //Копируем шаблон

                               ОбъектWordTample.Activate();

                               ОбъектWordTample.Application.Selection.WholeStory();

                               ОбъектWordTample.Application.Selection.Copy();

                              

                               //Вставляем в документ для генерации

                               ДокументWord.Activate();

                               ОбъектWord.Application.Selection.WholeStory();

                               ОбъектWord.Application.Selection.Paste();

                              

                               //Заполняем документ для генерации

                               ВыполнитьЗаменуШаблонов(ДокументWord, ДанныеДляПечатиСотрудника);    

               

                               //Копируем результат

                               ДокументWord.Activate();

                               ОбъектWord.Application.Selection.WholeStory();

                               ОбъектWord.Application.Selection.Copy();

                              

                               //Вставляем в итоговый документ

                               ДокументWordRez.Activate();

                               ОбъектWordRez.Application.Selection.Paste();

                              

                               Если ТекущаяСтрока < ВсегоСтрок Тогда

                                               ОбъектWordRez.Application.Selection.InsertNewPage();

                                КонецЕсли;      

                КонецЦикла;  

               

                //Запись документа

                ВремФайл = ПолучитьИмяВременногоФайла("doc");

                ДокументWordRez.SaveAs(ВремФайл);

                ОбъектWordTample.Close();

                ОбъектWord.Close();

                ОбъектWordRez.Close();          

               

                Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВремФайл));

                УдалитьФайлы(ВремФайл);

                УдалитьФайлы(ИмяФайлаWordTample);

                УдалитьФайлы(ИмяФайлаWord);

                УдалитьФайлы(ИмяФайлаWordRez);

               

                Возврат Адрес;

КонецФункции

3. Функция ПолучитьМакетСервер():

&НаСервере

Функция ПолучитьМакетСервер(ИмяМакета)            

                Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);

                ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");

                Макет.Записать(ИмяВременногоФайла);

                ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);

                АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

                УдалитьФайлы(ИмяВременногоФайла);

               

                Возврат АдресФайлаВХранилище;

КонецФункции

4. Функция ПолучитьДанныеДляПечати():

&НаСервере

Функция ПолучитьДанныеДляПечати(МассивДанных)

                ДанныеДляПечати = Новый Массив;

                Для Каждого Сотрудник Из МассивДанных Цикл

ДанныеДляПечати.Добавить(Новый Структура("ФИО, ДатаРождения", Сотрудник.Наименование, Формат(Сотрудник.ДатаРождения, "ДЛФ=ДД")));        

                КонецЦикла;

Возврат ДанныеДляПечати;

КонецФункции

5. Процедура ВыполнитьЗаменуШаблонов():

&НаКлиенте

Функция ВыполнитьЗаменуШаблонов(ОбъектВорд, ДанныеДляПечати)

WordFindReplace(ОбъектВорд, "ФИО", ДанныеДляПечати.ФИО); 

                WordFindReplace(ОбъектВорд, "ДатаРождения", ДанныеДляПечати.ДатаРождения);

//……. другие параметры

КонецФункции

6. Процедура WordFindReplace():

&НаКлиенте

Процедура WordFindReplace(ОбъектВорд, ТекстПоиска, ТекстЗамены)     

                ТекстПоиска = "@" + СокрЛП(ТекстПоиска) + "@";

               

                wdReplaceAll = 2;

                wdFindContinue = 1;

               

                Find = ОбъектВорд.Content.Find;

                Find.Text = ТекстПоиска;

                Find.Replacement.Text = СокрЛП(ТекстЗамены);

                Find.Forward = True;

                Find.Wrap = wdFindContinue;

                Find.Format = False;

                Find.MatchCase = False;

                Find.MatchWholeWord = False;

                Find.MatchWildcards = False;

                Find.MatchSoundsLike = False;

                Find.MatchAllWordForms = False;         

                            

                Find.Execute(, , , , , , , , , , wdReplaceAll);   

КонецПроцедуры

 

Автор: Дина Королева.


Возврат к списку

Наши услуги и вакансии

Разработчики
на full-time
Программист 1С на 8 часов в день
от 1 600 руб/час
Позадачная
разработка 1С
Доработки и развитие любых решений на платформе 1С
Стоимость по оценке
Карьера в Neti

Вакансии разработчиков и консультантов 1С
З.П. от 100 000 рублей