Выпуск №67. Вывод печатных форм MS Word в управляемых формах 1С


Вывод печатных форм MS Word в управляемых формах 1С

Полгода назад, при выполнении задачи вывода из 1С данных Трудового договора в документ "MS Word", столкнулся с тем, что на платформе 8.3.15.1830 старые методы с созданием COMОбъекта не работают и пришлось разбираться в общем модуле "УправлениеПечатьюMSWordКлиент". В статье привожу пример реализации печати в MS Word с помощью модуля "УправлениеПечатьюMSWordКлиент" и макета с двоичными данными.

Итак, повторюсь, в конфигурации должен быть модуль "УправлениеПечатьюMSWordКлиент" и макет с загруженными двоичными данными из шаблона Word

На форму печати следует вывести реквизиты с документа "Прием на работу"

Код кнопки с формы документа (вызываем форму печати):

&НаКлиенте
Процедура ПечатьПакетаДокументов(Команда)
	   Оклад = 0;
    Для каждого Стр Из Объект.Начисления Цикл
          Если Стр.Начисление = ВидНачисленияОклад() Тогда
    	  
    	        Оклад = Стр.Размер;
    		                                
    	  
    	  КонецЕсли;
    	
    
    КонецЦикла;
   ОткрытьФорму("Документ.ПриемНаРаботу.Форма.ФормаПечати",Новый Структура("Сотрудник, ДатаДоговора,НомерДоговора,ДатаПриема,Должность, Оклад",Объект.Сотрудник, Объект.ТрудовойДоговорДата,Объект.ТрудовойДоговорНомер,Объект.ДатаПриема,Объект.Должность,Оклад) ,,,,,, );	

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


Функция ВидНачисленияОклад()

	Возврат ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Оплата по часовому тарифу");

КонецФункции // ()

Код модуля "ФормыПечати":

&НаКлиенте
Процедура Печать(Команда)
	Массив = Новый Массив;
	Если ТрудовойДоговор Тогда
		ПечатьТД("ТрудовойДоговор");
	КонецЕсли;
	Если ДоговорОполнойМатериальнойОтветственностиРаботника Тогда
		ПечатьТД("МатОтв");
	КонецЕсли;

	Если СогласиеНаОбработкуЛичныхДанных Тогда
		ПечатьТД("СогласиеНаОбработку");
	КонецЕсли;

	Если соглашениеОнеразглашении Тогда
		ПечатьТД("СоглашениеНеразглашения");
	КонецЕсли;

	Если ОнеразглашенииИнформации Тогда
		ПечатьТД("ОбязательствоНеразглашения");
	КонецЕсли;

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

&НаКлиенте
Процедура ПечатьТД(ИмяМакета)
	
	ДвоичныеДанныеМакета = ПолучитьМакетНаСервере(ИмяМакета)  ;
	
	ДанныеНаСервере = ПолучитьДанныеДляПечатиТД();
	ОкладПрописью = Строка(Оклад)+" ("+ЧислоПрописью(Оклад) + ")";
	СрокДоговора = "с "+ Формат(ДатаПриема,"ДЛФ=DD")+ " до "+Формат(Дата(Год(ДатаПриема)+1,Месяц(ДатаПриема),ДЕНЬ(ДатаПриема)),"ДЛФ=DD");
	ДанныеДляПечати =Новый Структура("Сотрудник,ДатаРождения, ДатаДоговора,НомерДоговора,ДатаПриема,Должность, Оклад, УДЛ,ИИН, СрокДоговора",Сотрудник,ДанныеНаСервере.ДатаРождения, Формат(ДатаДоговора,"ДЛФ=DD"),НомерДоговора,Формат(ДатаПриема,"ДЛФ=DD"),Должность,ОкладПрописью,ДанныеНаСервере.УДЛ, ДанныеНаСервере.ИИН, СрокДоговора); 
	ДанныеДляПечати.Вставить("СотрудникРеквизит",Сотрудник);
	ДанныеДляПечати.Вставить("УДЛРеквизит",ДанныеНаСервере.УДЛ);
	ДанныеДляПечати.Вставить("ИИНРеквизит",ДанныеНаСервере.ИИН);
	КонтактнаяИнфа = ПолучитьКонтИнф();
	ДанныеДляПечати.Вставить("АдресПрописки",КонтактнаяИнфа.адресПрописки);
	ДанныеДляПечати.Вставить("АдресПроживания",КонтактнаяИнфа.адресПроживания);
	ДанныеДляПечати.Вставить("Телефон",КонтактнаяИнфа.телефон);

	Печать_MS_Word(ДвоичныеДанныеМакета, ДанныеДляПечати);
	
