Создание com объекта word

Содержание:

1.      Для чего нужна работа в 1С 8.3 с Word?

2.      Как работать программно с документами MS WORD (расширениями .doc и .docx)?

3.      Заполнение в 1С 8 таблицы Word  

1.      Для чего нужна работа в 1С 8.3 с Word?

В этой статье обсудим, как в 1С можно работать с форматом текста Word: создание, редактирование, копирование документов MS Word. Самый распространенный вариант использования программного заполнения документов MS Word – это заполнение шаблонов в ворде. То есть после создания шаблона word, пользователь помечает параметры квадратными скобками [] (это наиболее частый вариант экранирования параметров) или знаками больше меньше <>, после чего при нажатии кнопки «Печать Word» или «Сохранить Word» открывается заполненный документ MS Word. Большинству шаблонов, конечно, подойдут и табличные документы, но лично мною было создано множество шаблонов, которые требовали форматирования текстового документа именно в MS Word (чаще из-за удобства редактирования шаблона MS Word для пользователя). Это были договора, сертификаты, письма и различные заявления. Все они сохранялись в формат текста Word и в дальнейшем отправлялись по почте или уходили на печать.  

2.      Как работать программно с документами MS WORD (расширениями .doc и .docx)?

В дополнение к вступлению скажу, что хранение самих шаблонов MS Word мы в данной статье рассматривать не будем. Лично я использовал и справочники и регистры сведений (хранение в реквизите с типом ХранилищеЗначения), макеты с типом двоичные данные, аналог хранения файлов в базе данных. И были случаи использования указанного пути к каталогу с шаблонами, наподобие хранения файлов в томах на диске. Выбор за вами. В статье мы рассмотрим конкретно программный принцип работы с MS Word.

Рис. 1 Пример оформления документа word, который будет использован как шаблон

Получаем шаблон Word, например, из макета и сохраняем его во временный файл Word.


Рис. 2 Сохранение временного файла Word

Создаем Com-объект и сам документ Word, передавая в метод Add путь к ранее сохраненному шаблону.

Рис. 3 Программное создание COM-объекта и документа Word

Для заполнения параметров я использую структуру (или соответствие), ключ и значение. Имя ключа – это параметр замены, а значение – то, на которое меняем экранированный параметр.
В итоге параметры заполнения (структуру) мы размещаем где удобно, получаем ее и заполняем уже созданный документ MS Word.

Рис. 4 Определение параметров заполнения

С методом Find. Execute (Word) лучше всего ознакомится отдельно на официальном сайте Microsoft. Там же можно посмотреть описание и других методов, которые могут пригодится.

После замены разворачиваем окно и делаем его активным (то есть показываем пользователю заполненный шаблон MS word).

Рис. 5 Активация окна Word

И это – весь процесс заполнения шаблона 1С Word! Да, это так просто! Однако на моей практике встречались случаи, когда в шаблоне необходимо было заполнить табличную часть, например, приложение к договору со спецификацией. Здесь необходим отдельный блок кода и особенный шаблон.  

3.      Заполнение таблиц в программе Word

В шаблоне создаем одну строку с нужным форматированием. Получаем таблицу или выборку со значениями строк для заполнения их в документе MS Word. Заполнение таблицы в программе Word происходит по номеру строки и колонки, то есть мы точно должны знать нумерацию колонок (но можно подумать и о другом заполнении). Итак, получаем таблицу word по номеру и заполняем значениями.

Рис. 6 Заполнение таблицы в Word

В итоге скажу, что работа с Microsoft Word может быть на очень высоком уровне, но для этого необходимо изучить документацию от Microsoft по Word. И тогда в ворде из 1С можно будет творить настоящие чудеса (как собственно и в Excel)!

Специалист компании «Кодерлайн»

Вадим Хоменко

Доброго времени суток друзья. Я уже рассказывал, как можно работать с Microsoft Excel средствами PowerShell. В данной статье мы рассмотрим работу

PowerShell

с

Microsoft Word

. Как и для Excel, чтобы получить доступ к MS Word нужно использовать COM объект. Для этого используем командлет

New-Object

с параметром

–ComObject

далее сам объект к которому хотим получить доступ, в нашем случае это

Word.Application

