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

Формирование документов Word из «1С Предприятие 7.7»

Иногда в самописных конфигурациях «1С:Предприятие 7.7» возникает необходимость в программном формировании каких-то текстовых документов: справок, типовых договоров, приложений к договорам и т.п. Поскольку сформировать отформатированный по всем правилам документ с использованием встроенного текстового редактора невозможно, то следует воспользоваться имеющимся на любом компьютере текстовым процессором Microsoft Word.

Контекст работы с приложением Microsoft Word

Во всех программных модулях вызов процедур или функций внешнего приложения может выполняться только при помощи переменной со ссылкой на OLE-объект, который создаётся функцией СоздатьОбъект() (англоязычный синоним — CreateObject()). Чтобы вызвать метод внешнего приложения, имя метода (с указанием необходимых параметров) пишется через точку после идентификатора данной переменной.

При создании переменной со ссылкой на приложение Microsoft Word, в качестве имени объекта в операторе СоздатьОбъект() должен выступать уникальный OLE-идентификатор "Word.Application". Например:

Процедура СформироватьВыходнуюФорму()

   Попытка
      // Пытаемся обратиться к MS Word
      Word = СоздатьОбъект("Word.Application");
   Исключение
      // Если MS Word не установлен на ПК
      Предупреждение(ОписаниеОшибки() + "; MS Word не установлен на компьютере!");
      Word = 0;
      Возврат;
   КонецПопытки;

   // Формируем выходную форму в MS Word
     . . .

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

При инициализации данного OLE-объекта с помощью функции СоздатьОбъект() мы получаем ссылку на главный элемент объектной модели приложения MS Word — объект Application, а следовательно, можем использовать его собственные свойства и методы непосредственно. Чтобы обратиться к свойству или методу объекта Application достаточно записать имя свойства или метода через точку после имени нашей переменной, например:

// Проверим версию MS Word
ВерсияWord = Word.Version;

Примечание: Иногда в исходных текстах программ можно встретить запись типа Word.Application.Version. Данная запись аналогична записи приведённой в примере выше, но избыточна. Ссылка на объект Application здесь указана явно, что, в общем-то, является лишним.

Что нужно знать об объекте Application

Как уже было сказано ранее, объект Application является главным элементом объектной модели приложения MS Word. Его свойства и методы позволяют управлять самим приложением и получать от него необходимую для работы информацию.

О методах объекта Application, необходимых для работы с приложением, мы поговорим попозже, а вот свойства объекта, которые могут Вам потребоваться при написании процедур, приведены ниже.

ActiveDocument — доступное только для чтения свойство, содержащее ссылку на активный документ. Если открытых документов на компьютере нет, обращение к свойству вызывает ошибку.

Build — доступное только для чтения свойство, содержащее информацию о версии и номере сборки приложения MS Word.

DisplayAlerts — свойство позволяющее подавить вывод ошибок и диалоговых окон при работе макросов и приложений VBA. Во многих ситуациях без него просто не обойтись. Особенно часто прибегать к этому свойству требуется, когда в ходе работы программы необходимо что-нибудь удалить или закрыть без сохранения. Возможные значения, принимаемые данным свойством:

  • 0 — оповещения или окна сообщений не отображаются. Если макрос обнаруживает окно сообщения, выбирается значение по умолчанию и макрос продолжается;
  • −1  — отображаются все окна сообщений и оповещения; ошибки возвращаются в макрос;
  • −2  — отображаются только окна сообщений; ошибки перехватываются и возвращаются в макрос.

Documents — доступное только для чтения свойство, содержащее ссылку на коллекцию Documents, которая представляет все открытые в приложении документы. Посредством свойств и методов объекта Documents осуществляется работа с уже открытыми документами, открытие ещё не открытых и создание новых.

Пример использования свойства:

Word = СоздатьОбъект("Word.Application");
// Открываем указанный файл документа
Файл = КаталогИБ() + "ExtForms\readme.doc";
Документ = Word.Documents.Open(Файл);

// Начинаем работать с документом
  . . .

ScreenUpdating — свойство объекта Application, позволяющее запретить перерисовку экрана (если значение свойства установить в false). Обычно оно используется для ускорения работы длинных процедур, которые выводят что-то на экран. После завершения такой процедуры свойство следует установить в true.

Примечание: Если при отключенной перерисовке экрана требуется какое-то действие показать, следует вызвать метод ScreenRefresh() объекта Application. Данный метод обновляет экран, а точнее, включает обновление экрана только для одной команды, а затем немедленно отключает его.

Selection — доступное только для чтения свойство, возвращающее объект Selection для активного в данный момент документа. Этот объект представляет выделенную вручную или программно область текста либо точку вставки (местоположение текстового курсора), когда ничего не выделено и не выбрано.

