Содержание:
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С
Далее необходимо в файл шаблона для 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С
Информацию по методам 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 должен создаваться на стороне сервера и формировать новый документ без всяких проблем.