.

  
    #Создаем новый объект WORD
    $word = New-Object -ComObject Word.Application
  

После создания объекта обращаемся к свойству

Visible

и переключаем его в

TRUE

чтобы видеть работу скрипта непосредственно в самом

MS Word

а не в фоновом режиме.

  
    #Видимый режим вставки, по умолчанию FALSE
    $word.Visible = $True
  

Далее необходимо создать сам документ для этого обращаемся к свойству

Documents

и его методу

Add()

.

  
    #Создаем новый документ
    $doc = $word.Documents.Add()
  

Обратимся к свойству

Selection

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

  
    #Выбираем открывшийся документ для работы
    $Selection = $word.Selection
  

Задаем начальные настройки для документа допустим отступы со всех сторон.

  
    #Устанавливаем отступы для документа
    $Selection.Pagesetup.TopMargin = 50
    $Selection.Pagesetup.LeftMargin = 50
    $Selection.Pagesetup.RightMargin = 50
    $Selection.Pagesetup.BottomMargin = 50
  

Установим строчный интервал сверху и снизу.

  
    #Интервал отступов сверху и снизу
    $Selection.ParagraphFormat.SpaceBefore = 0
    $Selection.ParagraphFormat.SpaceAfter = 0
  

Подготовительные работы закончены, теперь можем заполнять наш документ. Укажем что наш первый абзац будет по центру для этого воспользуемся свойством ParagraphFormat и его свойством

Aligment

.

  
    #Выравнивание по центру
    $Selection.ParagraphFormat.Alignment = 1
  

Далее создаем таблицу с одной строкой и одной ячейкой которую зальем черным цветом и разместим пользовательскую картинку.

  
    #Добавляем таблицу
    $Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 1)

    #Устанавливаем черный цвет заливки ячейки
    $Table.Cell(1,1).Shading.BackgroundPatternColor = 0

    #Вставляем картинку в ячейку таблицы
    $Table.Cell(1,1).Range.InlineShapes.AddPicture("D:Tempbezramok-tlt.png")

    #Конец таблицы, начать новую строку
    $Selection.EndKey(6, 0)
  

Далее переходим на новую строчку документа воспользовавшись методом

TypeParagraph()

.

  
    #Новый параграф
    $Selection.TypeParagraph()
  

Далее установим нужные настройки для нашего заголовка.

  
    #Шрифт написания
    $Selection.Font.Name = "Times New Roman"

    #Размер шрифта
    $Selection.Font.Size = 18
  

Как видно из примера мы установили шрифт

Time New Roman

и размер шрифта

18

, далее вставляем текст.

  
    #Текст заголовка
    $Selection.TypeText("Работаем с Microsoft Word при помощи PowerShell")
  

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

  
    #Выравнивание по ширине листа
    $Selection.ParagraphFormat.Alignment = 3

    #Устанавливаем новые значения размера шрифта
    $Selection.Font.Name = "Arial"
    $Selection.Font.Size = 12

    #Пишем курсивом
    $Selection.Font.Italic = $true
  

Далее добавляем новый текст в наш документ.

  
    #Добавляем следующий текст
    $Selection.TypeText("Windows PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом")
  

Так как для следующего текста нам не нужен курсив, то отключаем его.

  
    #отключаем курсив
    $Selection.Font.Italic = $false
  

Далее создаем настройки для следующего текста, выправным его по центру и изменим цвет на темно-зеленый, а также выделим жирным.

  
    #Вставляем заголовок по центру
    $Selection.ParagraphFormat.Alignment = 1

    #Устанавливаем новые значения размера шрифта
    $Selection.Font.Name = "Arial"
    $Selection.Font.Size = 18

    #Делаем цвет текста темно-зеленым
    $Selection.Font.Color = "wdColorDarkGreen"

    #Выделяем жирным
    $Selection.Font.Bold = $True

    #Следующий текст в нашем документе
    $Selection.TypeText("Добавляем картинку из файла ")
  

Далее вставляем картинку в документ по центру, для этого используем свойство

InlineShapes

и его метод

AddPicture()

передав путь до картинки.

  
    #Вставляем картинку из файла
    $Selection.InlineShapes.AddPicture("D:Tempword.jpg")
  

Далее отменяем центрирование и меняем цвет текста на черный.

  
    #Делаем цвет текста черным
    $Selection.Font.Color = 0

    #Отменяем жирный
    $Selection.Font.Bold = $False
  

Устанавливаем новые настройки для следующего текста.

  
    #Настройки размера шрифта для нового текста
    $Selection.Font.Name="Times New Roman"
    $Selection.Font.Size=12
  

Далее создадим таблицу с тремя столбцами в которую заполним с помощью

PowerShell

.

  
    #Добавляем таблицу
    $Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 3)

    #Ручной вариант форматирования таблицы
    # $Table.Range.Style = "Table Grid"
    # $Table.Borders.InsideLineStyle = 1
    # $Table.Borders.OutsideLineStyle = 1

    #Заполняем шапку таблицы
    $Table.Cell(1,1).Range.Text = "№"
    $Table.Cell(1,2).Range.Text = "Name"
    $Table.Cell(1,3).Range.Text = "DysplayName"

    #Счетчики для генерации таблицы
    $i = 2
    $counter = 1

    #Получаем список всех процессов на компьютере
    $srv = Get-Service a*

    #Записываем полученые данные в ячейки таблицы
    foreach ($arr in $srv)
    {
    $Table.Rows.Add()
    $Table.Cell($i,1).Range.Text = $counter
    $Table.Cell($i,2).Range.Text = $arr.Name
    $Table.Cell($i,3).Range.Text = $arr.DisplayName


    #инкрементируем счетчики
    $i = $i + 1
    $counter = $counter + 1
    }

    #Автоформатирование таблицы
    $Table.AutoFormat(20)

    #Конец таблицы, начать новую строку
    $Selection.EndKey(6, 0)
  

Здесь нужно отметить, что ячейки таблицы начинаются с

1

. Для генерации новой строки нужно использовать свойство Rows и его метод

Add()

. Для удобства форматирования таблицы используем метод

AutoFormat()

передав число (это идентификатор шаблона форматирования таблицы). Для перехода от таблицы к обычному документу используем метод

EndKey(6, 0)

.

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

  
    #Вставляем заголовок по центру
    $Selection.paragraphFormat.Alignment = 0

    #Размер шрифта
    $Selection.Font.Size=14

    #Текст
    $Selection.TypeText("Урок создал")

    #Новый параграф
    $Selection.TypeParagraph()

    #Размер шрифта
    $Selection.Font.Size=12

    #Гиперссылка сайта
    $Selection.Hyperlinks.Add($Selection.Range,"http:#bezramok-tlt.ru")

    #Новый параграф
    $Selection.TypeParagraph()

    #Гиперссылка почты
    $Selection.Hyperlinks.Add($Selection.Range,"mailto:bezramok-tlt@mail.ru")

    #Новый параграф
    $Selection.TypeParagraph()

    #Текст
    $Selection.TypeText("Админ")

    #Новый параграф
    $Selection.TypeParagraph()

    #Размер шрифта
    $Selection.Font.Size=10

    #Текст
    $Selection.TypeText("Дата: " + $date)
  

Как вы заметили мы использовали свойство

Hyperlinks

и его метод

Add()

в который передали

URL

для гиперссылки.

Далее сохраняем документ (СохранитьКак) указываем путь куда будем сохранять наш файл, закрываем сам документ, закрываем само приложение MS Word.

  
    #СохранитьКак указываем путь куда и имя файла
    $doc.SaveAs([ref]"D:tempPsWord.docx")

    #Закрываем документ
    $doc.Close()

    #Закрываем приложение
    $word.Quit()
  

Я постарался собрать на мой взгляд основные действия для заполнения документа – это форматирование текста, изменение размера текста, шрифта, цвета. Создание таблиц, заполнение таблицы графически и текстовым материалом, а также заливка ячейки цветом.

Вот таким способом можно создавать документы

MS Word

с помощью

PowerShell

.