Примечание: В области окна документа может быть только один объект Selection, и только один объект Selection во всем приложении может быть активным.

Version — доступное только для чтения свойство, возвращающее номер версии MS Word. Для Microsoft Word 2003, например, свойство возвращает значение "11.0", для Microsoft Word 2007 — "12.0".

Visible — свойство, позволяющее сделать все окна приложения MS Word видимыми или невидимыми. Для этого свойству необходимо задать значение true или false. Если окна приложения сделать невидимыми, невидимыми становятся также и кнопки этих окон на Панели задач (кнопка запуска приложения, закреплённая на Панели задач, при этом остаётся видимой).

По умолчанию свойство имеет значение false, поэтому при программном открытии или создании документа после отработки соответствующих команд (Add() или Open()) окно приложения на экране не появляется. Для вывода окна на экран необходимо принудительно задать свойству Visible значение true. Однако если на экране в момент создания или открытия окна программным способом присутствуют окна вёрдовских документов, открытых ранее «вручную» (с помощью команды меню или ярлыка), окно программно создаваемого или открываемого документа появляется на экране сразу же (то есть в момент отработки команды Add() или Open()).

На практике многие разработчики предпочитают принудительно присваивать свойству Visible значение false в самом начале процедуры формирования нового или обработки имеющего документа (см. пример ниже). Это делается для того, чтобы пользователь не видел то, что ему видеть и не надо, а главное, чтобы не мог случайно вмешаться в процесс (это особенно актуально при использовании в программном коде свойств и методов объекта Selection). Лишь после завершения всех действий по формированию документа свойству Visible возвращается значение true, и окно готовой печатной формы появляется на экране, а вместе с ним и окна других ранее открытых, но принудительно скрытых документов.

Word = СоздатьОбъект("Word.Application");
// Убираем все окна MS Word с экрана
Word.Visible = 0;
// Создаём новый документ
Документ = Word.Documents.Add();

// Формируем текстовое содержимое документа
  . . .

// Возвращаем все окна MS Word на экран
Word.Visible = -1;

Стоит ли скрывать ли окно приложения на время формирования нового документа или нет — это решать Вам. Но при отладке процедуры окно приложения скрывать точно не следует — легче будет выявить допущенные в коде ошибки и недочёты.

Примечание: При использовании кода VBA в сторонних приложениях в свойствах и методах вместо логических значений true и false следует использовать числовые значения −1 (минус единица) и 0.

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

Создать новый документ MS Word позволяет метод Add() коллекции Documents.

Синтаксис метода:

Add([<Template>], [<NewTemplate>], [<DocumentType>], [<Visible>])

где

  • <Template> — полное имя файла шаблона, который будет использоваться для нового документа. Если параметр опущен, используется шаблон Normal.dot;
  • <NewTemplate> — флаг создания шаблона. Если указать значение true, документ будет открыт для создания нового шаблона. Значением по умолчанию является false;
  • <DocumentType> — тип создаваемого документа. Возможные значения параметра: 0 — пустой документ (значение по умолчанию), 1 — веб-страница; 2 — Email сообщение; 3 — документ с рамками; 4 — XML-документ;
  • <Visible> — флаг видимости окна документа. Если указать false, Word открывает документ, но не выводит на экран (для свойства Visible окна документа будет установлено значение false). Значением по умолчанию является true.

Будучи вызванным без параметров, метод Add() создаёт новый пустой документ, беря за основу шаблон Normal.dot. Чтобы программным способом заполнять текстом такой документ, потребуется очень большой объём кода, а потому формирование всей печатной формы «с нуля» программным способом на практике никогда не используется.

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

Для создания документа на основании шаблона полное имя этого шаблона необходимо передать методу в качестве параметра. Например:

Word = СоздатьОбъект("Word.Application");
// Создаём новый документ, используя шаблон-заготовку
ФайлШаблона = КаталогИБ() + "ExtForms\PrnForms\dogovor.doc";
Документ = Word.Documents.Add(ФайлШаблона);

// Начинаем заполнять реквизиты документа
   . . .

Возвращаемым значением метода Add() является ссылка на созданный документ, то есть на конкретный объект Document, являющийся экземпляром коллекции Documents. Присвоив данную ссылку переменной (см. пример выше), мы получаем возможность в дальнейшем при необходимости использовать свойства и методы этого объекта. Например, после завершения формирования печатной формы, используя метод UndoClear() объекта Document, мы сможем очистить буфер отмены изменений, чтобы действия программы не отображались в списке возможных отмен кнопки «Отменить» (см. рис. ниже), и чтобы пользователь не имел возможности «откатить» эти действия.

Список возможных отмен
  . . .

// Очищаем буфер отмены изменений
Документ.UndoClear();
// Возвращаем все окна MS Word на экран
Word.Visible = -1;

Объекты для работы с текстом документа