КонецПроцедуры

Функция ПолучитьКонтИнф()

	 Рез = Новый Структура("адресПрописки,адресПроживания,телефон","","","" ); 
	
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ФизическиеЛицаКонтактнаяИнформация.Вид КАК Вид,
		|	ФизическиеЛицаКонтактнаяИнформация.Представление КАК Представление
		|ИЗ
		|	Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
		|ГДЕ
		|	ФизическиеЛицаКонтактнаяИнформация.Ссылка = &Физлицо
		|	И ФизическиеЛицаКонтактнаяИнформация.Вид В(&ВидыКИ)";
	
	ВидыКИ = Новый Массив;
	ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица);
	ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица);
	ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.ТелефонМобильныйФизическиеЛица);
	Запрос.УстановитьПараметр("ВидыКИ", ВидыКИ);
	Запрос.УстановитьПараметр("Физлицо", Сотрудник.ФизическоеЛицо);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		// Вставить обработку выборки ВыборкаДетальныеЗаписи
		Если ВыборкаДетальныеЗаписи.Вид = Справочники.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица Тогда
		
			       Рез.адресПроживания = ВыборкаДетальныеЗаписи.Представление;
		
		КонецЕсли;
		Если ВыборкаДетальныеЗаписи.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица Тогда
		
			       Рез.адресПрописки = ВыборкаДетальныеЗаписи.Представление;
		
		КонецЕсли;	   
		Если ВыборкаДетальныеЗаписи.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонМобильныйФизическиеЛица Тогда
		
			       Рез.телефон = ВыборкаДетальныеЗаписи.Представление;
		
		КонецЕсли;	   
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

	 
Возврат Рез;
КонецФункции // ()


Функция ПолучитьДанныеДляПечатиТД()
	Рез = Новый Структура("ВидДокумента, УДЛ, ДатаРождения, ИИН","","", "",Сотрудник.ФизическоеЛицо.ИНН);
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДокументыФизическихЛицСрезПоследних.ВидДокумента КАК ВидДокумента,
	|	ДокументыФизическихЛицСрезПоследних.Номер КАК Номер,
	|	ДокументыФизическихЛицСрезПоследних.ДатаВыдачи КАК ДатаВыдачи,
	|	ДокументыФизическихЛицСрезПоследних.КемВыдан КАК КемВыдан
	|ИЗ
	|	РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&Дата, Физлицо = &Физлицо) КАК ДокументыФизическихЛицСрезПоследних";
	
	Запрос.УстановитьПараметр("Дата", ТекущаяДата());
	Запрос.УстановитьПараметр("Физлицо", Сотрудник.ФизическоеЛицо);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Рез.ВидДокумента = ВыборкаДетальныеЗаписи.ВидДокумента;
		Рез.УДЛ = "№"+ВыборкаДетальныеЗаписи.Номер+", выданный "+Формат(ВыборкаДетальныеЗаписи.ДатаВыдачи,"ДЛФ=DD")+" " +ВыборкаДетальныеЗаписи.КемВыдан;
		
	КонецЕсли;
	Рез.ДатаРождения = Формат(Сотрудник.ФизическоеЛицо.ДатаРождения,"ДЛФ=DD");
	Возврат Рез;
	
КонецФункции // ()


&НаСервере
Функция ПолучитьМакетНаСервере(ИмяМакета)
	Макет =Документы.ПриемНаРаботу.ПолучитьМакет(ИмяМакета);
	Возврат Макет;
КонецФункции


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

&НаКлиенте 
Функция ПараметрыОбласти_MS_Word(Область)
	Параметры = Новый Структура;
	
	Текст = Область.Document.Content.Text;
	Пока Найти(Текст, "{v8 ") > 0 И  Найти(Текст, "}") > 0 цикл
		Начало = Найти(Текст, "{v8 ") + 4;
		Конец = Найти(Текст, "}");
		ИмяПараметра = Сред(Текст, Начало, Конец-Начало);
		Текст = СтрЗаменить(Текст, "{v8 " + ИмяПараметра + "}", "");
		
		Параметры.Вставить(ИмяПараметра, Неопределено);
	КонецЦикла;
	Возврат Параметры;
КонецФункции

