<<

стр. 5
(всего 10)

СОДЕРЖАНИЕ

>>

Automation метод возвращал значение логического типа, а доступ к базе
данных происходил через объект, созданный с помощью идентификатора
"V8.Application").
Приведем пример подключения к базе данных системы "1С:Предприятие 8.0"
с помощью СОМ-соединения на языке Visual Basic Script (листинг 4.18).

п к базе данных с помощью СОМ-соединени

' Подключение к БД
Set ее = CreateObject("v8.COMConnector")
Set con = cc.Connect("File=C:\Progra˜l\lcv8\Db\Trade; изг=Иванов")

' Вывод сообщения о названии конфигурации
MsgBox con.Metadata.Name, 0, "Конфигурация"

' Задаем текст запроса
Text = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты"

1
Создаем объект Запрос
Set Query = con.NewObject("Запрос")
Query.Text = Text

' Выполнение запроса
Set Result = Query.Execute()
Set Choose = Result.Choose()
ResultChoose = ""

1
Выборка результата выполнения запроса
Использование OLE Automation 145

Do While Choose.Next()
' Конкатенация всех значений выборки в одну строку
ResultChoose = ResultChoose & vbCrLf & Choose.Description
Loop

' Вывод результата выполнения запроса
MsgBox ResultChoose, 0, "Результат выборки"

Достаточно сравнить данный пример подключения к базе данных с приме-
ром, приведенным в листинге 4.9, чтобы понять, что при использовании
OLE Automation доступ к объектам базы данных происходит через перемен-
ную ее, а при СОМ-соединении — через переменную con.
Во всем остальном использовать СОМ-соединение можно так же, как
и OLE Automation. Чтобы удостовериться в этом, рассмотрим пример досту-
па к справочникам (листинг 4.19), аналогичный примеру, приведенному
в листинге 4.12.

I Листинг 4.19. Доступ к справочникам

v8 = Новый COMC©beKT("V8.COMConnector");
База = v8.Connect(СтрокаПодключения);


// Доступ к справочникам
СправочникОЬЕ = База.Справочники.Контрагенты;
Выборка = СправочникОЬЕ.Выбрать();
// Обход выборки элементов справочника
Пока Выборка.Следующий() Цикл
Если Не Выборка.ЭтоГруппа Тогда
Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЦикла;

// Создание нового элемента справочника
СправочникОЬЕ = База.Справочники.Контрагенты;
НовыйЭлемент = СправочникОЬЕ.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Михайлов Андрей";
НовыйЭлемент.Комментарий = "Создан автоматически.";
НовыйЭлемент.Записать();

Данный пример отличается от приведенного в листинге 4.12 только спосо-
бом создания объекта и методом подключения к базе данных.
146 Глава 4


Работа с Microsoft Word
Как уже было сказано ранее, Microsoft Word является OLE-сервером, кото-
рый можно использовать для автоматизации множества задач.
Для начала рассмотрим, каковы программные идентификаторы основных
объектов Microsoft Word и что представляет собой его объектная модель.
Для OLE-сервера Microsoft Word доступны непосредственно следующие
объекты:
О Application — с помощью этого профаммного идентификатора создает-
ся экземпляр Word без открытых документов;
П Document — с помощью этого программного идентификатора создается
экземпляр Word с одним вновь созданным документом.
Все остальные объекты Word являются так называемыми внутренними объ-
ектами. Это означает, что они не могут быть созданы "сами по себе". Так,
объект Paragraph (абзац) не может быть создан отдельно от содержащего
его документа.
Если вспомнить, что основное назначение Word — работа с документами,
легко понять иерархию его объектной модели. Основным объектом в ней,
как и во всех других приложениях Microsoft Office, является объект
Application, содержащий коллекцию Documents объектов типа Document.
Каждый объект типа Document содержит коллекцию Paragraphs объектов
типа Paragraph, Bookmarks типа Bookmark, Characters типа Character И Т. Д.
Манипуляция документами, абзацами, символами, закладками реально осу-
ществляется путем обращения к свойствам и методам этих объектов.
Рассмотрим основные методы работы с объектом Microsoft Word, которые
будут использоваться практически во всех примерах (листинг 4.20).

! Листинг 4.20. Основные методы работы с Microsoft Wor
i _„ „„ "
.

// Создание объекта MS Word
Word = Новый СОМОбъект("Word.Application");
// Установка видимости приложения
Word.Visible = Истина;
// Добавление нового документа в приложение
Word.Documents.Add();
// Получение активного документа
Документ = Word.ActiveDocument ();
// Добавить параграф
Документ.Paragraphs.Add();
Использование OLE Automation 147

I/ Добавить текст
Документ.Paragraphs(НомерПараграфа).Range().InsertAfter(Текст);
// Стилевое оформление
Документ.Paragraphs(НомерПараграфа).Range().Style="Зaгoлoвoк 2";
// Открытие существующего документа
Word.Documents.Open(ИмяФайла);
// Сохранение документа
Документ.Save();
Документ.SaveAs(ИмяФайла);
// Закрытие документа
Документ.Close();
// Закрытие приложения
Word.Quit();


Создание и открытие документов MS Word
Для создания примеров использования Microsoft Word можно применять
код создания контроллера, приведенный в листинге 4.20. Начнем сразу
с создания и открытия документов.
Создать новый документ Word можно, используя метод Add коллекции
Documents объекта Application — Word. Documents .Add () . Для создания ДО-
кумента с помощью шаблона нужно указать путь к шаблону в качестве па-
раметра метода Add: Word.Documents.Add("С:\Templates\NewStyle.dot").
Для открытия уже существующего документа следует воспользоваться мето-
дом Open коллекции Documents: W o r d . Documents . Open ("С: \MyWordFile.doc").
Отметим, что свойство ActiveDocument объекта Word.Application указывает
на текущий активный документ среди одного или нескольких открытых.
Помимо этого к документу можно обращаться по его порядковому номеру
с помощью метода item; например, ко второму открытому документу можно
обратиться так: word.Documents.item(2). Необходимо отметить, что нуме-
рация членов коллекций в Microsoft Office начинается с единицы.
Сделать документ активным можно с помощью метода Activate:
Word.Documents.Item(1).Activate().
Следующее, чему следует научиться, — это сохранять документ Word и за-
крывать сам Word.

Сохранение, печать и закрытие документов
Закрытие документа может быть осуществлено с помощью метода close:
Word.Documents.Itern(2).Close () ИЛИ Word.ActiveDocument.Close ( ) .
148 Глава 4

Метод close имеет несколько необязательных параметров, влияющих на
правила сохранения документа. Первый из них влияет на то, сохраняются
ли внесенные в документ изменения, и может принимать три значения:
П о — не сохранять изменения;
О -1 — сохранять изменения;
О -2 — вывести диалоговое окно с соответствующим вопросом.
Второй параметр влияет на формат сохраняемого документа:
П о — сохранить в формате Word;
О 1 — сохранить в исходном формате документа;
О 2 — вывести диалоговое окно Сохранить как.
Третий параметр принимает значения истина или ложь и влияет на то, пере-
сылать ли документ следующему пользователю по электронной почте. Если
эта функция не используется, этот параметр можно проигнорировать.
Таким образом, при использовании указанных выше параметров закрыть
документ МОЖНО, например, так— Word. ActiveDocument. Close (4294967295, 2 ) .
Просто сохранить документ, не закрывая его, можно с помощью метода
Save — Word.ActiveDocument.Save().
Этот метод также имеет несколько необязательных (в случае позднего свя-
зывания) параметров, первый из которых равен истина, если документ со-
храняется автоматически, и ложь, если нужно выводить диалоговое окно для
получения подтверждения пользователя о сохранении изменений (если та-
ковые были сделаны). Второй параметр влияет на формат сохраняемого до-
кумента, и список его возможных значений совпадает со списком значений
второго параметра метода close.
Закрыть приложение Microsoft Word можно с помощью метода Quit объекта
word.Application. Этот метод, в общем случае, имеет параметры, совпа-
дающие с параметрами метода close объекта Document.
Вывод документа на устройство печати можно осуществить с помощью ме-
тода Printout объекта Document, например: Word.ActiveDocument. Printout ( ) .
Если нужно изменить параметры печати, следует указать значения соответ-
ствующих параметров метода Printout.