Для работы с текстом формируемого документа могут использоваться свойства и методы объектов Selection, Range и Bookmark. Рассмотрим вкратце эти объекты.

Объект Bookmark

Объект Bookmark — это просто закладка. На этапе создания шаблона печатной формы закладки в документе создаются с помощью с помощью соответствующей кнопки на вкладке «Вставка» (см. рис. ниже). В старых же версиях MS Office установка закладок производится через меню: «Вставка -> Закладка».

Кнопка вставки закладки

Использование объекта Bookmark при работе с текстом документа из программного кода имеет определённые преимущества, но, тем не менее, используется данный объект разработчиками довольно редко в силу его ограниченной функциональности. Свойств и методов у этого объекта намного меньше, чем у объектов Selection и Range. Поэтому при его использовании постоянно приходится обращаться к свойствам и методам последних, благо из объекта Bookmark очень просто получить объект Selection (при помощи метода Select()) или объект Range (при помощи одноимённого свойства Range).

Объект Selection

Объект Selection, как я уже говорил ранее, представляет выделенный участок текста или место вставки (текстовый курсор), если ничего не выделено. Использовать свойства и методы объекта Selection для работы с текстом документа проще всего и нагляднее. Поскольку в любом вновь открытом или созданном документе место вставки (текстовый курсор) по умолчанию располагается в самом начале документа, после открытия документа можно сразу же приступать к выполнению последовательности операций с текстом, используя свойства и методы объекта. Например:

Word = СоздатьОбъект("Word.Application");
// Создаём новый чистый документ
Документ = Word.Documents.Add();

// Начинаем заполнение документа

// Устанавливаем выравнивание текста по центру
Word.Selection.ParagraphFormat.Alignment = 1;
// Устанавливаем тип шрифта
Word.Selection.Font.Name = "Arial";
// Устанавливаем размер шрифта
Word.Selection.Font.Size = 14;
// Устанавливаем подчёркивание
Word.Selection.Font.Underline = 1;
// Вставляем текстовое содержимое
Word.Selection.Text = "С П Р А В К А";
// Перемещаем курсор в конец выделения
Word.Selection.EndOf();
// Создаём новый абзац
Word.Selection.TypeParagraph();
// Меняем выравнивание текста
Word.Selection.ParagraphFormat.Alignment = 3;
// Меняем размер шрифта
Word.Selection.Font.Size = 10;
// Отменяем подчёркивание текста
Word.Selection.Font.Underline = 0;
// Вставляем текстовое содержимое
Word.Selection.Text = "Сотрудник " + ФИО;
// Перемещаем курсор в конец выделения
Word.Selection.EndOf();

  . . .

Однако из-за того, что местоположение объекта Selection и ссылка на него в одноимённом свойстве могут быть переопределены не только программно, но и вручную, при использовании данного объекта можно столкнуться с определёнными проблемами. Например, если слишком нетерпеливый пользователь во время выполнения процедуры заполнения печатной формы переключится на окно создаваемого документа и щёлкнет по нему мышкой или же сделает активным окно другого открытого ранее документа, весь сценарий заполнения печатной формы может пойти наперекосяк, и результат будет непредсказуемым.

В какой-то мере защитится от вмешательства пользователя в процесс помогает свойство Visible объекта Application, позволяющее на время выполнения процедуры скрыть все окна MS Word и убрать с Панели задач кнопки этих окон. Однако нет никакой гарантии, что пользователю в этот момент не придёт вдруг в голову мысль начать создавать какой-то новый документ через стартовое меню Windows или открыть какой-нибудь из имеющихся на диске через Проводник. Окно приложения при этом не появится, но активным станет другой экземпляр коллекции Documents, и ссылка в свойстве Selection изменится.

Полностью избавиться от вмешательства пользователя в процесс формирования печатной формы позволяет использование объекта Range.

Объект Range

Объект Range — это объект, который можно определить только программно, независимо от текущего положения текстового курсора и действий пользователя. Объект представляет непрерывный фрагмент текста в документе. Если в таком фрагменте не содержится ни одного символа, объект представляет просто указатель места для ввода текста.

В отличие от объекта Selection, который в документе может быть только в единственном экземпляре, объектов Range в документе быть создано сколько угодно.

Большая часть свойств и методов объект Range совпадает с аналогичными свойствами и методами объекта Selection.

Как вставить данные в шаблон-заготовку

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

Объект Find, ссылку на который можно получить из одноимённого свойства объектов Selection и Range, представляет собой «упакованные» условия поиска. У него множество свойств, которые позволяют определить эти условия. Для запуска поиска используется метод Execute() со множеством необязательных параметров, дублирующих свойства объекта Find, а параметр <ReplaceWith> метода позволяет выполнить ещё и замену найденного фрагмента текста, не прибегая к использованию дополнительных объектов и методов.