Скрипт PowerShell работа с MS Word целиком

  
    #Получаем текущую дату
    $date = Get-Date

    #Создаем новый объект WORD
    $word = New-Object -ComObject Word.Application

    #Видимый режим вставки, по умолчанию FALSE
    $word.Visible = $True

    #Создаем новый документ
    $doc = $word.Documents.Add()

    #Выбираем открывшийся документ для работы
    $Selection = $word.Selection

    #Устанавливаем отступы для документа
    $Selection.Pagesetup.TopMargin = 50
    $Selection.Pagesetup.LeftMargin = 50
    $Selection.Pagesetup.RightMargin = 50
    $Selection.Pagesetup.BottomMargin = 50


    #Интервал отступов сверху и снизу
    $Selection.ParagraphFormat.SpaceBefore = 0
    $Selection.ParagraphFormat.SpaceAfter = 0


    #Выравнивание по центру
    $Selection.ParagraphFormat.Alignment = 1

    #Добавляем таблицу
    $Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 1)

    #Устанавливаем черный цвет заливки ячейки
    $Table.Cell(1,1).Shading.BackgroundPatternColor = 0

    #Вставляем картинку в ячейку таблицы
    $Table.Cell(1,1).Range.InlineShapes.AddPicture("D:Tempbezramok-tlt.png")


    #Конец таблицы, начать новую строку
    $Selection.EndKey(6, 0)

    #Новый параграф
    $Selection.TypeParagraph()

    #Шрифт написания
    $Selection.Font.Name = "Times New Roman"

    #Размер шрифта
    $Selection.Font.Size = 18

    #Текст заголовка
    $Selection.TypeText("Работаем с Microsoft Word при помощи PowerShell")

    #Переходим на новую строку
    $Selection.TypeParagraph()

    #Выравнивание по ширине листа
    $Selection.ParagraphFormat.Alignment = 3

    #Устанавливаем новые значения размера шрифта
    $Selection.Font.Name = "Arial"
    $Selection.Font.Size = 12

    #Пишем курсивом
    $Selection.Font.Italic = $true

    #Добавляем следующий текст
    $Selection.TypeText("Windows PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом")

    #отключаем курсив
    $Selection.Font.Italic = $false

    #Новый параграф
    $Selection.TypeParagraph()

    #Новый параграф
    $Selection.TypeParagraph()

    #Вставляем заголовок по центру
    $Selection.ParagraphFormat.Alignment = 1

    #Устанавливаем новые значения размера шрифта
    $Selection.Font.Name = "Arial"
    $Selection.Font.Size = 18

    #Делаем цвет текста темно-зеленым
    $Selection.Font.Color = "wdColorDarkGreen"

    #Выделяем жирным
    $Selection.Font.Bold = $True

    #Следующий текст в нашем документе
    $Selection.TypeText("Добавляем картинку из файла ")

    #Вставляем картинку из файла
    $Selection.InlineShapes.AddPicture("D:Tempword.jpg")

    #Делаем цвет текста черным
    $Selection.Font.Color = 0

    #Отменяем жирный
    $Selection.Font.Bold = $False

    #Новый параграф двойной отступ
    $Selection.TypeParagraph()
    $Selection.TypeParagraph()

    #Настройки размера шрифта для нового текста
    $Selection.Font.Name = "Times New Roman"
    $Selection.Font.Size = 14

    $Selection.TypeText("Создание таблицы в Microsoft Word средствами PowerShell")

    #Новый параграф
    $Selection.TypeParagraph()

    #Новый параграф
    $Selection.TypeParagraph()

    #Настройки размера шрифта для нового текста
    $Selection.Font.Name="Times New Roman"
    $Selection.Font.Size=12

    #Добавляем таблицу
    $Table = $Word.ActiveDocument.Tables.Add($Word.Selection.Range, 1, 3)

    #Ручной вариант форматирования таблицы
    # $Table.Range.Style = "Table Grid"
    # $Table.Borders.InsideLineStyle = 1
    # $Table.Borders.OutsideLineStyle = 1

    #Заполняем шапку таблицы
    $Table.Cell(1,1).Range.Text = "№"
    $Table.Cell(1,2).Range.Text = "Name"
    $Table.Cell(1,3).Range.Text = "DysplayName"

    #Счетчики для генерации таблицы
    $i = 2
    $counter = 1

    #Получаем список всех процессов на компьютере
    $srv = Get-Service a*

    #Записываем полученые данные в ячейки таблицы
    foreach ($arr in $srv)
    {
    $Table.Rows.Add()
    $Table.Cell($i,1).Range.Text = $counter
    $Table.Cell($i,2).Range.Text = $arr.Name
    $Table.Cell($i,3).Range.Text = $arr.DisplayName


    #инкрементируем счетчики
    $i = $i + 1
    $counter = $counter + 1
    }

    #Автоформатирование таблицы
    $Table.AutoFormat(20)

    #Конец таблицы, начать новую строку
    $Selection.EndKey(6, 0)

    #Новый параграф
    $Selection.TypeParagraph()

    #Вставляем заголовок по центру
    $Selection.paragraphFormat.Alignment = 0

    #Размер шрифта
    $Selection.Font.Size=14

    #Текст
    $Selection.TypeText("Урок создал")

    #Новый параграф
    $Selection.TypeParagraph()

    #Размер шрифта
    $Selection.Font.Size=12

    #Гиперссылка сайта
    $Selection.Hyperlinks.Add($Selection.Range,"http:#bezramok-tlt.ru")

    #Новый параграф
    $Selection.TypeParagraph()

    #Гиперссылка почты
    $Selection.Hyperlinks.Add($Selection.Range,"mailto:bezramok-tlt@mail.ru")

    #Новый параграф
    $Selection.TypeParagraph()

    #Текст
    $Selection.TypeText("Админ")

    #Новый параграф
    $Selection.TypeParagraph()

    #Размер шрифта
    $Selection.Font.Size=10

    #Текст
    $Selection.TypeText("Дата: " + $date)

    #Новый параграф
    $Selection.TypeParagraph()

    #СохранитьКак указываем путь куда и имя файла
    $doc.SaveAs([ref]"D:tempPsWord.docx")

    #Закрываем документ
    $doc.Close()

    #Закрываем приложение
    $word.Quit()
  

