Выпуск №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):