Синтаксис метода Execute():

Execute([<FindText>], [<MatchCase>], [<MatchWholeWord>],
        [<MatchWildcards>], [<MatchSoundsLike>], [<MatchAllWordForms>],
        [<Forward>], [<Wrap>], [<Format>],
        [<ReplaceWith>], [<Replace>], [<MatchKashida>],
        [<MatchDiacritics>], [<MatchAlefHamza>], [<MatchControl>])

где

  • <FindText> — образец текста для поиска. Можно искать специальные символы, указав коды соответствующие символам. Например, "^p" соответствует знаку абзаца, а "^t" соответствует символу табуляции. Для поиска только форматирования следует указать пустую строку ("");
  • <MatchCase> — чувствительность к регистру символов. Возможные значения: true — учитывать регистр символов; false — не учитывать;
  • <MatchWholeWord> — флаг «искать слово целиком». Возможные значения: true — искать только целые слова; false — допускается поиск текста, который является частью большего слова;
  • <MatchWildcards> — флаг использования подстановочных символов (операторов типа "*", "*ing" и т.п.). Возможные значения: true — допускается использование подстановочных символов; false — не допускается;
  • <MatchSoundsLike> — флаг поиска созвучных слов. Возможные значения: true — искать слова, похожие на текст поиска; false — не искать похожих слов;
  • <MatchAllWordForms> — флаг «искать словоформы». Возможные значения: true — искать все формы текста поиска (например, «сидеть» обнаруживает «сидение» и «сидящий»); false — не искать другие формы слов;
  • <Forward> — направление поиска. Возможные значения: true — к концу документа; false — к началу документа;
  • <Wrap> — параметр определяющий действие в случае, если поиск был начат не с начала документа и достигнут его конец. Возможные значения: 0 — операцию поиска завершить; 1 — операцию поиска продолжить с начала документа; 2 — запросить подтверждение пользователя для продолжения поиска;
  • <Format> — флаг поиска формата. Возможные значения: true — искать формат в дополнение или вместо поиска текста; false — игнорировать формат;
  • <ReplaceWith> — замещающий текст (до 255 символов). Также как и в <FindText> здесь можно использовать коды специальных символов. Для вставки графического объекта или другого нетекстового элемента следует указать "^c", а сам элемент предварительно поместить в буфер обмена. Для удаления найденного текста и в случае поиска только формата используется пустая строка ("");
  • <Replace> — количество замен в операциях поиска и замены. Возможные значения: 0 — не заменять; 1 — выполнить одну замену; 2 — заменять все найденные;
  • <MatchKashida>, <MatchDiacritics>, <MatchAlefHamza>, <MatchControl> — параметры, используемые только для поиска в документах на арабском языке. При отсутствии в MS Word соответствующей поддержки параметры недоступны.

Возвращаемым значением метода является значение true, если поиск выполнен успешно, или false, если ничего не найдено.

Примечание: При использовании кода VBA в сторонних приложениях в свойствах и методах вместо логических значений true и false следует использовать числовые значения −1 (минус единица) и 0.

Пример использования метода Execute():

Word = СоздатьОбъект("Word.Application");
// Убираем все окна MS Word с экрана
Word.Visible = 0;
// Создаём новый документ, используя шаблон-заготовку
ФайлШаблона = КаталогИБ() + "ExtForms\PrnForms\dogovor.doc";
Документ = Word.Documents.Add(ФайлШаблона);

// Заполняем реквизиты документа