Е^ Примечание
Для Microsoft Word их около двадцати параметров печати. Описание их можно
найти на сайте Microsoft.
Использование OLE Automation 149

Вставка текста и объектов в документ
и форматирование текста
Для создания абзацев в документе можно использовать коллекцию
Paragraphs объекта Document, представляющую набор абзацев данного до-
кумента. Добавить новый абзац можно с помощью метода Add этой коллек-
ции: Word.ActiveDocument.Paragraphs.Add().
Для вставки собственно текста в документ, тем не менее, применяется не объ-
ект Paragraph, а объект Range, представляющий любую непрерывную часть
документа (в том числе и вновь созданный абзац). Этот объект может быть
создан разными способами. Например, можно указать начальный и конечный
символы диапазона (если таковые имеются в документе), указать номер абза-
ца, или указать несколько абзацев, следующих подряд (листинг 4.21).




// 1-й способ (указать начальный и конечный символы диапазона)
Rng = Word.ActiveDocument.Range(2,4); //со 2-го по 4-й символы
// 2-й способ (указать номер абзаца, например, только что созданного):
Rng = Word.ActiveDocument.Paragraphs.Item(l).Range;
// 3-й способ (указать несколько абзацев, следующих подряд)
Rng = Word.ActiveDocument.Range( Word.ActiveDocument.Paragraphs.Item(3).
Range.Start, Word.ActiveDocument.Paragraphs.Item(5).Range.End);
// Вставка текста
Rng.InsertAfter("Это вставляемый текст");

Вставить текст можно с помощью методов insertsef ore (перед диапазоном)
или insertAfter (после диапазона) объекта Range.
Помимо объекта Range текст можно вставлять с помощью Selection, яв-
ляющимся свойством объекта w o r d . A p p l i c a t i o n и представляющим собой
выделенную часть документа (этот объект создается, если пользователь
выделяет часть документа с помощью мыши, и может быть также создан
с помощью приложения-контроллера). Сам объект selection можно соз-
дать, применив метод Select к объекту Range, например —
Word.ActiveDocument.Paragraphs.Item(3).Range.Select(). В данном при-
мере в текущем документе выделяется третий абзац.
Если необходимо вставить строку текста в документ вместо выделенного
фрагмента текста, либо перед ним, это можно сделать с помощью фрагмента
кода, который приведен в листинге 4.22.
150 Глава 4
........--.-—,,-_-,•-!--
....g-.-------—_,-—-,--- — ': ˜---- v —-

эмена выделенного текста

// Признак замены выделенного фрагмента при вставке текста
Арр.Options.ReplaceSelection = Истина;
// Получить выделенный фрагмент
Sel = Арр.Selection;
// Вставить текст
Sel.TypeText("Это текст, которым мы заменим выделенный фрагмент");
// Конец абзаца
Sel.TypeParagraph();


Отметим, что если свойство Options.ReplaceSelection объекта
word.Application имеет значение истина, выделенный текст будет заменен
на новый (этот режим действует по умолчанию). Если же нужно, чтобы
текст был вставлен перед выделенным фрагментом, а не вместо него, следу-
ет установить значение этого свойства равным ложь.
Символ конца абзаца при использовании объекта selection может быть
вставлен С ПОМОЩЬЮ метода TypeParagraph.
К объекту Selection, так же как и к объекту Range, можно применить мето-
ды insertBefore и insertAfter. В этом случае, в отличие от предыдущего,
вставляемый текст станет частью выделенного фрагмента текста.
С помощью объекта selection, используя его свойство Font, а также и
свойства объекта Font (Bold, italic, size и т. п.), можно отформатировать
текст. Например, таким образом можно вставить строку, выделенную жир-
ным шрифтом (листинг 4.23).

| Листинг 4.23. Форматирование текста