Оглавление (нажмите, чтобы раскрыть)

Вставка таблицы в документ Word

Пример вставки таблицы в Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//определяем место вставки
Range = Doc.Range(0);
//создаем таблицу 2х2
Table = Doc.Tables.Add(Range, 2, 2);
Table.Style = "Сетка таблицы";

//определяем ширину столбцов
Table.columns(1).Width = 20;
Table.columns(2).Width = 50;

//заполняем первую строку
Table.Cell(1, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("1");
Table.Cell(1, 2).Select();
Word.Selection.TypeText("Один");

//заполняем вторую строку
Table.Cell(2, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("2");
Table.Cell(2, 2).Select();
Word.Selection.TypeText("Два");

//показываем документ на экране
Word.Visible = Истина;

Вставка текста в документ Word

Пример вставки текста в документ Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//добавляем пустой документ
Doc = Word.Documents.Add();

//добавляем 10 параграфов
Для Н = 1 По 10 Цикл
    Par = Doc.Paragraphs.Add();
    Par.Range.InsertBefore("Параграф №" + Н);
КонецЦикла;

//вставляем текст в начало докуменета
Range = Doc.Range(0);
Range.InsertBefore("Начало!" + Символы.ПС);

//вставляем текст после 16-го символа
Range = Doc.Range(16, 16);
Range.InsertAfter("[Вставка]");

//показываем документ на экране
Word.Visible = Истина;

Выделение текста

Пример выделения текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выделяемый текст");

//выделяем первое слово
Doc.Range(0, 10).Select();

//копируем выделение в буфер обмена
Word.Selection.Copy();

//меняем размер шрифта и т.д.
Word.Selection.Font.Size = 16;

//показываем документ на экране
Word.Visible = Истина;

Выравнивание текста

Пример выравнивания текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Заголовок");
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выравниваем этот текст");

//0 - по левому краю
//1 - по центру
//2 - по правому краю
//3 - по ширине
//текущей параграф по центру
Par.Alignment = 1;
//заголовок по правому краю
Doc.Paragraphs(1).Alignment = 2;

//показываем документ на экране
Word.Visible = Истина;

Замена текста в документе Word

Пример замены текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]");

//заменяем ИНН
Word.Selection.Find.Text = "[ИНН]";
Word.Selection.Find.Replacement.Text = "7707083893";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//заменяем КПП
Word.Selection.Find.Text = "[КПП]";
Word.Selection.Find.Replacement.Text = "773601001";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//показываем документ на экране
Word.Visible = Истина;

Открытие документа Word

Пример открытия документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Word.Documents.Add("C:tmp1.docx");

//показываем документ на экране
Word.Visible = Истина;

Преобразование в таблицу

Пример преобразования документа Word в таблицу из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Таблица умножения:");

//формируем строку с разделителями
Сторока = "";
Для Н1 = 1 По 9 Цикл
    Для Н2 = 1 По 9 Цикл
        Сторока = Сторока + Н1 * Н2 + ?(
            Н2 = 9, "", Символы.Таб);
    КонецЦикла;
    Сторока = Сторока + Символы.ПС;
КонецЦикла;
Par.Range.InsertAfter(Сторока);

//переходим на строчку вниз
Word.Selection.MoveDown(5, 1, 0);
//выделяем таблицу
Word.Selection.MoveDown(5, 9, 1);

//конвертируем текст в таблицу
Word.Selection.ConvertToTable(1, 9, 9, 0);
Word.Selection.Tables(1).Style = "Сетка таблицы";

//показываем документ на экране
Word.Visible = Истина;

Создание документа Word

Пример создания документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//показываем документ на экране
Word.Visible = Истина;

Сохранение документа

Пример сохранения документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сохраняемый текст");

//сохраняем документ в файл
Doc.SaveAs("C:tmp2.docx");

//закрываем документ
Doc.Close();
Word.Quit();

Удаление текста из документа Word

Пример удаления текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Некоторый текст");

//удаляем слово некоторый и пробел
Range = Doc.Range(0, 10);
Range.Text = "";

//показываем документ на экране
Word.Visible = Истина;

Форматирование текста в документе Word

Пример форматирования текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Форматируем этот текст");
//меняем размер шрифта
Par.Range.Font.Size = 15;
//меняем название шрифта
Par.Range.Font.Name = "Verdana";

//выбираем слово "этот"
Range = Doc.Range(12, 16);
//меняем шрифт на ширный
Range.Font.Bold = Истина;
//курсив
Range.Font.Italic = Истина;
//подчеркнутый
Range.Font.Underline = Истина;
//красный
Range.Font.Color = 13311;

//показываем документ на экране
Word.Visible = Истина;

Чтение текста документа Word

Пример чтения текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Doc = Word.Documents.Open("C:tmp1.docx");

//читаем весь текст документа
Text = doc.Content.Text;
Сообщить(Text);

//читаем с 6-го по 10-й символ
From = 6;
To = 10;
Range = Doc.Range(From, To);
Text = Range.Text;
Сообщить(Text);

//закрыть документ
Doc.Close();
Word.Quit();

Опубликовано:

17 октября 2012 в 10:10

11

1

История вопроса

Необходимо печатать конверты по заданному макету. Задача довольно простая, когда мы заранее знаем, что необходимо печатать. Был создан интегрированный RTF-отчет. Посмотрев на него, пришли к выводу, что такой вариант будет недостаточно гибким, ведь почтовые
конверты бывают разные, при условии, что наши организации закупают их не централизовано, с печатью могут возникнуть проблемы.

Часть I. Индекс.

Был выбран путь формирование отчета из макета. Все текстовые поля замечательно проставляются с помощью макропеременных, но появляется загвоздка в формировании индекса. В RTF-отчете он формировался с помощью таблицы. Выбирая разные стили границ, мы можем
рисовать цифры. Можно было бы найти какой-нибудь подходящий шрифт, но его надо было бы устанавливать на все компьютеры, с которых возможна печать конвертов.

Посмотрели на готовый результат RTF-отчета с пустым индексом, сохранили его как docx, занесли в систему и обозвали макетом. Лишнее убрали, нужное добавили и сделали генерацию документа. И вот отчет уже почти готов.

Осталось нарисовать такие цифры:

В справке по VBA можно найти значения перечисления типа границы (wdBorderType). В соответствии с этими значениями создаем список соответствий, именем которого является цифра, значением – массив границ, формирующих число.

  // Верхняя часть цифры
  UpperPartOfNumber = CreateList()
  UpperPartOfNumber.Add(0; ArrayOf(-1; -2; -4))
  UpperPartOfNumber.Add(1; ArrayOf(-4; -8))
  UpperPartOfNumber.Add(2; ArrayOf(-1; -4))
  UpperPartOfNumber.Add(3; ArrayOf(-1; -8))
  UpperPartOfNumber.Add(4; ArrayOf(-2; -4))
  UpperPartOfNumber.Add(5; ArrayOf(-1; -2))
  UpperPartOfNumber.Add(6; ArrayOf(-8))
  UpperPartOfNumber.Add(7; ArrayOf(-1; -8))
  UpperPartOfNumber.Add(8; ArrayOf(-1; -2; -4))
  UpperPartOfNumber.Add(9; ArrayOf(-1; -2; -4))
  
  // Нижняя часть цифры
  LowerPartOfNumber = CreateList()
  LowerPartOfNumber.Add(0; ArrayOf(-2; -3; -4))
  LowerPartOfNumber.Add(1; ArrayOf(-4))
  LowerPartOfNumber.Add(2; ArrayOf(-3; -8))
  LowerPartOfNumber.Add(3; ArrayOf(-1; -8))
  LowerPartOfNumber.Add(4; ArrayOf(-1; -4))
  LowerPartOfNumber.Add(5; ArrayOf(-1; -3; -4))
  LowerPartOfNumber.Add(6; ArrayOf(-1; -2; -3; -4))
  LowerPartOfNumber.Add(7; ArrayOf(-2))
  LowerPartOfNumber.Add(8; ArrayOf(-1; -2; -3; -4))
  LowerPartOfNumber.Add(9; ArrayOf(-1; -8))

Приступаем к заполнению.

VBDocApp = CreateObject('Word.Application')
VBDoc = VBDocApp.Documents.Open(FileName)
PositionOfIndexNumber = 1
while PositionOfIndexNumber <= Length(OrgIndex)
  // Получаем цифру индекса
  IndexNumber = Copy(OrgIndex; PositionOfIndexNumber; 1)
  // Заполняем вернюю часть цифры
  UpperPart = UpperPartOfNumber.FindItem(IndexNumber)
  UpperPartTable = VBDoc.Tables(INDEX_TABLE_NUMBER).Rows(UPPER_PART_POINTER).Cells((PositionOfIndexNumber*2)-1) 
  // x*2-1 нужно, потому что между цифрами так же есть столбцы без отображаемых границ
  CyclePointer = 0    
  CycleCount = ArrayHighBound(UpperPart)
  // Отрисовка верхней части цифры
  while CyclePointer <= CycleCount
   UpperPartTable.Borders.Item(UpperPart[CyclePointer]).LineStyle = INDEX_LINE_STYLE
   UpperPartTable.Borders.Item(UpperPart[CyclePointer]).LineWidth = INDEX_LINE_WIDTH
   CyclePointer = CyclePointer + 1
  endwhile
  // Заполняем нижнюю часть цифры
  LowerPart = LowerPartOfNumber.FindItem(IndexNumber)
  LowerPartTable = VBDoc.Tables(INDEX_TABLE_NUMBER).Rows(LOWER_PART_POINTER).Cells((PositionOfIndexNumber*2)-1)
  CyclePointer = 0    
  CycleCount = ArrayHighBound(LowerPart)
  // Отрисовка нижней части цифры
  while CyclePointer <= CycleCount
    LowerPartTable.Borders.Item(LowerPart[CyclePointer]).LineStyle = INDEX_LINE_STYLE
    LowerPartTable.Borders.Item(LowerPart[CyclePointer]).LineWidth = INDEX_LINE_WIDTH
    CyclePointer = CyclePointer + 1
  endwhile
  PositionOfIndexNumber = PositionOfIndexNumber + 1
endwhile

Часть II. Сборка единого документа.

Пожалуй, более полезная и распространенная, при этом, значительно более короткая часть изысканий в объектной модели Word.Application.

Рисование в таблице, как оказалось, не единственное действие, для которого нам понадобился данный COM-объект. В RTF-отчете, с помощью тегов, можно разбивать документ на страницы. При генерации документов из макета, их придется склеивать средствами, предоставляемыми
COM.

  // Берем текущее содержимое документа
  Content = MainDoc.Content
  Content.Collapse(END_COLLAPSE_DIRECTION)
  // Вставляем разделитель страницы
  Content.InsertBreak(PAGE_BREAKE)
  // Переходим на вновь получившуюся страницу
  NewPageContent = Report.GoTo(GOTO_PAGE_ITEM; GOTO_LAST_PAGE_DIRECTION)
  // Вставляем содержимое другого документа в главный
  // DocPath – путь до документа в файловой системе
  NewPageContent.InsertFile(DocPath) 

GOTO_PAGE_ITEM – перечисление wdGoToItem. Определяет тип элемента для перехода. В нашем случае указываем, что перемещаемся по страницам.

GOTO_LAST_PAGE_DIRECTION – перечисление wdGoToDirection. Указывает направление перемещения. Для нас это последний элемент.

Эти перечисления указывают, что надо взять содержимое, находящееся на последней странице. Туда мы и вставляем новую информацию. Если бы эта страница имела бы какой-нибудь контент, он был бы заменен новой информацией. Если бы надо было добавить только подготовленную
текстовую информацию, то можно было бы использовать метод InsertAfter для всего содержимого документа, но у нас во втором документе находится несколько более комплексная информация.

Для справки.

Более подробную информацию по данному объекту можно найти в MSDN и справке по VBA.

В работе программиста 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КонстантинDesktoplogo_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:Usersk.blaginDesktopШаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все ссылки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Меняем адрес уже существующей ссылки
	ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:Usersk.blaginDesktopMemory.zip";
	
	//Заменяем закладку на ссылку
	ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
	ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:Usersk.blaginDesktopШаблон.docx", "", "Шаблон.docx", "C:Usersk.blaginDesktopШаблон.docx");
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции

Настройка системы для формирования документов Word или Excel на стороне сервера

Допустим, необходимо формировать документ офисного пакета Microsoft Office на стороне сервера, то есть от имени сервера 1С, но не всегда установка «из коробки» позволяет выполнять данную операцию. так как обычно происходит исключительная ошибка создания COM-объекта. В этом случае требуется более тонкая настройка системы в целом. Настройка заключается в установке прав доступа сервера 1С к DCOM-приложению и папке Desktop. Рассмотрим процесс настройки.

Откройте оснастку «Службы компонентов», для этого в командной строке выполните команду dcomcnfg (или comexp.msc /32 для 64-разрядной Windows, см. рисунок 1).

Рисунок 1. Запуск оснастки «Службы компонентов»

В узле Настройка DCOM найдите элемент Microsoft Excel Application(если хотите выполнять формирование документов Excel) или элемент Документ Microsoft Office Word 97 — 2003(если хотите выполнять формирование документов Word), нажмите правой кнопкой мыши и выберите пункт Свойства (см. рисунок 2).

Рисунок 2. Выбор приложения DCOM

Перейдите на вкладку Безопасность, установите пункт Настроить в секции Разрешения на запуск и активацию и нажмите на кнопку Изменить (см. рисунок 3).

Рисунок 3. Установка разрешения на запуск и аквтивацию

В открывшемся окне добавьте пользователя, от имени которого работает сервер 1С (для 1С версии 8.2 — USR1CV82, для версии 8.3 — USR1CV83), и разрешите ему все действия (см. рисунок 4).

Рисунок 4. Установка разрешений для пользователя системы

Далее создайте папку Desktop по адресу С:WindowsSystem32configsystemprofile для 32-разрядной Windows (C:WindowsSysWOW64configsystemprofile для 64-разрядной) если она не существует и наделите пользователя, от имени которого работает сервер 1С, полными правами доступа на эту папку. Для этого нажмите правой кнопкой на папку Desktop и выберите пункт Свойства. В окне свойств папки перейдите на вкладку Безопасность и нажмите Изменить (см. рисунок 5).

Рисунок 5. Настройка правд доступа к папке Desktop

В открывшемся окне добавьте пользователя, аналогичного для DCOM-приложения (см. рисунок 6).

Рисунок 6. Установка прав на папку для пользователя

Теперь COM-объект офисного пакета Microsoft Office должен создаваться на стороне сервера и формировать новый документ без всяких проблем.

Понравилась статья? Поделить с друзьями:
  • Создам документы в word 2007
  • Создам базу данных excel
  • Создал пароль на файл excel
  • Создал игру в excel
  • Создайте формулу вычисляющую время стоянки в населенном пункте excel