// Вставляем дату договора
ДатаДог = "" + НРег(Формат(РабочаяДата(), "Д (0)ДДММММГГГГ"));
Word.Selection.Find.Execute("dat_dog", -1, -1, 0, 0, 0, -1, , 0, ДатаДог, 2);
// Вставляем название орагнизации
Организация = СокрЛП(Константа.ПолноеНаименованиеОрганизации;
Word.Selection.Find.Execute("our_org", -1, -1, 0, 0, 0, -1, , 0, Организация, 2);
// Вставляем Ф.И.О. руководителя
Руководитель = СокрЛП(Константа.Руководитель);
Word.Selection.Find.Execute("gen_men", -1, -1, 0, 0, 0, -1, , 0, Руководитель, 2);

   . . .

В данном примере с помощью метода Execute() объекта Find в документ, созданный на основе шаблона-заготовки, производится вставка конкретных значений реквизитов вместо идентификаторов этих реквизитов ("dat_dog", "our_org", "gen_men"). В качестве таких идентификаторов в шаблоне-заготовке можно использовать любые сочетания символов, отличающиеся от основного текста документа. В случае использования сочетания кириллических символов их лучше заключать в квадратные скобки ("[Дата]", "[ФИО]" и т.п.) во избежание случайных срабатываний.

Ещё один похожий пример:

Word = СоздатьОбъект("Word.Application");
// Создаём документ на основе шаблона-заготовки
ФайлШаблона = КаталогИБ() + "ExtForms\PrnForms\dogovor.doc";
Документ = Word.Documents.Add(ФайлШаблона);
// Получаем объект "Range", представляющий всё содержимое документа
Контент = Документ.Content;


// Заполняем реквизиты документа

// Вставляем дату договора
ДатаДог = "" + НРег(Формат(РабочаяДата(), "Д (0)ДДММММГГГГ"));
Контент.Find.Execute("dat_dog", -1, -1, 0, 0, 0, -1, , 0, ДатаДог, 2);
// Вставляем название орагнизации
Организация = СокрЛП(Константа.ПолноеНаименованиеОрганизации;
Контент.Find.Execute("our_org", -1, -1, 0, 0, 0, -1, , 0, Организация, 2);
// Вставляем Ф.И.О. руководителя
Руководитель = СокрЛП(Константа.Руководитель);
Контент.Find.Execute("gen_men", -1, -1, 0, 0, 0, -1, , 0, Руководитель, 2);

  . . .

В отличие от первого примера, в данном примере для работы с текстом используется объект Range, представляющий всё текстовое содержимое документа (за исключением колонтитулов, сносок, комментариев и т.п.), которое он получает из свойства Content объекта Document.

Как формируется и заполняется табличная часть документа

Если в документе имеются какие-то таблицы, для получения доступа к этим таблицам используется объект Tables, представляющий коллекцию таблиц в выделенном фрагменте, диапазоне или во всём документе. Ссылку на объект можно получить из одноимённого свойства объектов Selection, Range и Document соответственно.

Для обращения к конкретной таблице по её порядковому номеру (то есть к конкретному объекту Table) можно использовать метод Item() коллекции Tables:

// Получаем доступ ко второй таблице документа
НашаТаблица = Документ.Tables.Item(2);

либо более простую запись:

// Получаем доступ ко второй таблице документа
НашаТаблица = Документ.Tables(2);

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

Получить доступ к конкретной ячейке таблицы позволяет метод Cell() объекта Table. В качестве параметров методу передаются координаты ячейки — порядковые номера строки и столбца, на пересечении которых находится данная ячейка.

Ниже приведён пример заполнения таблицы размером 5х4 (одна строка заголовочная). Данные в таблицу переносятся из таблицы значений соответствующего размера.

// Получаем доступ к первой таблице документа
Таблица = Документ.Tables(1);

Для НомСтроки=1 По 3 Цикл
   Для НомСтолбца=1 По 5 Цикл
      // Выбираем значение из таблицы значений
      Значение = Строка(ТЗ.ПолучитьЗначение(НомСтроки, НомСтолбца));
      // Вставляем значение в соответствующую ячейку таблицы документа
      сУчетомЗаголовка = НомСтроки + 1;
      Таблица.Cell(сУчетомЗаголовка, НомСтолбца).Range.InsertAfter(Значение);
   КонецЦикла;
КонецЦикла;

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

Шаблон таблицы

Для добавления новых строк в таблицу используется метода Add() объекта Rows. Будучи вызванным без параметров, данный метод добавляет новую строку в конец таблицы. Получить же ссылку на объект Rows, представляющий коллекцию строк таблицы, можно из одноимённого свойства объекта Table.

Пример заполнения таблицы, содержащей 5 столбцов и неизвестное заранее количество строк:

// Получаем доступ к первой таблице документа
Таблица = Документ.Tables(1);

КоличествоСтрок = ТЗ.КоличествоСтрок();

Для НомСтроки=1 По КоличествоСтрок Цикл
   Для НомСтолбца=1 По 5 Цикл
      // Выбираем значение из таблицы значений
      Значение = Строка(ТЗ.ПолучитьЗначение(НомСтроки, НомСтолбца));
      // Вставляем значение в соответствующую ячейку таблицы документа
      сУчетомЗаголовка = НомСтроки + 1;
      Таблица.Cell(сУчетомЗаголовка, НомСтолбца).Range.InsertAfter(Значение);
   КонецЦикла;
   Если НомСтроки<КоличествоСтрок Тогда
      // Добавляем новую строку в таблицу документа
      Таблица.Rows.Add();
   КонецЕсли;
КонецЦикла;

Если таблица, количество строк которой будет меняться в зависимости от условий задачи, должна содержать ещё и итоговую строку, то такая итоговая строка также должна присутствовать шаблоне документа (см. рис. ниже).

Шаблон таблицы

Новые строки в такую таблицу будут добавляться всё также с помощью метода Add(), но при этом в качестве параметра методу должна передаваться ссылка на экземпляр коллекции Rows, представляющий строку, перед которой будет вставляться новая.

Важно! Поскольку Word при этом за образец строки для вставки берёт строку, указанную в параметре метода, то вставлять новую строку в таблицу необходимо перед имеющейся в шаблоне строкой для данных.

Пример заполнения таблицы с итоговой строкой:

// Получаем доступ к первой таблице документа
Таблица = Документ.Tables(1);

КоличествоСтрок = ТЗ.КоличествоСтрок();

Для НомСтроки=1 По КоличествоСтрок Цикл
   сУчетомЗаголовка = НомСтроки + 1;
   Если НомСтроки<КоличествоСтрок Тогда
      // Добавляем новую строку в таблицу документа
      ВставитьПеред = Таблица.Rows(сУчетомЗаголовка);
      Таблица.Rows.Add(ВставитьПеред);
   КонецЕсли;
   Для НомСтолбца=1 По 5 Цикл
      // Выбираем значение из таблицы значений
      Значение = Строка(ТЗ.ПолучитьЗначение(НомСтроки, НомСтолбца));
      // Вставляем значение в соответствующую ячейку таблицы документа
      Таблица.Cell(сУчетомЗаголовка, НомСтолбца).Range.InsertAfter(Значение);
   КонецЦикла;
КонецЦикла;

// Заполняем итоговую строку
Итого = ТЗ.Итог(5);
Таблица.Cell(сУчетомЗаголовка+1, 2).Range.InsertAfter(Итого);

Включение режима предварительного просмотра документа

После того, как печатная форма будет сформирована, пользователь при необходимости сам может перевести документ в режим предварительного просмотра. Но иногда это необходимо сделать программно, не запрашивая подтверждения у пользователя.

Программно перевести документ в режим предварительного просмотра позволяет метод PrintPreview() объекта Document:

// Переводим документ в режим предпросмотра
Документ.PrintPreview();

Примечание: Определить, находится ли приложение в режиме предварительного просмотра, позволяет свойство PrintPreview объекта Application. Если режим предварительного просмотра включен, то значением свойства является true. Кстати, данное свойство можно также использовать в качестве альтернативы методу PrintPreview(): задавая свойству значения true или false можно включать или отключать режим предварительного просмотра для активного окна.

Печать документа

Необходимость отправлять документ на печать программным способом может возникнуть только в том случае, если не требуется контроль со стороны пользователя за правильностью заполнения документа. Для отправки документа на печать используется метод PrintOut() объекта Document. Будучи вызванным без параметров, данный метод отправляет весь документ (то есть все страницы) на принтер, используемый в системе по умолчанию.

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

// Отправляем документ на печать
Документ.PrintOut();

Синтаксис метода:

PrintOut([<Background>], [<Append>], [<Range>], [<OutputFileName>],
         [<From>], [<To>], [<Item>], [<Copies>], [<Pages>], [<PageType>],
         [<PrintToFile>], [<Collate>], [<FileName>], [<ActivePrinterMacGX>],
         [<ManualDuplexPrint>], [<PrintZoomColumn>], [<PrintZoomRow>],
         [<PrintZoomPaperWidth>], [<PrintZoomPaperHeight>])

где

  • <Background> — логическое значение (true или false), указывающее следует ли продолжать выполнение программного кода, в то время, когда принтер печатает документ;
  • <Append> — параметр указывающий, следует ли добавить содержимое данного документа к содержимому файла, указанного в параметре <OutputFileName>, (значение true) или следует перезаписать содержимое этого файла (значение false);
  • <Range> — диапазон печатаемых страниц. Возможные значения: 0 — печатать весь документ; 1 — печатать выделенное; 2 — печатать текущую страницу; 3 — печатать страницы с номера, указанного в <From>, по номер, указанный в <To>; 4 — печатать диапазон страниц, указанный в <Pages>;
  • <OutputFileName> — путь и имя выходного файла, если печать осуществляется в файл (в <PrintToFile> установлено true);
  • <From> — номер начальной страницы диапазона печати, когда в <Range> установлено 3;
  • <To> — номер конечной страницы диапазона печати, когда в <Range> установлено 3;
  • <Item> — элементы для печати. Возможные значения: 0 — печатать документ; 1 — печатать сведения; 2 — печатать комментарии; 3 — печатать стили; 4 — печатать список автоподстановок; 5 — печатать сочетания клавиш; 6 — печатать стандартные блоки; 7 — печатать документ с пометками;
  • <Copies> — количество копий для печати;
  • <Pages> — номера страниц и диапазоны страниц для печати, разделённые запятыми. Например, "2, 6-10". Используется, когда в <Range> установлено 4;
  • <PageType> — тип страниц для печати. Возможные значения: 0 — все страницы диапазона; 1 — нечётные страницы; 2 — чётные страницы;
  • <PrintToFile> — флаг печати в файл;
  • <Collate> — режим печати копий. Установите true для печати всех страниц документа перед печатью следующей копии;
  • <FileName> — полное имя файла для печати (когда метод используется для объекта Application). Если параметр опущен, MS Word печатает активный документ;
  • <ActivePrinterMacGX> — параметр используется только в MS Office Macintosh Edition;
  • <ManualDuplexPrint> — флаг режима двусторонней печати. Параметр может быть недоступен на локализованных версиях;
  • <PrintZoomColumn> — количество страниц, которые вы хотите расположить по горизонтали на одном листе. Может быть 1, 2, 3 или 4. Используйте с параметром <PrintZoomRow> для печати нескольких страниц на одном листе;
  • <PrintZoomRow> — количество страниц, которые вы хотите расположить по вертикали на одном листе. Может быть 1, 2 или 4. Используйте с параметром <PrintZoomColumn> для печати нескольких страниц на одном листе;
  • <PrintZoomPaperWidth> — ширина, на которую MS Word должен печатать печатные страницы, в twips (20 twips = 1 point; 72 points = 1 inch);
  • <PrintZoomPaperHeight> — высота, на которую MS Word должен печатать печатные страницы, в twips (20 twips = 1 point; 72 points = 1 inch).

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

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

Если работа ведётся с ранее созданным и сохранённым на диске документом, который был открыт методом Open(), то сохранить изменения позволяет метод Save() объекта Document. Параметры у метода отсутствуют.

Пример использования:

Word = СоздатьОбъект("Word.Application");
Документ = Word.Documents.Open("D:\DBase\doc1.doc");

// вносим какие-то изменения в содержимое документа
  . . .

Если Документ.Saved = 0 Тогда
   // Сохраняем изменения на диске
   Документ.Save();
КонецЕсли;

Если метод Save() вызвать для вновь созданного документа, то при вызове метода открывается диалоговое окно «Сохранить как…».

Примечание: Свойство Saved объекта Document устанавливается в false, когда в документ вносятся изменения. Именно по значению этого свойства приложение определяет, выводить ли окно сохранения документа перед закрытием приложения.

Если необходимо закрыть документ, не сохраняя его на диске, следует установить свойство Saved в true. Тогда приложение MS Word не будет выводить на экран диалоговых окон с предложением сохранить документ.

Сохранить вновь созданный документ на диске под указанным именем позволяет метод SaveAs() объекта Document (в некоторых версиях MS Office, например, в Office 2010 метод называется SaveAs2()). У метода достаточно большое количество необязательных параметров, из которых обычно используется лишь первый.

Пример использования:

// Сохраняем документ под указанным именем
Документ.SaveAs("D:\DBase\dogovor.doc");

Синтаксис метода SaveAs():

SaveAs([<FileName>], [<FileFormat>], [<LockComments>], [<Password>],
        [<AddToRecentFiles>], [<WritePassword>], [<ReadOnlyRecommended>],
        [<EmbedTrueTypeFonts>], [<SaveNativePictureFormat>],
        [<SaveFormsData>], [<SaveAsAOCELetter>], [<Encoding>],
        [<InsertLineBreaks>], [<AllowSubstitutions>], [<LineEnding>],
        [<AddBiDiMarks>], [<CompatibilityMode>])

где

  • <FileName> — имя, под которым документ будет сохранён. По умолчанию используется текущая папка и старое имя файла. Если документ никогда не сохранялся, используется имя по умолчанию (например, Doc1.doc). Если документ с указанным именем файла уже существует, документ перезаписывается без запроса пользователя;
  • <FileFormat> — формат, в котором будет сохранён документ. Возможные значения: 0 — формат двоичного файла Microsoft Office Word 97-2013; 1 — формат шаблона MS Word; 2 — текстовый формат Microsoft Windows; 3 — текстовый формат Windows с сохраненными разрывами строк; 4 — текстовый формат Microsoft DOS; 5 — текст Microsoft DOS с сохраненными разрывами строк; 6 — формат форматированного текста (RTF); 7 — формат закодированного текста; 8 — стандартный формат HTML; 9 — формат web-архива; 10 — отфильтрованный формат HTML; 11 — формат языка разметки XML; 12 — формат XML-документа; 13 — формат XML-документа с включенными макросами; 14 — формат шаблона XML; 15 — формат шаблона XML с включенными макросами; 16 — формат файла документа MS Word по умолчанию (для Word последних версий это формат DOCX); 17 — формат PDF; 18 — формат XPS; 19 — формат OpenXML, сохранённый в виде одного XML-файла; 20 — формат открытого XML-файла с включенными макросами, сохраненными в виде одного XML-файла; 21 — формат шаблона Open XML, сохраненный в виде одного XML-файла; 22 — формат шаблона Open XML с включенными макросами, сохраненными в виде одного XML-файла; 23 — формат текста OpenDocument; 24 — строгий формат документа Open XML. Чтобы сохранить документ в другом формате, укажите соответствующее значение для свойства SaveFormat объекта FileConverter;
  • <LockComments> — блокировка документа для комментариев. Значение по умолчанию — false. Для блокировки необходимо задать true;
  • <Password> — строка пароля для открытия документа;
  • <AddToRecentFiles> — добавлять ли документ в список недавно использовавшихся файлов в меню «Файл». Значение по умолчанию — true;
  • <WritePassword> — строка пароля для сохранения изменений в документе;
  • <ReadOnlyRecommended> — предлагать состояние только для чтения при открытии документа. Значение по умолчанию — false;
  • <EmbedTrueTypeFonts> — сохранять шрифты TrueType в документе (при значении true). Если параметр опущен, значение берётся из свойства EmbedTrueTypeFonts объекта Document;
  • <SaveNativePictureFormat> — если графика была импортирована с другой платформы (например, Macintosh), значение true используется для сохранения только версии импортированной графики Microsoft Windows;
  • <SaveFormsData> — значение true для сохранения данных, введенных пользователем в форме в виде записи;
  • <SaveAsAOCELetter> — если к документу прикреплён почтовый адрес, используйте значение true, чтобы сохранить документ как письмо AOCE (почтовый ящик сохраняется);
  • <Encoding> — кодовая страница или кодировка, используемая для документов, сохраненных в виде закодированных текстовых файлов. По умолчанию используется системная кодовая страница;
  • <InsertLineBreaks> — если документ сохраняется как текстовый файл, используйте значение true для вставки разрывов строк в конце каждой строки текста;
  • <AllowSubstitutions> — если документ сохраняется в виде текстового файла, значение true позволяет Word заменить некоторые символы текстом, похожим на текст. Например, если символ авторских прав отображается как (c). Значение по умолчанию — false;
  • <LineEnding> — способ, которым Word помечает строки и разрывы абзаца в документах, сохранённых в виде текстовых файлов. Возможные значения: 0 — возврат каретки плюс подача строки (значение по умолчанию); 1 — только возврат каретки;
  • <AddBiDiMarks> — значение true добавляет управляющие символы в выходной файл, чтобы сохранить двунаправленный макет текста в исходном документе;
  • <CompatibilityMode> — режим совместимости, который Word использует при открытии документа. Возможные значения: 11 — Word переводится в режим, наиболее совместимый с Word 2003 (функции, новые для Word, отключены в этом режиме); 12 — Word переводится в режим, наиболее совместимый с Word 2007 (функции, новые для Word, отключены в этом режиме); 14 — Word переводится в режим, наиболее совместимый с Word 2010; 65535 — режим совместимости, эквивалентный последней версии Word. По умолчанию, если для этого параметра не указано значение, Word использует значение 0, указывающее, что текущий режим совместимости документа должен быть сохранён.

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

Закрыть документ позволяет метод Close() объекта Document. Будучи вызванным без параметров он просто закрывает документ, если свойство Saved объекта Document установлено в true. Окно приложения при этом остаётся открытым.

Если свойство Saved объекта Document установлено в false, то при вызове метода Close() без параметров открывается диалоговое окно «Сохранить как…».

Синтаксис метода:

Close([<SaveChanges>], [<OriginalFormat>], [<RouteDocument>])

где

  • <SaveChanges> — параметр задаёт действие сохранения для документа. Возможные значения: 0 — не сохранять изменения; −1  — сохранять изменения автоматически, не запрашивая пользователя; −2  — запросить действие у пользователя;
  • <OriginalFormat> — параметр указывает формат сохранения документа. Возможные значения: 0 — сохранить как документ Microsoft Word соответствующей версии; 1 — сохранить в формате оригинала; 2 — предложить пользователю выбрать формат;
  • <RouteDocument> — укажите true для направления документа следующему получателю. Если в документе нет прикрепленного проема маршрутизации, этот параметр игнорируется.

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

// Закрываем документ
Документ.Close();

Закрытие окна приложения

Для закрытия окна приложения следует вызвать метод Quit() объекта Application. Синтаксис данного метода схож с синтаксисом метода Close() объекта Document (см. описание выше).

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

Если Word.Documents.Count = 0 Тогда
   // Если на компьютере нет открытых документов,
   // закрываем окно приложения
   Word.Quit();
КонецЕсли;

// Удаляем OLE-объект из памяти
Word = 0;

Примечание: Прежде чем закрыть окно приложения следует убедиться, нет ли на компьютере других открытых документов MS Word. Ведь если таковые есть, то они тоже будут закрыты. Выполнить проверку позволяет свойство Count коллекции Documents, возвращающее количество экземпляров коллекции (см. пример выше).

Другие статьи по схожей тематике