Работа с ком объектом word 1с

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

Вставка таблицы в документ 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();

Вставка таблицы в документ 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 = Истина;

Для открытия документа можно использовать два метода коллекции Documents. Первый — Open() приведен выше, второй — Add().

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

Метод Add() создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись «Документ1 — Word». При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение — документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод Add() можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.

Методы Open() и Add() являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции Documents нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:

Документ = Word.Documents.Open («C:готовые документыфайл.docx»);

Или

Документ = Word.Documents.Add («C:шаблоныфайл.docx»);

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

Пример преобразования документа 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();

Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом 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: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();

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

Все картинки в документе Ворд делятся на два вида — вставленные как символ в текст и произвольно расположенные в графическом слое документа (текст их может либо обтекать, либо нет, зависит от параметров каждого объекта). Первый вид картинок представляется объектом 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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Содержание:

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)!

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

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

Благодаря COM технологии в 1С:Предприятии есть возможность работать со сторонними приложениями. В частности для решения определенных задач может потребоваться использование документов Word. Для работы с документами созданными в приложении Word используется COM объект «Word.Application». Одной из главных задач при обработке и выводе файлов Word, является подстановка в текст собственных значений. Данную задачу можно решить как минимум двумя способами.

Способ 1
Поиск замена слов в документе.

Способ 2
Создание закладок и изменение текста закладок. Для создания закладок в приложении Word необходимо выделить текст на который устанавливается закладка и перейти в меню Вставка->Закладка и в открывшемся окне создать закладку.

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

В данном примере файл хранится в макете с типом «ДвоичныеДанные». Если файл хранится на дисковом накопителе, то создание временного файла не потребуется.

Процедура ЗаполнитьИВывестиWord()Попытка
Word = Новый COMОбъект("Word.Application");
Word.Visible = 1;
Исключение
Сообщить("Не удалось создать объект Word");
Возврат;
КонецПопытки;//Помещение макета во временный файл
ДвоичныеДанные = ПолучитьМакет("МакетДвоичныеДанные");
ИмяФайла = ПолучитьИмяВременногоФайла("docx");
ДвоичныеДанные.Записать(ИмяФайла);Попытка//Добавление файла в объект Word
ДокументWord = Word.Documents.Add(ИмяФайла);//Изменение текста закладок
ОбластьВорд = ДокументWord.Bookmarks("Номер").Range();
ОбластьВорд.Text = "000001";//ИЛИ

//Поиск и замена слов
Замена = ДокументWord.Content.Find;
Замена.Execute("Номер",,,,,,,,, "000001", 2); Исключение

Word

.Quit(0);КонецПопытки;//Временные файлы рекомендуется удалять самостоятельно
УдалитьФайлы(ИмяФайла);КонецПроцедуры

В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.

Код 1C v 8.х

 
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт

Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;

Doc = Объект.Application.Documents(1);
Doc.Activate();

// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;

// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"

Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");

// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";

// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо

// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");

Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки

// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();

// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);

// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;

// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";

// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;

// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;

// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;

Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;

Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;

Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры

Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия — с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word’а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.

Код 1C v 8.х

 Процедура ВыполнитьОбработку() Экспорт

Попытка

//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:UsersNKrylovDesktopТест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;

ThisDocument = Word.Documents(1);
ThisDocument.Activate();

// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;

// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;

// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);

// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию

// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();

// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;

Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;

// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);

// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();

// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)

// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);

// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка

// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));

// Перейдем в конец текста
S_election.EndKey(6);

// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:UsersNKrylovDesktopНовый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;

// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...

ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;

КонецПроцедуры

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Работа с ком объектом excel
  • Работа с колонтитулами в текстовом редакторы word
  • Работа с колонтитулами в текстовом редакторе word
  • Работа с колонтитулами в документе word
  • Работа с колонтитулами в word 2007 что это такое

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии