Выпуск №67. Вывод печатных форм 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 Область.Документ}



















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