// Установка полужирного шрифта
Sel.Font.Bold = Истина;
Sel.TypeText("Это текст, который мы выделим жирным шрифтом."
// Отмена полужирного шрифта
Sel.Font.Bold = Ложь;
// Признак конца параграфа
Sel.TypeParagraph();
// Установка стиля текста
Sel.Style = "Заголовок 1";
Sel.TypeText("Это текст, который станет заголовком");
Sel.TypeParagraph();
Использование OLE Automation 151

Для наложения на вставляемый текст определенного заранее стиля можно
использовать свойство style этого же объекта (листинг 4.24).
Нередко документы Word содержат данные других приложений.
Простейший способ вставить такие данные в документ — использование
метода Paste объекта Range. Естественно, в этом случае в буфере обмена
уже должны содержаться вставляемые данные. Если нужно поместить в бу-
фер обмена часть документа Word, это можно сделать с помощью метода
Сору объекта Range. Пример копирования и вставки данных приведен в лис-
тинге 4.24.




// Копирование данных
Rng = Word.Selection.Range;
Rng.Copy();
// Вставка данных
Rng = Word.Selection.Range;
Rng.Collapse(0);
Rng. Paste () ;


Параметр метода Collapse указывает на то, где, в начале или в конце ис-
ходного фрагмента, окажется новый объект Range или selection:
П 1 — новый объект находится в начале фрагмента;
П о — новый объект находится в конце фрагмента.

Перемещение курсора по тексту
Перемещать курсор по тексту можно с помощью метода Move объектов
Range и Selection. Этот метод имеет два параметра. Первый указывает на
то, в каких единицах измеряется перемещение — в символах (по умолча-
нию) или словах, предложениях, абзацах и др. Второй параметр указывает,
на сколько единиц при этом нужно переместиться (это число может быть и
отрицательным; по умолчанию оно равно i). Примеры таких перемещений
курсора приведены в листинге 4.25.

j Листинг 4.25. Перемещение курсора по тексту

// Перемещение курсора на один символ вперед
Rng.Move();
// Перемещение курсора на три абзаца вперед
Rng.Move (4,3) ;
152 Глава 4
I/ Перемещение курсора на одно слово вперед
Rng.Move(2);
// Перемещение курсора на десять слов назад
Rng.Move(2, -10);

Второй параметр метода Move может принимать следующие значения:
О 1 — символ;
П 2 — слово;
П з — предложение;
П 4 — абзац;
П б — часть документа (например, колонтитул, оглавление и др.);
П 8 — раздел;
П 9 — колонка таблицы;
П ю — строка таблицы;
П 12 — ячейка таблицы;
П 15 — таблица.
Нередко для перемещения по тексту используются закладки. Создать за-
кладку в текущей позиции курсора можно путем добавления члена коллек-
ции Bookmarks объекта Document с помощью метода Add. При этом надо ука-
зать имя закладки в качестве его параметра.
Проверить существование закладки в документе можно с помощью метода
Exists, а переместиться на нее — с помощью метода Goto объектов
Document, Range или selection. Пример работы с закладками приведен
в листинге 4.26.




// Добавить новую закладку
Word.ActiveDocument.Bookmarks.Add("MyBookmark");
// Переместить курсор на закладку
Rng = Word.ActiveDocument.Goto(-1, 2, ',"MyBookmark");
// Вставить текст после закладки
Rng.InsertAfter("Текст, вставленный после закладки");

В методе Goto данного примера первый параметр указывает на необходи-
мость перейти к указанной закладке. Второй — определяет, что нужно ис-
кать следующий объект в тексте.
Использование OLE Automation 153

Отметим, что с помощью метода Goto можно перемещаться не только на
указанную закладку, но и на другие объекты (рисунки, грамматические
ошибки и др.). Направление перемещения тоже может быть различным. По-
этому список констант, которые могут быть использованы в качестве пара-
метров данного метода, довольно велик.

Создание таблиц
Создавать таблицы можно двумя способами. Первый заключается в вызове
метода Add коллекции Tables объекта Document и последовательном запол-
нении ячеек данными. Этот способ при позднем связывании работает до-
вольно медленно.
Второй способ — более "быстрый". Сущность его заключается в создании
текста из нескольких строк, содержащих подстроки с разделителями и по-
следующей конвертации такого текста в таблицу с помощью метода
ConvertToTable объекта Range.

[^ Примечание
В качестве разделителя можно использовать любой или почти любой символ.
Нужно только, чтобы он заведомо не встречался в данных, которые будут по-
мещены в будущую таблицу.

В листинге 4.27 приведен пример создания этим способом таблицы, со-
стоящей из трех строк и трех столбцов (в качестве разделителя, являющего-
ся первым параметром метода ConvertToTable, используется запятая).

• 4.27. Создание таблицы

Rng = Word.Selection.Range;
Rng.Collapse(0);
Rng.InsertAfter("l, 2, 3 " ) ;
Rng.InsertParagraphAfter();
Rng.InsertAfter("4,5, 6") ;
Rng.InsertParagraphAfter();
Rng.InsertAfter("7,8,9");
Rng.InsertParagraphAfter();
Rng.ConvertToTable(",");


Отметим, что внешний вид таблицы можно изменить с помощью свойства
Format, а также с помощью свойств коллекции columns, представляющей
колонки таблицы, и коллекции ROWS, представляющей строки таблицы объ-
екта Table.
154 Глава 4
.


Обращение к свойствам документа
Свойства документа можно получить с помощью коллекции
BuiltlnDocumentProperties объекта Document, пример работы С которой
приведен в листинге 4.28.




// Получаем коллекцию BuiltlnDocumentProperties
Prop = Word.ActiveDocument.BuiltlnDocumentProperties;
// Выводим некоторые свойства
Сообщить("Название: " + Prop[I].Value);
Сообщить("Автор: " + Prop[3].Value);
Сообщить("Шаблон: " + Prop[6].Value);


Ниже перечислены все возможные индексы коллекции
BuiltlnDocumentProperties:
П 1— название;
П 2 — назначение;
П з — автор;
П 4 — ключевые слова;
О 5 — комментарии;
О б — шаблон;
П 7 — автор, редактировавший текст последним;
П 8 — версия;
П 9 — имя приложения;
П ю — когда последний раз документ был выведен на устройство печати;
П и — время создания;
П 12 — время, когда документ был сохранен в последний раз
П 13 — суммарное время редактирования;
О 14 — число страниц;
О 15 — число слов;
П 16 — число символов;
П 17 — правила доступа к документу;
П 18 — категория;
П 19 — формат документа;
Использование OLE Automation 155

П 20 — менеджер;
П 21 — компания;
П 22 — число байт;
П 23 — число строк;
П 24 — число абзацев;
П1 25 — число слайдов;
П 26 — число комментариев;
П 27 — число скрытых слайдов;
П 28 — число мультимедиаклипов;
П 29 — путь к гипертекстовым ссылкам;
П зо — число символов без учета пробелов.
Итак, сейчас были рассмотрены основные операции, которые наиболее час-
то применяются при автоматизации Microsoft Word. В дальнейшем будут
рассмотрены примеры практического применения Microsoft Word в качестве
OLE-сервера.

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

инг 4.29. Выгрузка метаданных в MS Word для версии 8.0

Попытка
Word = Новый СОМОбъект("Word.Application");
Исключение
Сообщить("Не удалось открыть Word");
Возврат;
КонецПопытки;
Сообщить("Ждите... Это может занять продолжительное время...");


// Добавим новый документ
Word.Documents.Add();
Документ = Word.ActiveDocument();
156 Глава 4


/I Определяем все возможные объекты метаданных
ВсеТипы = Новый Структура();
ВсеТипы.Вставить("ОбщиеМодули", "Общие модули");
ВсеТипы.Вставить("ОбщиеФормы", "Общие формы");
ВсеТипы.Вставить("ОбщиеМакеты", "Общие макеты");
ВсеТипы.Вставить("ОбшиеКартинки", "Общие картинки");
ВсеТипы.Вставить("Роли", "Роли");
ВсеТипы.Вставить("Интерфейсы", "Интерфейсы");
ВсеТипы.Вставить("Стили", "Стили");
ВсеТипы.Вставить("Языки", "Языки");
ВсеТипы.Вставить("ПланыОбмена", "Планы обмена");
ВсеТипы.Вставить("Константы", "Константы");
ВсеТипы.Вставить("КритерииОтбора", "Критерии отбора");
ВсеТипы.Вставить("Справочники", "Справочники");
ВсеТипы.Вставить("Документы", "Документы");
ВсеТипы.Вставить("ЖурналыДокументов", "Журналы документов");
ВсеТипы.Вставить("Перечисления", "Перечисления");
ВсеТипы.Вставить("Отчеты", "Отчеты");
ВсеТипы.Вставить("Обработки", "Обработки");
ВсеТипы.Вставить("ПланыВидовХарактеристик", "Планы видов характеристик");
ВсеТипы.Вставить("ПланыСчетов", "Планы счетов");
ВсеТипы.Вставить("ПланыВидовРасчета", "Планы видов расчета");
ВсеТипы.Вставить("РегистрыСведений", "Регистры сведений");
ВсеТипы.Вставить("РегистрыБухгалтерии", "Регистры бухгалтерии");
ВсеТипы.Вставить("РегистрыРасчета", "Регистры расчета");


// Определяем все возможные параметры
ВсеПараметры = Новый Структура();
ВсеПараметры.Вставить("Измерения", "Измерения");
ВсеПараметры.Вставить("Ресурсы", "Ресурсы");
ВсеПараметры.Вставить("Реквизиты", "Реквизиты");
ВсеПараметры.Вставить("Формы", "Формы");
ВсеПараметры.Вставить("Макеты", "Макеты");
ВсеПараметры.Вставить("Графы", "Графы");
ВсеПараметры.Вставить("ТабличныеЧасти", "Табличные части");
ВсеПараметры.Вставить("Значения", "Значения");


// Перебор типов метаданных
Использование OLE Automation 157

Для Каждого ТипОбъекта Из ВсеТипы Цикл
Состояние(ТипОбъекта.Значение);


Если Метаданные[ТипОбъекта.Ключ].Количество() > 0 Тогда
// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count();
Документ.Paragraphs(Номер-1}.Range(). InsertAfter( ТипОбъекта.Значение);
Документ.Paragraphs(Номер).Range().Style="3aгoлoвoк 1";


// Перебираем конкретные объекты
Для каждого Объект Из Метаданные[ТипОбъекта.Ключ] Цикл
// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count() ;
Документ.Paragraphs(Номер-1).Range().InsertAfter(Объект.Синоним);
Документ.Paragraphs(Номер).Range().Style="Зaгoлoвoк 2";


// Перебираем параметры метаданных
Для каждого Параметр Из ВсеПараметры Цикл
Попытка
Количество = Объект[Параметр.Ключ].Количество();
Исключение
Продолжить;
КонецПопытки;


Если Количество > 0 Тогда
// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count();
Документ.Paragraphs(Номер-1).Range().InsertAfter
(Параметр.Значение + " ( + Количество + " " ;
" ))
Документ.Paragraphs(Номер).Range().Style="3aгoлoвoк 3";


// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер=Документ.Paragraphs.Count();
// Добавляем новую таблицу
158 Глава 4
Документ.Tables.Add(Документ. Paragraphs(Номер).Range О,
Количество+1,4);


Счетчик = 1;
// Заполняем шапку таблицы
Таблица = Документ.Tables(Документ.Tables.Count());
Таблица.Cell(Счетчик,1).Ranged.InsertAfter("Имя");
Таблица.Cell(Счетчик,2).Range О.InsertAfter("Синоним");
Таблица.Cell(Счетчик,3) .Range О .InsertAfter("Тип");
Таблица.Cell(Счетчик,4).Ranged.InsertAfter("Комментарий");
// Устанавливаем жирный шрифт для шапки таблицы
Документ.Range( Таблица.Cell( Счетчик,!). Range.Start,
Таблица.Cell(Счетчик,4).Range.End).Font.Bold = Истина;


Для каждого Значение Из Объект[Параметр.Ключ] Цикл
Счетчик = Счетчик + 1;
// Заполняем содержимое таблицы
Попытка
Таблица.Cell(Счетчик,1).Range().InsertAfter(Значение.Имя);
Исключение
КонецПопытки;
Попытка
Таблица.Cell( Счетчик,2)
.Range().InsertAfter( Значение.Синоним);
Исключение
КонецПопытки;
Попытка
СтрокаТипов = " ;
"
// Выводим все типы
Для каждого Тип Из Значение.Тип.Типы() Цикл
СтрокаТипов = СтрокаТипов + " " + Строка(Тип);
КонецЦикла;
Таблица.Cell(Счетчик,3).Ranged.InsertAfter(СтрокаТипов);
Исключение
КонецПопытки;
Попытка
Таблица.Cell( Счетчик,4).Range ().
InsertAfter( Значение.Комментарий);
Исключение
КонецПопытки;
Использование OLE Automation 159

КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;


// Показываем документ
Word.Visible = Истина;
// Устанавливаем активность документа
Word.Activate();
Word = Неопределено;


В данном примере используется коллекция Tables, которая предназначена
для доступа ко всем таблицам документа. С помощью метода Add данного
свойства можно добавлять новые таблицы в документ. Данный метод имеет
три параметра:
1. Первый параметр — область документа, в которую помещается таблица.
2. Второй параметр — количество строк.
3. Третий параметр — количество столбцов.
Для того чтобы заполнить ячейки таблицы значениями, нужно сначала по-
лучить ссылку на данную таблицу, указав в коллекции Tables номер необ-
ходимой таблицы, а затем с помощью метода таблицы cell указать, в какую
область ячейки необходимо добавить текст.
В примере специально не описывается работа с метаданными, т. к. подразу-
мевается, что читатель знаком с данным объектом. Для версии 7.7 системы
"1С:Предприятие" приведенный код будет отличаться только принципами
работы с метаданными. Все, что касается объекта word.Application одина-
ково работает в обеих версиях системы.

Динамическое создание
и выполнение макросов MS Word
С ПОМОЩЬЮ Объектов W o r d . A p p l i c a t i o n И E x c e l . A p p l i c a t i o n МОЖНО ДИна-
мически добавлять макросы в документ MS Word или Excel и выполнять их
на OLE-сервере.
Перед добавлением макроса необходимо проверить, существует ли доступ
к VB-проекту. Для этого в MS Word 2002 (в других версиях последователь-
ность действий может быть другой) необходимо выбрать пункт Параметры
в меню Сервис; на закладке Безопасность нажать кнопку Защита от макросов
160 Глава 4

и в появившемся окне установить флажок Доверять доступ к Visual Basic
Project.
Приведем пример добавления макроса в документ MS Word и запуска его на
OLE-сервере (листинг 4.30).

убавление макроса в документ MS Word и запуск его


// Определяем текст макроса на языке VBA
ТекстМакроса = "Sub VBAFunction()
I Selection.TypeText Text:=""Добрый день, уважаемый читатель!""
I Selection.TypeParagraph
I Selection.TypeText Text:=""Добро пожаловать на наш форум""
I Application.Keyboard (1033)
I Selection.TypeText Text:="": http://forum.erpg.ru""
I Selection.TypeParagraph
I Selection.MoveUp Unit:=wdLine, Count:=2
iSelection.EndKey Unit:=wdLine, Extend:=wdExtend
I Selection.Style = ActiveDocument.Styles(""Заголовок 1"")
I Selection.MoveDown Unit:=wdLine, Count:=l
I Selection.HomeKey Unit:=wdLine
I Selection.EndKey Unit:=wdLine, Extend:=wdExtend
I Selection.Style = ActiveDocument.Styles(""Заголовок 2"")
IActiveDocument.SaveAs FileName:=""C:/Example.doc"", FileFormat:=
I wdForraatDocument, LockComments:=False, Passwords"""",
I AddToRecentFiles:=
I True, WritePassword:="""", ReadOnlyRecommended:=False,
I EmbedTrueTypeFonts:=
I False, SaveNativePictureForroat:=False, SaveFormsData:=False,
I SaveAsAOCELetter:=False
I End Sub";


// Создание объекта
Word = Новый СОМОбъект("Word.Application");
// Добавление нового документа
Word.Documents.Add();
// Определяем ссылку на VB-проект
VBComponents = Word. ActiveDocument.VBProj ect.VBComponents;
// Добавляем новый макрос
Count = VBComponents.Count();
Использование OLE Automation 161

VBComponents.Add(1);
VBComponents.Item(Count + 1).CodeModule.InsertLines(1, ТекстМакроса);
// Выполняем макрос с именем VBAFunction
Word.Application.Run("VBAFunction");
// Закрываем OLE-сервер
Word.Quit();
// Очищаем переменную
Word = Неопределено;


Данный пример создает новый макрос с именем VBAFunction и запускает
его на OLE-сервере. Процедура VBAFunction создает новый документ в
формате MS Word, пишет в него две строки, форматирует их и записывает
созданный документ в файл Example.doc, который будет находиться в кор-
невом каталоге диска С:.

Проверка орфографии текстов в MS Word
Как уже было сказано ранее, текстовые процессоры и другие программы
предоставляют множество полезных возможностей. Например, самый попу-
лярный текстовый редактор Microsoft Word позволяет выполнять проверку
орфографии. Эту очень важную функцию редактора можно использовать в
конфигурациях системы "1С:Предприятие" там, где необходимо проверить
орфографию введенного текста.
Для проверки орфографии необходимо создать OLE-объект Word. Application
и вызвать его метод checkSpeiiing. Данный метод содержит множество па-
раметров, но обязательным является только один — строка с текстом, кото-
рый будет проверяться. Метод возвращает истина, если ошибок обнаружено
не будет, и ложь, если текст содержит орфографические ошибки.
Рассмотрим пример работы метода CheckSpeiiing (листинг 4.31).

I Листинг 4.31. Проверка наличия орфографических ошибок в тексте

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

// Проверяем строку на ошибки

6 Зак. 722
162 Глава 4

ТекстБезОшибок = Ворд.CheckSpelling(Текст) ;


Если ТекстБезОшибок Тогда
Сообщить("Ошибок не обнаружено!");
Иначе
Сообщить("Текст содержит орфографические ошибки!");
КонецЕсли;


Данный пример позволяет определить, содержит текст орфографические
ошибки или нет, но не дает знать, в каких именно словах были допущены
эти ошибки. Для определения каждого неправильно написанного слова
необходимо добавить новый документ в MS Word, перенести в него прове-
ряемый текст и проверить с помощью метода CheckSpelling каждое слово,
после чего закрыть документ (листинг 4.32).



// Проверяем строку на ошибки
ТекстБезОшибок = Ворд.CheckSpelling(Текст);


Если ТекстБезОшибок Тогда // Нет ошибок
Сообщить("Ошибок не обнаружено!");


Иначе // Обнаружены ошибки, будем проверять по словам
// Запомним, был ли Word активен
Ворд_Активен = Ворд.Visible;
// Добавляем новый документ
ВремДок = Ворд.Documents.Add();
// Получаем пустую область в начале документа
МояОбласть = ВремДок.Range(0, 0);
// Добавляем в эту область нашу строку
МояОбласть.InsertBefore(Текст);
// Подсчитываем число слов в области
ЧислоСлов = МояОбласть.Words.Count;


Для НомерСлова = 1 По ЧислоСлов Цикл
// Выбираем очередное слово
ПровОбласть = МояОбласть.Words(НомерСлова);
ПровСлово = СокрЛП(ПровОбласть.Text);
Использование OLE Automation 163

// Проверяем наше слово на ошибки
СловоБезОшибок = Ворд.CheckSpelling(ПровСлово);


Если НЕ СловоБезОшибок Тогда
Сообщить("Ошибка в слове: " + ПровСлово};
КонецЕсли;
КонецЦикла;


ВремДок.Close(wdDoNotSaveChanges,,);

Если Не Ворд_Активен Тогда
Ворд.Quit();
КонецЕсли;


Сообщить("Текст содержит орфографические ошибки! ") ;
КонецЕсли;


Данный пример уже выводит те слова, в которых были обнаружены ошибки.
Но MS Word, помимо проверки слов, позволяет предлагать еще и варианты
замены неправильно написанных слов. Рассмотрим пример проверки ор-
фографии слов и вывода вариантов их замены (листинг 4.33).

Листинг 4.33. Проверка орфог

Для НомерСлова = 1 По ЧислоСлов Цикл
// Выбираем очередное слово
ПровОбласть = МояОбласть.Words(НомерСлова);
ПровСлово = СокрЛП(ПровОбласть.Text);
// Проверяем наше слово на ошибки
СловоБезОшибок = Ворд.CheckSpelling(ПровСлово);


Если НЕ СловоБезОшибок Тогда
Сообщить("Ошибка в слове: " + ПровСлово);


// Получаем варианты замен, но их может и не быть
// Проверяем орфографию, указав, что возвращать нужно множество замен
Замены = ПровОбласть.GetSpellingSuggestions(,Истина,,0);
// Получаем число возможных замен
ЧислоЗамен = Замены.Count;
Если ЧислоЗамен > 0 Тогда
164 Глава 4
Для НомерЗамены = 1 По ЧислоЗамен Цикл
СловоЗамены = СокрЛП(Замены.Item(НомерЗамены).Name);
Сообщить(" Вариант замены: " + СловоЗамены);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;


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


Работа с Microsoft Excel
С помощью объекта Excel.Application, предоставляемого OLE-сервером
MS Excel, можно программно создавать электронные таблицы, а также ис-
пользовать все функции MS Excel, предоставляемые пользователям.
Основным, в объектной модели Excel, является объект Application, содер-
жащий коллекцию workbooks объектов типа workBook. Каждый объект типа
workBook содержит коллекцию объектов worksheets типа worksheet, кол-
лекцию объектов charts типа chart и др. Манипуляция рабочими книгами,
их листами, ячейками, диаграммами и др. осуществляется путем обращения
к свойствам и методам этих объектов.

Запуск MS Excel, создание и открытие рабочих книг
Для создания примеров использования Microsoft Excel можно использовать
следующий код создания контроллера:
Excel = Новый СОМОбъект("Excel.Application") .
Создать новую рабочую книгу Excel можно, используя метод Add коллекции
Workbooks объекта Application:
Excel.WorkBooks.Add().
Для создания рабочей книги на основе шаблона следует указать его имя
в качестве первого параметра метода Add:
Excel.WorkBooks.Add("С:\Templates\tm.xlt").
В качестве первого параметра этого метода можно также использовать сле-
дующие константы:
О -4109 — рабочая книга состоит из листа с диаграммой;
П -4167 — рабочая книга состоит из листа с данными.
Использование OLE Automation /65

В этом случае рабочая книга будет содержать лист того типа, который задан
указанной константой (график, обычный лист с данными и др.).
Для открытия уже существующего документа следует воспользоваться мето-
дом Open КОЛЛекЦИИ WorkBooks:
Excel.Documents.Open("С:\MyExcelFile.xls").
Отметим, что свойство ActiveWorkBook объекта Excel.Application указыва-
ет на текущую активную рабочую книгу среди одной или нескольких откры-
тых. Помимо этого к рабочей книге можно обращаться по ее порядковому
номеру. Например, ко второй открытой рабочей книге можно обратиться
с помощью записи:
Excel.WorkBooks[2].
Сделать рабочую книгу активной можно с помощью метода Activate:
Excel.WorkBooks[2] .Activate() .
Следующее, чему следует научиться, — это сохранять рабочие книги в файлах.

Сохранение, печать и закрытие
рабочих книг MS Excel
Закрытие документа может быть осуществлено с помощью метода close:
E x c e l . W o r k B o o k s [ 2 ] . C l o s e ( ) ИЛИ Excel.ActiveWorkBook.Close().
Метод close имеет несколько необязательных (в случае позднего связыва-
ния) параметров, влияющих на правила сохранения рабочей книги. Первый
из параметров принимает значения истина или ложь и влияет на то, сохра-
нять ли изменения, внесенные в рабочую книгу. Второй параметр — имя
файла, в котором нужно сохранить рабочую книгу (если в нее были внесены
изменения). Третий параметр также принимает значения истина или ложь и
влияет на то, будет ли пересылаться документ следующему пользователю по
электронной почте.
Просто сохранить рабочую книгу, не закрывая ее, можно с помощью метода
Save ИЛИ SaveAs:
Excel.ActiveWorkBook.Save();
Excel.ActiveWorkBook.SaveAs("C:\MyWorkBook.xls") .
Метод SaveAs имеет более десятка параметров, влияющих на то, как именно
сохраняется документ (под каким именем, с паролем или без него, какова
кодовая страница для содержащегося в ней текста и др.).
Закрыть среду Excel можно с помощью метода Quit объекта
Excel.Application. В случае Excel этот метод параметров не имеет.
Вывод документа Excel на устройство печати можно осуществить с по-
мощью метода Printout объекта workBook, например:
Excel.ActiveWorkBook.Printout() .
Глава 4
166

Если нужно изменить параметры печати, следует указать значения соответ-
ствующих параметров метода Printout (в случае Excel их восемь).

Обращение к листам и ячейкам
Обращение к листам рабочей книги производится с помощью коллекции
worksheets объекта workBook. Каждый член этой коллекции представляет
собой объект Worksheet. К члену этой коллекции можно обратиться по его
порядковому номеру, например:
Excel.WorkBooks[1].Worksheets[1].Name = "Страница 1".
Приведенная выше запись иллюстрирует, как можно изменить имя листа
рабочей книги.
К листу рабочей книги можно обратиться и по имени, например:
Excel.WorkBooks[1].Worksheets["Лист!"].Name = "Страница 1".
Обращение к отдельным ячейкам листа производится с помощью коллекции
Cells объекта worksheet. Например, добавить данные в ячейку BI можно
следующим образом:
Excel.WorkBooks[I].Worksheets["Лист!"].Cells[1,2].Value="25".
Здесь первая из координат ячейки указывает на номер строки, вторая — на
номер столбца.
Добавление формул в ячейки производится аналогичным способом:
Excel.WorkBooks[1].Worksheets["Лист!"].Cells[3,2].Value=" =SUM(B1:B2)".
Очистить ячейку можно с помощью метода ciearcontents.
Форматирование текста в ячейках производится с помощью свойств Font
и interior объекта ceil и их свойств. Например, фрагмент кода, приведен-
ный в листинге 4.34, выводит текст в ячейке красным жирным шрифтом
Courier размера 16 на желтом фоне.
1^^ишшшишИИ11^НйИИИШИИШ1ИИШИИИИ1
i Листинг 4.34. Форматирование текста в ячейках

Excel.WorkBooks[l].Worksheets[1].Cells[3,2].Interior.Colorlndex = 6;
Excel.WorkBooks[1].Worksheets[!].Cells[3,2].Font.Colorlndex = 3;
Excel.WorkBooks[1].Worksheets[1].Cells[3,2].Font.Name = "Courier";
Excel.WorkBooks[1].Worksheets[1].Cells[3,2].Font.Size = 16;
Excel.WorkBooks[1].Worksheets[1].Cells[3,2].Font.Bold = Истина;
Свойство Colorlndex может принимать числовые значения от 1 до 56. Ниже
приведены значения только основных цветов:
П 1 — белый;
П 2 — черный;
Использование OLE Automation 167

П з — красный;
П 5 — синий;
П б — желтый;
О 7 — лиловый;
П ю — зеленый;
П зз — голубой;
П 39 — сиреневый;
П 46 — оранжевый.
Обратиться к текущей ячейке можно с помощью свойства ActiveCeii объ-
екта Excel.Application, а узнать местоположение ячейки можно с по-
мощью свойства Address объекта cell, например:
Сообщить(Excel.ActiveCeii.Address).
Помимо обращения к отдельным ячейкам, можно манипулировать прямо-
угольными областями ячеек с помощью объекта Range. В листинге 4.35 по-
казан пример заполнения прямоугольного участка текстом и изменение цве-
та шрифта в ячейках.

Листинг 4.35. Манипулирование прямоугольной областью ячеек
ЯЯЯЯвЯЯЯвЯЯЯЯЯЯЯвЯШЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯвЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯК: тЯЯЯШ
Excel.WorkBooks[l].Worksheets[2].Range["A1:C5"].Value = "MAV";
Excel.WorkBooks[1].Worksheets[2].Range["A1:C5"].Font.Colorlndex = 3;

Объект Range также часто используется для копирования прямоугольных
областей через буфер обмена. В листинге 4.36 приведен пример, иллюстри-
рующий копирование такой области.



Excel.WorkBooks[1].Worksheets[2].Range["Al:C5"].Copy();
Excel.WorkBooks[l].Worksheets[2].Range["All:CIS"].Select();
Excel.WorkBooks [1] .Worksheets [2] . PasteO;

Обратите внимание на то, что диапазон, куда копируются данные, предва-
рительно выделяется с помощью метода select.
Отметим, что примерно таким же образом можно копировать данные и из
других приложений (например, из Microsoft Word).
Довольно часто при автоматизации Excel используются его возможности,
связанные с построением диаграмм. В дальнейшем будет показано, как это
сделать.
168 Глава 4

Создание диаграмм
Диаграммам Excel соответствует объект chart, который может располагаться
как на отдельном листе, так и на листе с данными. Если объект chart рас-
полагается на листе с данными, ему соответствует член коллекции
chartobjects объекта worksheet и создание диаграммы нужно начать с до-
бавления элемента в эту колекцию:
Chart =
Excel.WorkBooks[1].Worksheets[2].ChartObjects.Add(10,50,400,400)
Параметрами этого метода являются координаты левого верхнего угла диа-
граммы и ее размеры в пунктах (1/72 дюйма).
Если же диаграмма располагается на отдельном листе (не предназначенном
для хранения данных), то ее создание нужно начать с добавления элемента
в коллекцию sheets объекта Application (которая отличается от коллекции
Worksheets тем, что содержит листы всех типов, а не только листы с дан-
ными):
Excel.WorkBooks[1].Sheets.Add(,,1,-4109).
В этом случае первый параметр метода Add указывает порядковый номер
листа, перед которым нужно поместить данный лист (или листы, если их
несколько). Второй параметр — порядковый номер листа, после которого
нужно поместить данный лист (используется обычно либо первый, либо
второй параметр). Третий параметр определяет, сколько нужно создать лис-
тов, а четвертый — какого типа должен быть лист. Значения четвертого па-
раметра совпадают со значениями первого параметра метода Add коллекции
WorkBooks объекта Application, и при использовании имен соответствую-
щих констант следует определить их в приложении-контроллере.
Простейший способ создать диаграмму, с точки зрения пользователя, —
создать ее с помощью соответствующего эксперта на основе прямоугольной
области с данными. Точно так же можно создать диаграмму и посредством
контроллера автоматизации. Для этой цели у объекта chart, являющегося
свойством объекта chartobject (члена коллекции chartobjects), имеется
метод chartwizard. Первым параметром этого метода является объект
Range, содержащий диапазон ячеек для построения диаграммы, а вторым —
числовой параметр, указывающий, какого типа должна быть эта диаграмма
(листинг 4.37). Возможные значения параметра, отвечающего за тип диа-
граммы, можно найти в справочном файле.
.. ..--... - . . . . . . -


I Листинг 4.37. Создание диаграммы с помощью мастера
L '_ :„„.^:„^„._^____ . ,„- . _„ ___:* ______„1^„ „ . •• 1

// Создание диаграммы
Ch.Chart.ChartWizard(Excel.WorkBooks[l].Worksheets[2].Range["A1:C5"], -4100);
// Оформление диаграммы
Использование OLE Automation 169

Ch.Chart.HasTitle = 1;
Ch.Chart.HasLegend = Ложь;
Ch.Chart.ChartTitle.Text = "Пример диаграммы Excel";
Ch.Chart.Axes(1).HasTitle = Истина;
Ch.Chart.Axes(1).AxisTitle.Text = "Подпись вдоль оси абсцисс";
Ch.Chart.Axes(2).HasTitle = Истина;
Ch.Chart.Axes(2).AxisTitle.Text = "Подпись вдоль оси ординат";

У объекта chart имеется множество свойств, отвечающих за внешний вид
диаграммы. С их помощью можно изменить ее точно так же, как пользова-
тели делают это вручную. В листинге 4.37 приводится пример создания за-
головка диаграммы и подписей вдоль ее осей (отметим, что оси есть не
у всех типов диаграмм).
Еще один способ создания диаграммы — определить все ее параметры с по-
мощью свойств объекта chart, включая определение точек (значений) и се-
рий (рядов), на основе которых она должна быть построена. Данные для
серии обычно находятся в объекте Range, содержащем строку или столбец
данных, а добавление серии к диаграмме производится путем добавления
члена к коллекции seriescoiiection (листинг 4.38).

нг 4.38. Опре,
кта Chi

Excel.WorkBooks[1].Sheets.Add(, ,1,-4109) ;
Excel.WorkBooks[1].Sheets[1].ChartType := -4102;
Rng = App.WorkBooks[l].Worksheets[2].Range["B1:B5"];
Excel.WorkBooks[1].Sheets[l].SeriesCollection.Add(Rng);

В данном примере к диаграмме, созданной на отдельном листе, специально
предназначенном для диаграмм, добавляется одна серия на основе диапазо-
на ячеек другого листа.
Далее будут рассмотрены примеры практического применения Microsoft Excel.

Выгрузка метаданных в MS Excel
Рассмотрим пример выгрузки метаданных произвольной конфигурации сис-
темы "1C:Предприятие 8.0" в лист Microsoft Excel (листинг 4.39).

. Выгрузка метаданных в MS Excel для версии 8.0

Попытка
Excel = Новый СОМОбъект("Excel.Application");
Исключение
170 Глава 4
Сообщить("Не удалось открыть Excel");
Возврат;
КонецПопытки;


// Добавляем новый лист
Excel.Application.Workbooks.Add(1);
Лист = Excel.ActiveSheet;
// Задаем имя закладки
Лист.Name = "Данные";
НомерСтроки = 0;


//Перебор типов метаданных
Для Каждого ТипОбъекта Из ВсеТипы Цикл
Состояние(ТипОбъекта.Значение);


Если Метаданные[ТипОбъекта.Ключ].Количество() > 0 Тогда
// Добавляем новую строку
НомерСтроки = НомерСтроки + 1;
// Устанавливаем текст в ячейку
Лист.Cells(НомерСтроки, 1).Value = ТипОбъекта.Значение;


// Перебираем конкретные объекты
Для каждого Объект Из Метаданные[ТипОбъекта.Ключ] Цикл
// Добавляем новую строку
НомерСтроки = НомерСтроки + 1;
// Устанавливаем текст в ячейку
Лист.Cells(НомерСтроки, 1).Value = Объект.Синоним;


// Перебираем параметры метаданных
Для каждого Параметр Из ВсеПараметры Цикл
Попытка
Количество = Объект[Параметр.Ключ].Количество();
Исключение
Продолжить;
КонецПопытки;


Если Количество > 0 Тогда
// Добавляем новую строку
НомерСтроки = НомерСтроки + 1;
Использование OLE Automation 171

Лист.Cells(НомерСтроки, 1).Value = Параметр.Значение +
" ( + Количество + " "
" );


// Добавляем новую таблицу
НомерСтроки = НомерСтроки + 1;
Лист.Cells(НомерСтроки, 1).Value = "Имя";
Лист.Cells(НомерСтроки, 2).Value = "Синоним";
Лист.Cells(НомерСтроки, 3).Value = "Тип";
Лист.Cells(НомерСтроки, 4).Value = "Комментарий";


Для каждого Значение Из Объект[Параметр.Ключ] Цикл
НомерСтроки = НомерСтроки + 1;
// Заполняем содержимое таблицы
Попытка.
Лист.Cells(НомерСтроки, 1).Value = Значение.Имя;
Исключение
КонецПопытки;
Попытка
Лист.Cells(НомерСтроки, 2).Value = Значение.Синоним;
Исключение
КонецПопытки;
Попытка
СтрокаТипов = " ;
"
// Выводим все типы
Для каждого Тип Из Значение.Тип.Типы() Цикл
СтрокаТипов = СтрокаТипов + " " + Строка(Тип);
КонецЦикла;
Лист.Cells(НомерСтроки, 3}.Value = СтрокаТипов;
Исключение
КонецПопытки;
Попытка
Лист.Cells(НомерСтроки, 4).Value = Значение.Комментарий;
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
172 Глава 4

КонецЦикла;

// Показываем документ
Excel.Visible = Истина;
Excel = Неопределено;

Данный пример работает аналогично примеру, приведенному в листинге 4.21,
за исключением того, что данные выгружаются в лист MS Excel. Основной
недостаток данного примера в том, что все тексты ячеек не отформатирова-
ны и представлены одним цветом, что затрудняет чтение таблицы.
В листинге 4.40 показан пример цветового оформления ячеек MS Excel
и задание в них определенного шрифта.

| Листинг 4.40. Оформление ячеек в MS Excel

// Получаем ссылку на определенную ячейку
Ячейка = Лист.Cells(НомерСтроки, НомерКолонки);
// Устанавливаем отступ в 2 символа
Ячейка.Insertlndent(2);
// Устанавливаем размер шрифта
Ячейка.Font.Size = 12;
// Устанавливаем цвет
Ячейка.Font.ColorIndex = 5;
// Устанавливаем жирный шрифт
Ячейка.Font.Bold = Истина;
// Устанавливаем ширину колонки
Ячейка.ColumnWidth = 20;
// Очищаем все границы
Ячейка.Borders(5).LineStyle = -4142;
// Устанавливаем левую границу
Ячейка.Borders(1).LineStyle = 1;
// Устанавливаем верхнюю границу
Ячейка.Borders(8).LineStyle = 1;
// Устанавливаем нижнюю границу
Ячейка.Borders(9).LineStyle = 1;
// Устанавливаем правую границу
Ячейка.Borders(10).LineStyle = I;
11 Устанавливаем выравнивание по левому краю
Ячейка.VerticalAlignment = -4160;
// Устанавливаем перенос слов
Ячейка.WrapText = Истина;
Использование OLE Automation 173

В первой строке данного примера в переменную ячейка помещается ссылка
на конкретную ячейку с координатами номерстроки и номерКолонки. После
этого через данную переменную устанавливается размер шрифта, цвет тек-
ста, ширина ячейки, границы, положение текста и т. д.

Создание сводных таблиц MS Excel
Большое количество пользователей, работающих с системой "1С:Предприятие",
некоторые отчеты формируют и анализируют в Microsoft Excel. Самое удоб-
ное средство анализа данных в MS Excel — это сводные таблицы (рис. 4.1)
и сводные диаграммы.

с D
_L _j
В Е
A
-f—
1 (Тип рРасход т Текущие расходы по филиалу
2 Автор IMAV -г
э:
Месяц т(
Сумма, $
4
032004
Счет -^(Аналитика •*• OS.2004 ОЬщий итог
5
-5095,68
сч. 91 -4688,02 -407,66
6
-4812 -9116,2
сч. 60 -13928,2
7
-1739,4
; -1739,4
сч. 68
О


-2929,64 -2929,64
9 сч. 69
-17028,9
10 сч. 70 Зарплата за август -17028,9
I -12228,41
Аванс за сентябрь -12228,41
11
; -29257,31
сч. 70 Итог -29257,31
12
: -1854,6 -1854,6
13 сч. 73
-346,611 -627,48
14 сч. 10 -974,09
-390
15 сч. 20 -390
-383,18 -383,18
16 сч. 26
-56552,1
17 Общий итог -9846,63: -46705,47
18
Рис. 4.1. Пример сводной таблицы MS Excel


С помощью встроенного языка системы "1С:Предприятие" и OLE-сервера
MS Excel можно формировать сводные таблицы и диаграммы. Рассмотрим
пример их формирования (листинг 4.41).

I Листинг 4.41. Создание сводной таблицы MS Excel для версии 7.7

Функция СформироватьСводнуюТаблицу(ТЗ, Заголовок, Период, Условия)
Перем Значение;


Если ТЗ..КоличествоСтрок() < 2 Тогда
Предупреждение("Невозможно сформировать сводную таблицу, содержащую
174 Глава 4

менее двух строк!", 5);
Возврат 0;
КонецЕсли;


Попытка
// Запускаем Excel-Server
Excel = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки О,"!");
Возврат 0;
КонецПопытки;


Попытка
Excel.Application.Workbooks.Add(1);
Excel.ActiveSheet.Name = "Данные";


// Выводим данные
Для СтрокаТЗ = 1 По ТЗ.КоличествоСтрок() Цикл
Для КолонкаТЗ = 1 По ТЗ.КоличествоКолонок() Цикл
Значение = ТЗ.ПолучитьЗначение(СтрокаТЗ, КолонкаТЗ);
Excel.ActiveSheet.Cells(СтрокаТЗ+1, КолонкаТЗ).Value = Значение;
Если СтрокаТЗ = 1 Тогда
ТЗ.Получить ПараметрыКолонки(КолонкаТЗ,"",0,0,Значение,0,"",1);
Excel.ActiveSheet.Cells(1, КолонкаТЗ).Value = Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;


// Выводим сводную таблицу
Excel.Application. ActiveWorkbook.PivotCaches() . Add(1, "Данные!R1C1:R" +
(1+ТЗ.КоличествоСтрок()) + "С" +
ТЗ.КоличествоКолонок()). CreatePivotTable("", "СводнаяТаблица");
Excel.ActiveSheet.Name = "Таблица";


// Далее идет цветовое оформление
Excel.Rows("1:4").Select ();
Excel.Selection.Insert(-4121);
Excel.ActiveSheet.Cells(1, 1).Value = Заголовок;
Excel.ActiveSheet.Cells(1, 1).Font.Size = 16;
Использование OLE Automation 175

Excel.ActiveSheet.Cells(1, 1).Font.Colorlndex = 3;
Excel.ActiveSheet.Cells(1, 1).Font.Bold = 1;
Excel.ActiveSheet.Cells(1, 1).Font.Italic = 1;
Excel.ActiveSheet.Cells(1, 1).Font.Underline = 2;

Excel.ActiveSheet.Cells(2, 1).Value = Период;
Excel.ActiveSheet.Cells(2, 1).Font.Size = 8;
Excel.ActiveSheet.Cells(2, 1).Font.Colorlndex = 3;

Excel.ActiveSheet.Cells(3, 1).Value = Условия;
Excel.ActiveSheet.Cells(3, 1).Font.Size = 8;

Excel.ActiveSheet.Cells(7, 1).Select();

// Все готово. Показываем окно Excel
Excel.Application.Visible = 1;
Исключение
Excel.Quit();
Сообщить(ОписаниеОшибки О,"!");
Возврат 0;
КонецПопытки ;

Возврат 1;
КонецФункции //СформироватьСводнуюТаблицу

В данном примере функция СформироватьСводнуюТаблицу имеет четыре па-
раметра.
О тз — таблица значений, которая будет использоваться в качестве источ-
ника данных для формирования сводной таблицы. Имена колонок таб-
лицы значений будут совпадать с именами колонок сводной таблицы MS
Excel;
О Заголовок — название отчета (тип Строка), которое будет выводиться
в первой строке таблицы Excel;
О период — период формирования отчета (тип Строка), которое будет вы-
водиться во второй строке таблицы Excel;
О УСЛОВИЯ — условия и комментарии к отчету (тип строка), которые будут
выводиться в третьей строке таблицы Excel.
Функция возвращает 1, если сводная таблица была успешно сформирована,
и о — иначе.
176 Глава 4

Работа с Microsoft PowerPoint
С помощью объекта PowerPoint.Application, предоставляемого OLE-сервером
MS PowerPoint, можно программно открывать и манипулировать презента-
циями.
Основным в объектной модели PowerPoint является объект Application,
содержащий коллекцию Presentations (презентации) объектов типа
Presentation. Каждый объект типа Presentation содержит коллекцию
slides (слайды) объектов типа slide, соответствующих слайдам презента-
ции. Слайды, в свою очередь, содержат коллекции shapes типа shape, соот-
ветствующие элементам слайдов презентации. Манипуляция презентациями,
слайдами и их элементами осуществляется путем обращения к свойствам
и методам этих объектов.

Запуск MS PowerPoint и открытие презентаций
Для открытия уже существующей презентации документа следует восполь-
зоваться методом Open коллекции Presentations:
Арр.Presentations.Open("С:\MyPresentation.ppt");
Следует отметить, что свойство ActivePresentation объекта
PowerPoint.Application указывает на текущую активную презентацию сре-
ди одной или нескольких открытых. Кроме того, к рабочей книге можно
обращаться по ее порядковому номеру. Например, ко второй открытой ра-
бочей книге можно обратиться так:
Арр.Presentations.Item(2) .
В листинге 4.42 приведен пример запуска MS PowerPoint и открытие пре-
зентации.




// Создание объекта приложения PowerPoint
Арр = Новый СОМОбъект("PowerPoint.Application");
// Установка видимости окна приложения
Арр.Visible = Истина;
// Открытие презентации
Арр. Presentations. Open ("С: \Фундамент.ppt") ;
// Уничтожение объекта приложения
Арр.Quit();

Отметим также, что в случае PowerPoint, в отличие от Word и Excel, объ-
ект Application не имеет метода Activate для того, чтобы сделать актив-
Использование OLE Automation 177

ной конкретную презентацию среди нескольких открытых. Для реше-
ния этой задачи следует обращаться к коллекции windows объекта
Presentation либо К объектам DocumentWindow И SlideShowWindow, на-
пример: А р р . P r e s e n t a t i o n s . I t e m ( l ) . W i n d o w s . I t e m ( l ) . A c t i v a t e ( ) .

Сохранение, печать и закрытие презентаций
Закрытие презентации можно осуществить, используя метод close:
Арр. P r e s e n t a t i o n s . I t e m ( 2 ) . C l o s e ( ) ИЛИ Арр. ActivePresentation.Close ( ) .
Обратите внимание на то, что в случае PowerPoint метод close закрывает
презентацию, не предлагая пользователю сохранить изменения. К тому же
он не имеет параметров, с помощью которых можно было бы повлиять на
возможность сохранения изменений.

^ Примечание
В случае Word и Excel метод Close обладал параметрами, влияющими на
возможность сохранения документа перед его закрытием.

Для сохранения презентации следует воспользоваться методом save или
SaveAs. Например:
Арр.Presentations.Item(2).Save();
Арр. Presentations. Item(2) . SaveAs ("С: \Фундамент-Копия.ppt") .
В общем случае метод SaveAs имеет три параметра, влияющих на то, как
именно сохраняется презентация. Первый из них (обязательный) и пред-
ставляет собой строку, содержащую имя файла, в котором сохраняется пре-
зентация. Если в этой строке путь к файлу не указан, файл сохраняется
в текущем каталоге.
Второй параметр (необязательный). Он указывает, в каком формате сохра-
няется презентация. Этот параметр может принимать значения:
П 1 — формат текущей версии PowerPoint;
П 2 — формат PowerPoint (версия 7);
П з — формат PowerPoint (версия 4);
П 4 — формат PowerPoint (версия 3);
П 5 — сохранить как шаблон;
П б — формат RTF;
П 7 — формат SlideShow (*.pps);
d 8 — формат PowerPoint Addln (*.ppa);
П ю — формат PowerPoint 4 Far East (версия для Китая, Японии, стран
Юго-Восточной Азии);
Глава 4
178

П и — формат по умолчанию, определяемый текущими настройками
PowerPoint;
О 12 — формат HTML;
П 13 — формат HTML (версия 3);
П 14 — формат HTML для текстов в двухбайтовой кодировке;
О 15 — формат WMF;
О 16 — формат GIF;
О 17 — формат JPG
П 18 — формат PNG;
П 19 — формат BMP.
Третий параметр указывает, нужно ли внедрять в презентацию используе-
мые в ней шрифты. Он может принимать значения истина (внедрять шриф-
ты) или ложь (не внедрять шрифты). По умолчанию используется значение
Ложь.

Закрыть PowerPoint можно с помощью метода Quit объекта
PowerPoint.Application. В случае PowerPoint этот метод параметров не
имеет.

<<

стр. 5
(всего 10)

СОДЕРЖАНИЕ

>>