В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.
В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.
Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:
Смотрите в параметрах программы.
Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:
смотрите на картинке.
Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:
&НаКлиентеПроцедура ПриОткрытии(Отказ) ЗаполнитьШаблонВорд(); КонецПроцедуры&НаКлиентеФункция ЗаполнитьШаблонВорд() //Попытка создать COM объект Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; //Путь к шаблону ОбъектВорд.Documents.Add("C:\Users\Константин\Desktop\Шаблон.docx"); ШаблонВорд = ОбъектВорд.ActiveDocument; //Получаем все закладки из шаблона Для каждого ЗакладкаВорд Из ШаблонВорд.Bookmarks Цикл Сообщить(ЗакладкаВорд.Name); КонецЦикла; //Заменяем закладку1 на текст ШаблонВорд.Bookmarks("Закладка1").Select(); ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1."); //Заменяем закладку2 на текст ШаблонВорд.Bookmarks("Закладка2").Select(); ШаблонВорд.Application.Selection.TypeText("Текст для закладки №2."); //Заменяем закладку3 на текущую дату ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.TypeText(ТекущаяДата()); ОбъектВорд.Application.Visible = Истина; ОбъектВорд.Activate(); //Закрытие документа //ОбъектВорд.Application.Quit(); КонецФункцииДополнение к заметке Использование шаблонов Word в 1С
Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.
1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
|
1
2
3
4
5
6
7
|
//Заменяем закладку3 на текущую датуШаблонВорд.Bookmarks("Закладка3").Select();ШаблонВорд.Application.Selection.Font.Bold = 1;ШаблонВорд.Application.Selection.Font.Size = 20; ШаблонВорд.Application.Selection.TypeText(ТекущаяДата()); |
2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
|
1
2
3
|
// Вставка изображенияШаблонВорд.Bookmarks("Закладка3").Select();ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:\Users\Константин\Desktop\logo_1c.png"); |
3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:\Шаблон.docx».
4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
|
1
2
3
4
|
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");Макет = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); ИмяФайла = КаталогВременныхФайлов() + "\"файл.doc";Макет.Записать(ИмяФайла); |
Я получаю не правильный документ
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
|
1
2
3
4
5
6
7
8
9
10
|
Sub Макрос1()'' Макрос1 Макрос'' Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _ "C:\Users\Константин\Desktop\Тест.txt", SubAddress:="", ScreenTip:="", _ TextToDisplay:="ТестоваяСсылка"End Sub |
Код который работает с картинками из библиотеки картинок и документом которых хранится в хранилище
Вставка картинок с помощью ЗАКЛАДОК в документе.
ТекущиеДанные = ТекущиеДанныеСпискаФайлов();
Оболочка = Новый COMОбъект("WScript.Shell");
КаталогДанныхПользователя = Оболочка.ExpandEnvironmentStrings("%APPDATA%");
ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДанныхПользователя);
ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка,
Неопределено,
ЭтаФорма.УникальныйИдентификатор,
Неопределено,
ПредыдущийАдресФайла);
РаботаСФайламиКлиент.ПолучитьФайлВерсииВРабочийКаталог(
Неопределено,
ДанныеФайла,
"",
ЭтаФорма.УникальныйИдентификатор,
Неопределено);
Если ДанныеФайла.Расширение = "doc" ИЛИ ДанныеФайла.Расширение = "docx" Тогда
ИмяФайлаНовое = ДанныеФайла.ПолноеНаименованиеВерсии + " с факсимилем.docx";
ИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге;
ФайлВФормате = ПутьККаталогу+ИмяФайлаНовое;
MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Ложь;
MSWord.Documents.Add(ИмяФайла);
ШаблонВорд = MSWord.ActiveDocument;
// Вставка Печать
БиблиотекаКартинок.Pechat.Записать(ПутьККаталогу + "pechat.png");
ФайлКартинки = ПутьККаталогу + "pechat.png";
ШаблонВорд.Bookmarks("Печать1").Select();
Печать = ШаблонВорд.Application.Selection.InlineShapes.AddPicture(ФайлКартинки);
Печать.Height = 120;
Печать.Width = 120;
Shape = Печать.ConvertToShape();
Shape.WrapFormat.Type = 5;
УдалитьФайлы(ПутьККаталогу + "pechat.png");
// Вставка Подпись
БиблиотекаКартинок.Podpis.Записать(ПутьККаталогу + "podpis.png");
ФайлКартинки = ПутьККаталогу + "podpis.png";
ШаблонВорд.Bookmarks("Подпись1").Select();
Подпись = ШаблонВорд.Application.Selection.InlineShapes.AddPicture(ФайлКартинки);
Подпись.Height = 100;
Подпись.Width = 100;
Shape = Подпись.ConvertToShape();
Shape.WrapFormat.Type = 5;
УдалитьФайлы(ПутьККаталогу + "podpis.png");
ДокументВорд = MSWord.Application.Documents(1);
ДокументВорд.Activate();
ДокументВорд.SaveAs(ФайлВФормате);
MSWord.Application.Quit();
// добавляем получившийся файл в карточку документа
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ВладелецФайла",ДанныеФайла.Владелец);
ПараметрыВыполнения.Вставить("ДобавлениеОригинала",Ложь);
ПараметрыВыполнения.Вставить("ИдентификаторРодительскойФормы",Неопределено);
ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияФайла",Истина);
ПараметрыВыполнения.Вставить("ОбработчикРезультата",Неопределено);
ПараметрыВыполнения.Вставить("ПараметрыОповещения",Неопределено);
ПараметрыВыполнения.Вставить("СписокОповещений",Неопределено);
ПараметрыВыполнения.Вставить("ПолноеИмяФайла",ФайлВФормате);
ПараметрыВыполнения.Вставить("ИмяСоздаваемогоФайла",Неопределено);
ПараметрыВыполнения.Вставить("ФормаВладелец",ЭтаФорма);
РаботаСФайламиКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения);
КонецЕсли;
Код вставки картинок без ЗАКЛАДОК в документ WORD
ТекущиеДанные = ТекущиеДанныеСпискаФайлов();
Оболочка = Новый COMОбъект("WScript.Shell");
КаталогДанныхПользователя = Оболочка.ExpandEnvironmentStrings("%APPDATA%");
ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДанныхПользователя);
ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка,
Неопределено,
ЭтаФорма.УникальныйИдентификатор,
Неопределено,
ПредыдущийАдресФайла);
РаботаСФайламиКлиент.ПолучитьФайлВерсииВРабочийКаталог(
Неопределено,
ДанныеФайла,
"",
ЭтаФорма.УникальныйИдентификатор,
Неопределено);
Если ДанныеФайла.Расширение = "doc" ИЛИ ДанныеФайла.Расширение = "docx" Тогда
ИмяФайлаНовое = ДанныеФайла.ПолноеНаименованиеВерсии + " с факсимилем.docx";
ИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге;
ФайлВФормате = ПутьККаталогу+ИмяФайлаНовое;
MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Ложь;
MSWord.Documents.Add(ИмяФайла);
ШаблонВорд = MSWord.ActiveDocument;
// Вставка Печать
БиблиотекаКартинок.Pechat.Записать(ПутьККаталогу + "pechat.png");
ФайлКартинки = ПутьККаталогу + "pechat.png";
Выбор = MSWord.Selection;
Печать = Выбор.InlineShapes.AddPicture(ФайлКартинки, False, True);
Печать.Height = 120;
Печать.Width = 120;
Фигура = Печать.ConvertToShape();
Фигура.WrapFormat.Type = 5;
Фигура.Left = 230;
Фигура.Top = 650;
УдалитьФайлы(ПутьККаталогу + "pechat.png");
// Вставка Подпись
БиблиотекаКартинок.Podpis.Записать(ПутьККаталогу + "podpis.png");
ФайлКартинки = ПутьККаталогу + "podpis.png";
Выбор = MSWord.Selection;
Печать = Выбор.InlineShapes.AddPicture(ФайлКартинки, False, True);
Печать.Height = 100;
Печать.Width = 100;
Фигура = Печать.ConvertToShape();
Фигура.WrapFormat.Type = 5;
Фигура.Left = 330;
Фигура.Top = 650;
УдалитьФайлы(ПутьККаталогу + "podpis.png");
ДокументВорд = MSWord.Application.Documents(1);
ДокументВорд.Activate();
ДокументВорд.SaveAs(ФайлВФормате);
MSWord.Application.Quit();
// добавляем получившийся файл в карточку документа
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ВладелецФайла",ДанныеФайла.Владелец);
ПараметрыВыполнения.Вставить("ДобавлениеОригинала",Ложь);
ПараметрыВыполнения.Вставить("ИдентификаторРодительскойФормы",Неопределено);
ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияФайла",Истина);
ПараметрыВыполнения.Вставить("ОбработчикРезультата",Неопределено);
ПараметрыВыполнения.Вставить("ПараметрыОповещения",Неопределено);
ПараметрыВыполнения.Вставить("СписокОповещений",Неопределено);
ПараметрыВыполнения.Вставить("ПолноеИмяФайла",ФайлВФормате);
ПараметрыВыполнения.Вставить("ИмяСоздаваемогоФайла",Неопределено);
ПараметрыВыполнения.Вставить("ФормаВладелец",ЭтаФорма);
РаботаСФайламиКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения);
КонецЕсли;







