Иногда при сохранении документа возникает необходимость узнать его полное имя, включая путь и расширение. Это может понадобиться, например, для отправки файла по электронной почте или записи в базу данных. Если файл сохранён с помощью метода SaveAs(), то полное имя остаётся неизвестным, так как расширение добавляет сам Word. Однако из Word можно получить полное имя документа, так как у него есть свойство FullName, доступное для чтения:
ПолноеИмяФайла = Документ.FullName;
Некоторые советуют (что неправильно) завершать работу с СОМ-Объектом следующим образом:
Документ.Close(); Word.Quit(0);
На первый взгляд, ноль в качестве параметра метода Quit() может остаться незамеченным. Однако он весьма важен. Это всего лишь константа wdDoNotSaveChanges :-). Word действительно закроется, а Все файлы, которые пользователь мог открыть и редактировать.
Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет — закрыть:
Документ.Закрыть(); Если (Word.Documents.Count = 0) Тогда Word.Выйти(); КонецЕсли;
Удаление текста из документа 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 можно классифицировать на два типа: вставленные как символы текста и размещенные произвольно в графическом слое документа (обтекание текстом может применяться или отсутствовать в зависимости от каждого объекта). Первый тип изображений представляет собой объект InlineShape и находится в коллекции InlineShapes. Второй тип — это объект Shape, который доступен в коллекции Shapes документа. Для деловых документов нет смысла заниматься размещением изображений в графическом слое, достаточно использовать объекты InlineShape.
Принцип работы прост: ищем нужный якорь и заменяем его изображением:
Range = Документ.Range(); Range.Find.Execute("$[ЯкорьИзображения]$"); Range.Text = ""; Документ.InlineShapes.AddPicture (ИмяФайлаИзображения,,, Range);
Особенности работы с колонтитулами
Перебор всех колонтитулов выполняется так:
WdReplaceAll = 2; Для Каждого Раздела Из Документ.Sections Цикл Для Каждого Заголовка Из Раздел.Header Цикл Диапазон = Заголовок.Range; Диапазон.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла; Для Каждого Низ Заголовка Из Раздел.Footers Цикл Диапазон = Низ Заголовка.Range; Диапазон.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла КонецЦикла;
Более лаконичное решение заключается в использовании коллекции StoryRanges. Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:
Для каждого диапазона в Документ.StoryRanges выполнять цикл Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); Закончить цикл;
Объектная модель Ворд
Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие "объект" такое же как везде — программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.
Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном.
Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом "Для каждого" языка программирования 1С.
Полный список объектов можно, и нужно, смотреть в справочной системе Ворд (раздел справки по Вижуал Бейсику (VBA)). Для старых версий справка откроется локально на компьютере пользователя. Новые версии отправят на сайт Майкрософт: https://docs.microsoft.com/ru-ru/office/vba/api/overview/word/object-model Текст переведен с английского автоматически и местами понять написанное невозможно. Переключение на английский оригинал делается очень просто, достаточно нажать кнопочку "почитать на английском" в правом верхнем углу страницы. Или в адресе ссылки "ru-ru" заменить на "en-us": https://docs.microsoft.com/en-us/office/vba/api/overview/word/object-model
Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:
Document.SaveAs ("имя файла", wdFormatRTF)
Так как именованные константы недоступны за пределами VBA, код 1С будет выглядеть следующим образом:
Document.SaveAs ("имя файла", 6)
Или, без “магических” чисел, таким:
wdFormatRTF = 6; Document.SaveAs ("название файла", wdFormatRTF);
Я предпочитаю последний вариант.
Как в 1C загрузить из Word текст?
Рассмотрим приёмы получения статистической информации о документе, его составе и т.д.: ‘получить общее количество символов в активном документе ‘ (буквы, цифры, пробелы, переход на новую строку и т.д) WordApp.ActiveDocument.Characters.Count
‘получить символ по его индексу WordApp.ActiveDocument.Characters(14).Text ‘изменить символ по его индексу WordApp.ActiveDocument.Characters(14).Text="е" ‘можно несколько "еёе"
Только не забывайте, что заменив один символ несколькими, вы измените общее количество символов в документе. Поэтому осторожнее при применении циклов. Это также касается и следующего кода.
‘получаем количество слов в документе ‘(переход на новую строку считается словом) DocWord.Words.Count
‘получить слово по его индексу DocWord.Words(2).Text ‘изменить слово по его индексу DocWord.Words(2).Text="текст" ‘можно несколько слов "Новый текст"
‘получить количество параграфов (абзацев) в документе WordApp.ActiveDocument.Paragraphs.Count
‘получить текст параграфа по его индексу WordApp.ActiveDocument.Paragraphs(2).Range.Text ‘изменить текст параграфа по его индексу WordApp.ActiveDocument.Paragraphs(2).Range.Text="Много текста. Много " предложений. И так далее!"
‘узнать число предложений в файле WordApp.ActiveDocument.Sentences.Count
‘получить текст предложения по его индексу WordApp.ActiveDocument.Sentences(1).Text
‘получить количество предложений во втором параграфе WordApp.ActiveDocument.Paragraphs(2).Range.Sentences.Count
‘получить текст предложения 1 в параграфе 2 WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Text
‘получить текст слова 2, в предложении 1,в параграфе 2 WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Words(2).Text
‘добавить новую секцию (раздел) ‘создаёт новый раздел на новом листе DocWord.Sections.Add ‘создаёт новый раздел на текущем листе DocWord.Application.S_election.I_nsertBreak (wdSectionBreakContinuous) ‘(3)
‘получить количество секций в документе DocWord.Sections.Count
‘получить текст слова 2, в предложении 1,в параграфе 2, в секции 1. DocWord.Sections(1).Range.Paragraphs(1).Range.Sentences(1).Words(2).Text
Используя Встроенные_Свойства_Документа получаем его статистические данные.
‘получаем количество страниц (листов) в документе WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyPages) ‘(14)
‘узнаем общее число строк в документе WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyLines) ‘(23)
‘получаем количество слов в документе WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyWords) ‘(15)
‘получаем количество параграфов (абзацев) в документе WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyParas) ‘(24) ‘и т.д.
Рассмотрим примеры кода для передвижения по документу, а также поиска и замены текста. Метод .GoTo (перейти к) позволяет вам переместиться на нужную позицию в документе. Он при прямом вызове возвращает новую позицию курсора.
‘переход на лист с именем "1" ‘если не указать в конце .S_elect, то код просто выдаст положение курсора DocWord.Application.S_election.GoTo(wdGoToPage, , , "1").S_elect
wdGoToSection (0) — перейти к секции ; wdGoToPage (1) — перейти к листу ; wdGoToTable (2) — перейти к таблице ; wdGoToLine (3) — перейти к строке ; wdGoToFootnote (4) — перейти к сноске ; wdGoToEndnote (5) — к примечанию ; wdGoToComment (6) — к комментарию ; wdGoToField (7) — к полю ; wdGoToHeading (11) — к заголовку ; wdGoToSpellingError (13) — к орфографической ошибке ; wdGoToGrammaticalError (14) — к грамматической ошибке.
‘переход на лист с индексом 1 DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
‘переход в начало строки с индексом 1 DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
‘переход в начало следующей строки (аналогично текущий_индекс+1) DocWord.Application.S_election.GoTo(3, wdGoToNext, 1, "").S_elect
wdGoToNext (2) — на следующий ; wdGoToPrevious (3) — на предыдущий.
Осуществление поиска и замены: ‘выявляем первое появление текста и подчеркиваем его WordApp.Application.S_election.Find.Text = "строка" WordApp.Application.S_election.Find.Execute
‘находим первое вхождение текста WordApp.Application.S_election.Find.Text = "строка" ‘ и заменяем только его WordApp.Application.S_election.Find.Replacement.Text = "1 строчка" WordApp.Application.S_election.Find.Wrap = wdFindContinue WordApp.Application.S_election.Find.Execute Replace:= wdReplaceOne ‘(1)
‘или тоже самое, но другим способом (при повторном выполнении кода, заменится следующее слово) WordApp.ActiveDocument.Content.Find.Execute _ FindText:="текста", ReplaceWith:="hello", Replace:= wdReplaceOne ‘(1)
Для замены всех вхождений текста применяйте wdReplaceAll (2).




