Перейти к содержимому

Использование шаблонов Word в 1С

Использование шаблонов Word в 1С

В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.

В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.

Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:

Использование шаблонов Word в 1С
Использование шаблонов Word в 1С

Использование шаблонов Word  в 1С
Использование шаблонов Word в 1С

Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:

Установка закладки, шаблон Word для 1С
Установка закладки, шаблон Word для 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();
	
КонецФункции

В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:

Результат использования шаблонов Word в 1С
Результат использования шаблонов Word в 1С

Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.

Скачать файл обработки 1С и шаблона Word.

Дополнение к заметке Использование шаблонов Word в 1С

Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.

1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:

//Заменяем закладку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С код будет следующий:

// Вставка изображения
ШаблонВорд.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 кодом:

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет    = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); 
ИмяФайла = КаталогВременныхФайлов() + "\"файл.doc";
Макет.Записать(ИмяФайла);

Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».

5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:

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

Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

Соответственно код для 1С следующий:

Функция ЗаполнитьШаблонВорд()

	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:\Users\k.blagin\Desktop\Шаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все ссылки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Меняем адрес уже существующей ссылки
	ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:\Users\k.blagin\Desktop\Memory.zip";
	
	//Заменяем закладку на ссылку
	ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
	ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:\Users\k.blagin\Desktop\Шаблон.docx", "", "Шаблон.docx", "C:\Users\k.blagin\Desktop\Шаблон.docx");
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции
Метки:

40 комментариев для “Использование шаблонов Word в 1С”

    1. Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:

      //Заменяем закладку3 на текущую дату
      ШаблонВорд.Bookmarks("Закладка3").Select();
      
      ШаблонВорд.Application.Selection.Font.Bold = 1;
      ШаблонВорд.Application.Selection.Font.Size = 20;
      	
      ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
      
  1. Добрый день, подскажите, пожалуйста, картинки есть возможность выгружать в шаблон?

  2. Снова, здравствуйте.
    Вопрос по шаблонам. Попросили перенести шаблоны, написанные в Word из ЗиК 1.0 в ЗиК 3.0.
    Как я понял — не перенесутся, нужно новые писать. Поскольку, учусь, то это даже на руку. За образец решил взять Ваш и начать разбираться. Но Ваш НЕ ГРУЗИТСЯ. Пишет:
    Невозможно подключить дополнительную обработку из файла.
    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)
    Кстати, когда пытаюсь загрузить шаблоны из 1.0, то пишет тоже самое.
    Можете что-нибудь посоветовать?

    1. Данная ошибка, появляется, потому что обработка создана просто как внешняя, без возможности подключения к 1С. Если вы хотите подключить какую либо обработку, в режиме «1С:Предприятие», тогда в модуле обработки необходимо вставить определенный код, более подробно описано по следующим ссылкам:
      Добавление дополнительных отчетов и обработок в тонком клиенте.
      Создание нового отчета или обработки
      youtube: Создание внешней обработки

      А насчет переноса могу посоветовать, проанализировать, как в ЗиК 1.0 производилось заполнение шаблона. Найти участки кода, которые за это отвечают, попробовать сначала перенести их во внешнюю обработку, для тестирования. Как вариант, сам шаблон можно положить в макеты (тип макета «Active document») этой обработки и уже оттуда загружать его.

      Здесь есть несколько нюансов, механизм заполнения шаблонов и сами шаблоны, типовые, доработанные или самописные? Объекты которые используются для заполнения в ЗиК 1.0 могут отсутствовать в ЗиК 3.0 или иметь другое наименование. Плюс ко всему, необходимо еще учесть, что ЗиК 1.0 это обычное приложение, использующее толстый клиент, а ЗиК 3.0 управляемое приложение, использующее тонкий клиент, соответственно здесь тоже присутствует своя специфика работы.

      Да и еще, в ЗиК 3.0 как мне кажется должен быть свой механизм шаблонов, к сожалению, не работал с этими конфигурациями, но вероятно там уже есть механизм аналогичный ЗиК 1.0. Так что может, будет достаточно только добавить шаблон.

  3. Спасибо за быстрый и подробный ответ.
    Попробую разобраться.
    Шаблоны у нас самописные.
    Про собственный механизм шаблонов, даже не слышал. Попробую поискать в сети.

  4. Ваша ссылка помогла.
    Добавил две функции и одну процедуру, и Ваша обработка заработала.
    Свою, похоже , придётся рисовать с нуля.

  5. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?

      1. Помогло. Спасибо.
        Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:

        ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
        Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
        ИмяФайла = КаталогВременныхФайлов() + «\»файл.doc»;
        Макет.Записать(ИмяФайла);

        Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk

        1. Предполагаю, что метод Записать(<ИмяФайла>, <ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».

  6. Константин,
    У меня в документе есть ссылки на файлы которые расположены на сетевом диске.
    Как в шаблоне сделать гиперссылку на эти файлы?

    1. Здравствуйте, Руслан.
      Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:

      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
      

      Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

      Соответственно код для 1С следующий:

      Функция ЗаполнитьШаблонВорд()
      
      	//Попытка создать COM объект
      	Попытка
      		ОбъектВорд = Новый COMОбъект("Word.Application"); 
      	Исключение
      		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
      		Возврат Неопределено;
      	КонецПопытки;
      	
      	//Путь к шаблону
      	ОбъектВорд.Documents.Add("C:\Users\k.blagin\Desktop\Шаблон.docx");
      	ШаблонВорд = ОбъектВорд.ActiveDocument;
      	
      	//Получаем все ссылки из шаблона
      	Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
      		Сообщить(ЗакладкаВорд.Name);		
      	КонецЦикла;
      	
      	//Меняем адрес уже существующей ссылки
      	ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:\Users\k.blagin\Desktop\Memory.zip";
      	
      	//Заменяем закладку на ссылку
      	ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
      	ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:\Users\k.blagin\Desktop\Шаблон.docx", "", "Шаблон.docx", "C:\Users\k.blagin\Desktop\Шаблон.docx");
      	
      	ОбъектВорд.Application.Visible = Истина;
      	ОбъектВорд.Activate();
      	
      	//Закрытие документа
      	//ОбъектВорд.Application.Quit();
      	
      КонецФункции
      
  7. я хочу заполнить шаблон с помощью заполнения пользовательской формы. как получить значение,выбранное из списка, если тип поля СправочникСсылка.НазваниеСправочника?

  8. Здравствуйте. Попросили обновить шаблоны договоров для печати. Обновила, но теперь при печати выводит ошибку, что не удалось сформировать элемент управления ActiveX. С чем это может быть связано?

    1. Ирина, для ответа необходима дополнительная информация:
      1. Какая конфигурация используется?
      2. Каким образом происходило обновление шаблонов?
      3. Ошибка выходит при формировании документа на основе данных и шаблона или при отправке на печать?

  9. Доброго дня. Прошу помочь с задачей вставки в документ Word, ранее записанного файла HTML (из 1С сохранил на диск, браузером файл открывается нормально — отображается НЕ как текст)., а в документе Word формируется как текст не конвертированный.
    Вставляю так
    Word = ПечатнаяФорма.COMСоединение;
    Select = Word.Selection;
    Docum = Word.Application.Documents(1);
    Select.InsertFile(«C:\Temp\1.html»);

  10. Добрый день. Все бы хорошо, но, как сделать не обработку а печатную форму?
    Я сделал внешнюю печатную форму с шаблоном типа Active Document, добавил пока одну закладку на пробу, подключил, чтобы при нажатии кнопки «Печать» из справочника «договоры» выполнялось. Открывается Word, все работает, но, в базе возникает окно где написано : Печать. Печатная форма недоступна. Как сделать чтобы окно не вылезало? Обработка не подходит потому что она не падает в меню кнопки «Печать»

  11. Скажите пожалуйста а можно шаблон word в обработку вставить, чтобы он в конфигурации был

  12. Добрый день, подскажите, пожалуйста, как сделать так, чтобы подобный документ создавался при нажатии на кнопку на форме . Я создала команду «Документ», но не понимаю, что нужно вписать в ее обработчик. У меня имеется документ «ПриемНаРаботу» в виде списка, я заполняю форму (фио, паспорт, должность, оклад). А после могу нажать на кнопку «Документ», чтобы увидеть тот самый шаблон word.Как это можно сделать?

    1. Ирина, вы можете воспользоватся примером из обработки, ссылку на которую находится внизу заметки.
      1. Подготовить шаблон Word, расставив в нем закладки;
      2. В код команды добавить заполнение файла и его вывод.

      Дополнительно, можете воспользоватся способом описанным в заметке http://blagin.ru/1s-word-shablon-zapolnenie-tablic-v-shablone-word/

  13. Добрый день, а как можно вставить в колонтитул на разных листах в ворде номера бланков взятых из 1С( 1 лист бланк — №0089 ,2 лист бланк — №0090 и …)

    1. https://infostart.ru/public/488556/
      Цитата:
      Каждая страница Word разделена на несколько областей:

      Верхний колонтитул
      Основной текст
      Нижний колонтитул
      Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.

      //Объект, содержит весь основный текст из всех разделов ДокументВорд.Content
      //Объект содержит коллекцию разделов документа
      ДокументВорд.Sections
      //В каждом разделе есть своя коллекция для верхних колонтитулов
      ДокументВорд.Sections(1).Headers
      //И своя коллекция для нижних колонтитулов
      ДокументВорд.Sections(1).Footers
      //При этом, если стоит галочка "Уникальный колонтитул для первой страницы", то коллекции Headers и Footers будут содержать два элемента
  14. А можно ли через закладки заполнить таблицу в Ворде? Как раскрасить строчки в таблице?

  15. Подскажите пожалуйста, есть картика внутри шаблона Ворд, жётко спозиционирована, установлен масштаб и обтекание.
    Возможно ли заменить само изображение, не сбив позиционирование картинки в шаблоне и сохранить все насиройки форматирования изображения?

  16. Но как быть, если мне требуется вставить в Договор картинку двоичными данными!?

  17. Добрый день!
    Подскажите, делаю внешнюю обработку, вид ПечатнаяФорма. Макет в Word. На сервере открывается, но ругается «Печатная форма не доступна» (скорее всего ей нужен табличный документ), а на клиенте не открывается..
    Как тут поступить? может открывать обработку и там создать кнопку Печать?

  18. Добрый день
    Стоит задача создать файл word с заблокированными для редактирования ячейками в таблице.
    Создать, заполнить и вывести документ получилось, а заблокировать ячейки (или часть строки) не могу догнать как.

    Для примера:
    _ФИО которое необходимо вносить руками_, «именуемый в дальнейшем «Работник», с другой стороны, именуемые в дальнейшем «Стороны», заключили настоящий договор, в дальнейшем «Договор», о нижеследующем:»
    В кавычках текст который должен быть заблокирован для редактирования.
    Помогите пжл решить задачу

    1. День добрый.
      Если вы используете шаблон, тогда попробуйте поискать способы блокировки ячеек стандартными средствами Word.
      Например, через поиск в Яндексе Заблокировать ячейку в Word
      Дополнительно, если это нужно автоматизировать, тогда можно использовать подсказки из того как это делается в «Visual Basic for Applications».

Добавить комментарий

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