&НаКлиенте
Процедура ПрисоединитьОбласть_MS_Word(Макет, Документ, ИмяОбласти, ДанныеДляПечати, ВывестиСтрокуТаблицы = Ложь) Экспорт
	Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(Макет, ИмяОбласти);
	Если Область = Неопределено тогда
		Сообщить("При выводе на печать не найдена область """ + ИмяОбласти + """");
		Возврат;
	КонецЕсли;
	
	Область_ = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(Документ, Область, , ВывестиСтрокуТаблицы); 
	УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметры(Область_, ДанныеДляПечати);
КонецПроцедуры


Функция ПечатьТДСервер(ТабДок)
	Макет =Документы.ПриемНаРаботу.ПолучитьМакет("ТД");
	Шапка = Макет.ПолучитьОбласть("Шапка");
	Работник = Сотрудник.Наименование;
	ИНН = Сотрудник.ФизическоеЛицо.ИНН;
	УДЛ = "";
	ВидДокумента ="";
	Шапка.Параметры.Дата = ДатаДоговора; 
	Шапка.Параметры.Номер = НомерДоговора;
	Шапка.Параметры.ДолжностьДатаПриема = Должность.Наименование + " с "+ Формат(ДатаПриема,"ДЛФ=DD")+" года.";
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДокументыФизическихЛицСрезПоследних.ВидДокумента КАК ВидДокумента,
	|	ДокументыФизическихЛицСрезПоследних.Номер КАК Номер,
	|	ДокументыФизическихЛицСрезПоследних.ДатаВыдачи КАК ДатаВыдачи,
	|	ДокументыФизическихЛицСрезПоследних.КемВыдан КАК КемВыдан
	|ИЗ
	|	РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&Дата, Физлицо = &Физлицо) КАК ДокументыФизическихЛицСрезПоследних";
	
	Запрос.УстановитьПараметр("Дата", ТекущаяДата());
	Запрос.УстановитьПараметр("Физлицо", Сотрудник.ФизическоеЛицо);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		ВидДокумента = ВыборкаДетальныеЗаписи.ВидДокумента;
		УДЛ = "№"+ВыборкаДетальныеЗаписи.Номер+", выданный "+Формат(ВыборкаДетальныеЗаписи.ДатаВыдачи,"ДЛФ=DD")+" " +ВыборкаДетальныеЗаписи.КемВыдан;
		
	КонецЕсли;
	
	
	Шапка.Параметры.Фамилия=Работник;
	Шапка.Параметры.УДЛ=УДЛ;
	Шапка.Параметры.ИИН=ИНН;
	Шапка.Параметры.ВидДокумента = ВидДокумента;
	Шапка.Параметры.ДатаРождения = Формат(Сотрудник.ФизическоеЛицо.ДатаРождения,"ДЛФ=DD");
	Шапка.Параметры.Оклад = Строка(Оклад)+" ("+ЧислоПрописью(Оклад) + ")";
	
	ТабДок.Вывести(Шапка);
	
	Возврат ТабДок;
	
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Сотрудник = Параметры.Сотрудник;
	ДатаДоговора = Параметры.ДатаПриема;
	НомерДоговора = Параметры.НомерДоговора;
	ДатаПриема = Параметры.ДатаПриема;
	Должность = Параметры.Должность;
	Оклад = Параметры.Оклад;
КонецПроцедуры

Ниже приведен пример шаблона:

 

{v8 Область.Документ}

 

ТРУДОВОЙ ДОГОВОР № {v8 НомерДоговора}

г. Караганда  

{v8 ДатаДоговора}

 

ТОО «Плюшкины», именуемое в дальнейшем «Работодатель», в лице Директора Иванов И.И, действующей на основании Устава, с одной стороны, и {v8 Сотрудник},  именуемый(-ая) в дальнейшем "Работник", действующий (-ая) от своего имени как физическое лицо на основании удостоверение личности/паспорта/вида на жительство/ {v8 УДЛ}, ИИН {v8 ИИН}, Дата рождения {v8 ДатаРождения}, с другой стороны, далее совместно именуемые «Стороны», а по отдельности «Сторона», заключили настоящий трудовой договор о нижеследующем:

бла бла бла

 

__________________ /__________________________________ / {v8 ДатаДоговора}

      Подпись                                  (Ф.И.О. работника)

{/v8 Область.Документ}

 

 

 

Наверх


Добавить комментарий (через VK):

Добавить комментарий к статье могут только зарегистрированные пользователи: