Печать дополнительного соглашения в ЗУП 2.5


Пример печати дополнительного соглашения договора с сотрудником для проверки государственной инспекцией труда (ГИТ) в ЗУП 2.5 (релиз 2.5.129.3) из шаблона WORD.

Много прочитала информации о работе с OLE Word, пока создавала эту обработку, но так и не нашла как удалить последнюю страницу в готовом документе — изначально вставляется шаблон и далее не обрабатывается. 

Обработка представляет из себя печать в одном документе дополнительные соглашения по работающим сотрудникам на текущую дату в двух экземплярах из шаблона word. В коде ограничение на 100  сотрудников, т.е. 200  экземпляров соглашений, чтобы документ был не слишком объемным. Шаблон копируется во временный файл, вставляется в документ word, создается разрыв страницы, заполняется по сотруднику. 

По кнопке "Дополнительное соглашение" на печать выводится документна выбранного сотрудника в поле "Сотрудник", по кнопке "На всех", на всех работающих сотрудников на текущую дату.

Проверено на релизе 2.5.129.3.

Основной код:


// сохранить шаблон во временном файле
Макет = ПолучитьМакет("ДопСоглашение");
УИД = Новый УникальныйИдентификатор;
ИмяВременногоФайла = ВременныйПуть + "" + УИД + ".doc";
Макет.Записать(ИмяВременногоФайла);

Счетчик = 0;
СчетчикКопий = 0;
СчетчикКомплектов = 0;
Для каждого ЭлементСписка Из Сотрудники Цикл

СчетчикКомплектов = СчетчикКомплектов + 1; // счетчик сотрудников
Если СчетчикКомплектов = 1 Тогда

Попытка
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Add(ИмяВременногоФайла); // важно! вставляется шаблон и вместе с ним - форматирование
Документ.GrammarChecked = 0; // грамматику не проверять
Документ.ShowGrammaticalErrors = 0; // ошибки в документе не показывать
Содержание = Word.Selection;
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

КонецЕсли;

Для Индекс = 1 По 2 Цикл // два экземпляра каждого соглашения

Если Индекс = 1 Тогда // тот же сотрдник и для второго экземпляра
Физлицо = ЭлементСписка.Значение.Физлицо;
Работник = ЭлементСписка.Значение;
СтруктураПараметровПоСотруднику = ПолучитьДанныеПоСотруднику(Работник);
КонецЕсли;

Если СтруктураПараметровПоСотруднику = Неопределено Тогда
Продолжить;
Иначе
Счетчик = Счетчик + 1; // счетчик соглашений
Содержание.InsertFile(ИмяВременногоФайла); // вставить очередной шаблон
Содержание.InsertBreak(2); // разрыв страницы
КонецЕсли;

Замена = Документ.Content.Find; // нужно в каждой замене
Замена.Execute("{Speciality}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.Должность));
Замена = Документ.Content.Find;
Замена.Execute("{Department}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.ПодразделениеОрганизации));
Замена = Документ.Content.Find;
Замена.Execute("{ContractDate}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(СтруктураПараметровПоСотруднику.ДатаПриема, "Л=ru; ДЛФ=DD; ДП='НеЗаполнено'"));
Замена = Документ.Content.Find;
Замена.Execute("{AgreementDate}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(СтруктураПараметровПоСотруднику.ДатаНачала, "Л=ru; ДЛФ=D; ДП='НеЗаполнено'"));
Замена = Документ.Content.Find;
Замена.Execute("{AgreementDate1}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(СтруктураПараметровПоСотруднику.ДатаНачала, "Л=ru; ДЛФ=DD; ДП='НеЗаполнено'"));
ДатаДоверенности = ДобавитьМесяц(НачалоГода(ДобавитьМесяц(СтруктураПараметровПоСотруднику.ДатаНачала, -12)), 11);
Замена = Документ.Content.Find;
Замена.Execute("{AttorneyDate}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(ДатаДоверенности, "Л=ru; ДЛФ=D; ДП='НеЗаполнено'"));
Замена = Документ.Content.Find;
Замена.Execute("{Employee}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(Физлицо));
Замена = Документ.Content.Find;
Замена.Execute("{Employee}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(Физлицо));

РезультатСклонения = "";
Если УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"), Физлицо, 5, Физлицо.Пол, РезультатСклонения) Тогда
Работник = РезультатСклонения;
КонецЕсли;
Замена = Документ.Content.Find;
Замена.Execute("{Employee1}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(РезультатСклонения));

// Подписи
ИОФамилия = ОбщегоНазначенияЗК.ИнициалыФизЛицаФамилия(Физлицо);
Замена = Документ.Content.Find;
Замена.Execute("{Employee2}", Ложь, Истина, Ложь, , , Истина, , Ложь, ИОФамилия);
Замена = Документ.Content.Find;
Замена.Execute("{DateOfBirth}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(СтруктураПараметровПоСотруднику.ДатаРождения, "ДФ=dd.MM.yyyy; ДЛФ=D"));
Замена = Документ.Content.Find;
Замена.Execute("{Number}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.ДокументНомер));
Замена = Документ.Content.Find;
Замена.Execute("{Series}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.ДокументСерия));
Замена = Документ.Content.Find;
Замена.Execute("{DateOfIssue}", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(СтруктураПараметровПоСотруднику.ДокументДатаВыдачи, "ДФ=dd.MM.yyyy; ДЛФ=D"));
Замена = Документ.Content.Find;
Замена.Execute("{IssuedBy}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.ДокументКемВыдан));
Замена = Документ.Content.Find;
Замена.Execute("{Address}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(СтруктураПараметровПоСотруднику.Адрес));

КонецЦикла;

Если СчетчикКомплектов = 100 Тогда // когда счетчик 100, то начинать заново
СчетчикКомплектов = 0;
Word.ActiveWindow.View.ShowFieldCodes = Ложь;
Word.Visible = Истина;
Прервать;
КонецЕсли;

КонецЦикла;

Word.ActiveWindow.View.ShowFieldCodes = Ложь;
Word.Visible = Истина;

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *