1С: Работа с внешними файлами. Работа с Word (2 часть)

Jan 11, 2024 16:42

1С: Работа с внешними файлами. Работа с Word (1 часть)

Создание документа 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:\tmp\2.docx");

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

Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом SaveAs(), то полного имени мы не знаем, ведь расширение к имени файла добавил Ворд. Ну так из Ворда же полное имя можно получить, у документа есть доступное для чтения свойство FullName:

ПолноеИмяФайла = Документ.FullName;

Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:

Документ.Close();
Word.Quit(0);

На первый взгляд, можно и не заметить нолик в параметре метода Quit(). А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.

Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет - закрыть:

Документ.Close();
Если (Word.Documents.Count = 0) Тогда
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:\tmp\1.docx
Doc = Word.Documents.Open("C:\tmp\1.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();

Вставка картинок

Все картинки в документе Ворд делятся на два вида - вставленные как символ в текст и произвольно расположенные в графическом слое документа (текст их может либо обтекать, либо нет, зависит от параметров каждого объекта). Первый вид картинок представляется объектом InlineShape и доступен в коллекции InlineShapes. Второй вид - объектом Shape и доступен в коллекции Shapes документа. Для деловых документов возиться с размещением картинок в графическом слое нет смысла, достаточно объектов InlineShape.

Принцип прост, находим соответствующий якорь и заменяем его картинкой:

Range = Документ.Range();
Range.Find.Execute("$[ЯкорьКартинки]$");
Range.Text = "";
Документ.InlineShapes.AddPicture (ИмяФайлаКартинки,,, Range);

/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2

&НаКлиенте
Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону)

// В шаблоне уже расставлены поля с определенными
// именами, например, org_name, inn, kpp и т.д.
// Наша задача - заполнить эти поля и сохранить
// этот шаблон в виде вордовкского файла с
// расширением docx;

// Сам шаблон мы создали по инструкции отсюда:
// helpme1s.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s

// Или взяли готовым отсюда:
// helpme1s.ru/files/ref/bill.dotx

ПриложениеВорд = Новый COMОбъект("Word.Application");
ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону);

Для Каждого Поле Из ОбъектШаблон.Fields Цикл
ПолноеИмяПоля = Поле.Code.Text;

// Наши предопределенные поля имеют такой
// вид: " MERGEFIELD org_name \* MERGEFORMAT".
// Наша задача - вытащить из этой конструкции org_name
// (ну или другое имя, которое мы задали в ворде).

Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда
ПозицияСлеша = Найти(ПолноеИмяПоля, "\*");
КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12));

ЗначениеПоля = "";

Если КороткоеИмяПоля = "id" Тогда
ЗначениеПоля = "1";
ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда
ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ИначеЕсли КороткоеИмяПоля = "org_name" Тогда
ЗначениеПоля = "ООО ""Ромашка""";
ИначеЕсли КороткоеИмяПоля = "inn" Тогда
ЗначениеПоля = "1234567890";
ИначеЕсли КороткоеИмяПоля = "kpp" Тогда
ЗначениеПоля = "123456789";
Иначе
// ... и так все нужные поля
КонецЕсли;

Если ЗначениеПоля <> "" Тогда
Поле.Select();
ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля);
КонецЕсли;
КонецЕсли;
КонецЦикла;

// Запишем файл в папку "Мои документы" пользователя
ФайлДляЗаписи = КаталогДокументов() + "\helpme1c_ru_word_test.docx";

// Если такой файл уже существует - удалим его.
УдалитьФайлы(ФайлДляЗаписи);
// Сохраняем шаблон как документ Word с расширением docx.
ОбъектШаблон.SaveAs(ФайлДляЗаписи);
// Не забываем закрыть приложение Word.
ОбъектШаблон.Application.Quit();

Возврат ФайлДляЗаписи;

КонецФункции

Особенности работы с колонтитулами

Перебор всех колонтитулов выполняется так:

WdReplaceAll = 2;
Для Каждого Section Из Документ.Sections Цикл
Для Каждого Header Из Section.Headers Цикл
Range = Header.Range;
Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll);
КонецЦикла;
Для Каждого Footer Из Section.Footers Цикл
Range = Footer.Range;
Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll);
КонецЦикла
КонецЦикла;

Более лаконичное решение заключается в использовании коллекции StoryRanges. Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:

Для Каждого Range Из Документ.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);

Я предпочитаю последний вариант.

Значения всех констант нужно смотреть в справочной системе, там они объединены в смысловые группы, называемые "перечисления" (Enumerations): https://docs.microsoft.com/ru-ru/office/vba/api/word(enumerations)

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up