Глава 4 Использование OLE Automation
Понятие OLE Automation
OLE — это аббревиатура названия технологии Object Linking and Embedding (связывание и внедрение объектов). Она указывает на способность работать с составными объектами, созданными в других приложениях (например, рисунками, документами и т. п.). Основные термины, с которыми оперирует данная технология, — это OLE-объект, сервер приложения и контейнер приложения.
OLE-объектом называют объект, созданный в другом приложении и сохранивший связь с этим приложением. Точечный рисунок, созданный в редакторе Paint, электронные таблицы в формате Excel или диаграмма из MS Graph — все они могут быть OLE-объектами, если будут вставлены в документ соответствующим образом. Если не вставлять их как OLE-объект, то связь с оригинальным приложением отсутствует.
Контейнером приложения OLE называют приложение, в котором создается составной документ, содержащий OLE-объект, позволяя обрабатывать его в исходном приложении (например, таком как Paint или Excel), которое использовалось для создания этого объекта.
Сервером приложения OLE (OLE Server Application) называют приложение, создающее объекты, которые можно поместить в документ-контейнер. Программы — "1С:Предприятие", Microsoft Word и Excel являются приложениями, которые могут выступать и как OLE-сервер, и как OLE-контейнер. Другими словами, эти приложения могут создавать новые OLE-объекты, а такжет хранить OLE-объекты, созданные в других приложениях.
Первоначально механизм OLE был задуман как технология интеграции программных продуктов, входящих в комплект Microsoft Office, в другие приложения. Первое воплощение OLE (OLE 1) представляло собой механизм создания и работы с составными документами (compound documents).
С точки зрения пользователя, составной документ выглядит единым набором информации, но фактически содержит элементы, созданные двумя или несколькими разными приложениями. С помощью OLE 1 пользователь мог, например, объединить электронную таблицу, созданную Microsoft Excel, с текстовым документом Microsoft Word. Идея состояла в том, чтобы документо-ориентированная (document-centric) модель работы с компьютером позволила бы пользователю больше думать об информации и меньше о приложениях, ее обрабатывающих. Как следует из слов "связывание и внедрение", составные документы можно создать, либо связав их, либо полностью внедрив один документ в другой.
OLE 1, как и большинство первых версий программных продуктов, была несовершенна. Архитекторам следующей версии предстояло улучшить первоначальный проект. Вскоре они поняли, что составные документы это лишь частный случай более общей проблемы — как разные программные компоненты должны предоставлять друг другу сервисы? Для решения этой проблемы архитекторы OLE создали группу технологий, область применения которых гораздо шире составных документов. Основу OLE 2 составляет важнейшая из этих технологий — "Модель многокомпонентных объектов" (Component Object Model или СОМ). Новая версия OLE не только обеспечивает поддержку составных документов лучше, чем первая, но и несомненно идет куда дальше простого объединения документов, созданных в разных приложениях. OLE 2 позволяет по-новому взглянуть на взаимодействие любых типов программ.
Электронные таблицы, текстовые процессоры и другие программы предоставляют множество полезных возможностей. Почему бы не обеспечить доступ к ним и другому программному обеспечению? Чтобы это стало возможным, приложения должны предоставлять свои сервисы не только человеку, но и программам, т. е. они должны быть программируемыми. Обеспечение программируемости и является целью "Автоматизации" (Automation, первоначально называлась OLE-автоматизацией).
Приложение можно сделать программируемым, обеспечив доступ к его сервисам, через обычный СОМ-интерфейс. Однако так поступают редко. Вместо этого доступ к сервисам приложений осуществляется через диспинтер-фейсы (dispinterface). Они очень похожи на интерфейсы (имеют методы, клиенты осуществляют к ним доступ через указатели интерфейса и т. д.). Однако диспинтерфейсы имеют и существенные отличия. В частности, их методы гораздо проще вызывать клиентам, написанным на простых языках типа встроенного языка системы "1С:Предпрнятие".
Использование системы "1С:Предприятие" в качестве OLE Automation сервера
Методы работы с OLE-объектами существенно отличаются в разных версиях системы "IС:Предприятие". Поэтому их рассмотрение будет происходить по отдельности, для каждой версии системы.
Использование OLE Automation сервера в версии 7.7
Для запуска системы "1С:Предприятие", в качестве OLE Automation сервера, из внешнего приложения, выполняется следующая последовательность действий:
1. Создается объект с OLE идентификатором:
• viCEnterprise. Application — версия независимый ключ;
• V77 .Application — версия зависимый ключ;
• ?і7s.Application — версия зависимый ключ, SQL-версия;
• V77L. Application — версия зависимый ключ, локальная версия;
• V77M.Application — версия зависимый ключ, сетевая версия.
2. Выполняется инициализация системы "ІС:Предприягие" методом
Initialize{).
3. Вызываются атрибуты и методы системы "1C:Предприятие”, как OLE Automation сервера.
"1С:Предприятие", в качестве OLE Automation сервера, имеет 4 метода:
1. initialize о — выполняет инициализацию системы "1С:Предприятие".
2. Createobject о — создает объект агрегатного типа данных системы ”1С:Предприятие" и возвращает ссылку на него.
3. Е?аіЕхрг () — вычисляет выражение системы.
4. ExecuteBatch() — выполняет последовательность операторов.
Подключение к базе данных
Для открытия и инициализации базы данных системы "1C:Предприятие" (версии 7.7) предназначен метод initialize о , который имеет следующие параметры:
? имя объекта. RMTrade — имя переменной и ключевое слово RMTrade;
О команднаяСтрока — командная строка, в которой можно прописать путь к базе данных, имя пользователя и пароль;
О Показывать Заставку — Либо пустая строка, Либо — "NO_SPLASH_SHOW", чтобы не показывать заставку при загрузке.
Для того чтобы открыть базу через OLE, необходимо создать объект с идентификатором OLE, выполнить инициализацию базы и проверить успешность ее выполнения. Если в методе initialize указать только первый параметр, то при открытии базы открывается окно выбора, в котором предлагается выбрать пользователя и ввести пароль (листинг 4.1).
іе данных
БазаОЬЕ = СоздатьОбъект("V77.Application");
Открыта = БазаОЬЕ.Initialize(БазаОЬЕ.RMTrade,,);
Если Открыта = 0 Тогда // True=-l, False=0
Сообщить("Не удалось открыть базу данных!");
Возврат;
КонецЕсли;
Доступ к объектам базы данных
Для доступа к объектам агрегатных типов предназначен метод createobject который имеет единственный параметр — строковое выражение, значение которого содержит имя агрегатного типа данных, заданного в конфигураторе. Например: "Справочник. Номенклатура", "Документ.ПриходнаяНакладная"И Т. П.
Этот метод создает объект агрегатного типа данных системы "1С:Предприятие" и возвращает ссылку на него.
Для доступа к константам, перечислениям и видам субконто достаточно использовать свойства глобального контекста Константа. Перечисление ИЛИ видыСубконто сервера приложения (листинг 4.2).
 |
1 |
Сообщить(БазаОЬЕ.Константа.ДатаЗапретаРедактирования);
Сообщить(БазаОЬЕ.Перечисление.КатегорияКонтрагента.Поставщик);
Сообщить(БазаОЬЕ.ВидСубконто.Контрагенты);
Для сравнения перечислений или видов субконто разных баз данных (OLE и местной) необходимо сначала получить строковое или числовое представление данного перечисления или вида субконто с помощью методов идентификатор или значениепономеру в местной базе, а затем найти соответствующее ему значение в OLE-базе (листинг 4.3).
Листинг 4.3. Поиск вида субконто в OLE
.................................-_________________________________________________________....._______________________;______________________________________'
ВыбранныйВидСубконтоИд = ВыбранныйВидСубконто.Идентификатор();
ВыбранныйВидСубконтоОЬЕ = БазаОЬЕ.ВидСубконто.ЗначениеПоИдентификатору (ВыбранныйВидСубконтоИд));
В данном примере переменная выбранныйвидсубконто содержит значение типа "видСубконто", которое определено вне данного кода, например, на форме.
Для доступа к справочникам и документам необходимо использовать метод CreateObject. После создания объекта справочника или документа к нему применимы все методы, касающиеся соответствующего объекта в среде "1С:Предприятие" (листинг 4.4).
b ичдтМИ кщшишм| JVTWMST?]
1 _
Листинг 4.4. Доступ к справочникам
'' uiu -iiL LIl Імаідіід-ii 1'.—_. sfe; _
СправочникОЬЕ = БазаОЬЕ.CreateObject("Справочник.Фирмы"); СправочникОЬЕ.ВыбратьЭлементы();
Пока СправочникОЬЕ.ПолучитьЭлемент() Цикл Сообщить(СправочникОЬЕ.Наименование);
КонецЦикла;
В данном примере в операторе сообщить для вывода наименования элемента справочника необходимо использовать именно конструкцию СправочникОЬЕ.Наименование, а не СправочникОЬЕ.ТекущийЭлемент() . Иначе вместо строкового или числового представления этого элемента программа выдаст просто "ole". По аналогии также не будет работать метод текущийдокумент Тем не менее через OLE-объект можно использовать методы: Новый () , Записать И Др.
Доступ к документам производится так же, как и к справочникам (листинг 4.5).
Листинг 4.5. Доступ к док
// Поиск контрагента в OLE-базе
СправочникОЬЕ = БазаОЬЕ.CreateObject("Справочник.Контрагенты"); СправочникОЬЕ.НайтиПоКоду(ВыбКонтрагент.Код, 0);
// Создание нового документа
ДокуііентОЬЕ = БазаОЬЕ.CreateObject("Документ.Контакт");
flOKyMeHTOLE.Новый();
// Заполнение реквизита Контрагент из OLE-базы flOKyMeHTOLE . Контрагент = СправочникОЬЕ. ТекущийЭлемент () ; ДокументОЬЕ. Тема = "Пример";
ДокументОЬЕ.Записать();
Если ДокументОЬЕ.Провести()=0 Тогда
Сообщить("Ошибка! Документ не проведен.");
КонецЕсли;
Важно отметить тот факт, что нельзя сравнивать или присваивать два или несколько элементов справочника или документов, находящихся в разных базах. Для поиска соответствующего элемента или документа в OLE-базе необходимо ИСПОЛЬЗОВать методы: НайтиПоКоду, найтиПоНаименованию И Т. П. В листинге 4.5 для заполнения контрагента в документе контакт используется элемент базы OLE, предварительно найденный по коду, соответствующему коду контрагента в местной базе. Это же касается и объектов типа "Счет".
Для доступа к регистрам используется тот же метод CreateObj ect (листинг 4.6).
Kiw-cinl___
; Листинг 4.6. Доступ к регисі _
РегистрОЬЕ = БазаОЬЕ.CreateObject("Регистр.Касса") РегистрОЬЕ.ВыбратьИтоги();
Пока РегистрОЬЕ . ПолучитьИтог О = 1 Цикл
Сообщить("Остаток в кассе " + РегистрОЬЕ.Касса.Наименование " = " + РегистрОЬЕ.Сумма);
КонецЦикла;
Вычисление выражений
Для вычисления выражений, написанных на встроенном языке системы "1С:Предприятие", предназначен метод Е?аІЕхрг, который возвращает результат вычисления. Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом данных преобразуется к строковому типу. Так же с помощью метода EvaiExpr можно выполнять экспортируемые функции глобального модуля (листинг 4.7).
—-----т-т'-'гт.ттл-тггт'""'""----
Листинг 4.7. Вычисление выражений
—И—
: 1------¦—--—I—’ I——I——і——.——^—..—I ..—рчЯІНВиН^НВЗиіиЗ^Н^Н _ ННННшЛНЛ
// Выполнение функции глобального модуля
ФорматированноеИмяПользователя = БазаОЬЕ.Е?аІЕхрг ("глДополнитьСтрокуП (" + ИмяПользователя + ", "" 255)");
СуммаПрописью = БазаОЬЕ.Е?аІЕхрг("глСуммаПрописью(" + Сумма + ", " +
Валюта + ") ");
// Вычисление выражения используя стандартные функции СуммаПрописью = БазаОЬЕ.Е?аІЕхрг("Цел(Лог(2.2)) * 5");
Во второй строке данного примера в функцию глСуммаПрописью. в качестве параметра валюта, необходимо передавать строку, т. к. данная функция
будет исполняться внутри подключаемого OLE-сервера, т. е. внешней подключаемой базы данных.
Выполнение операторов
Для выполнения последовательности операторов в OLE-базе используется метод ExecuteBatch, единственным параметром которого является строка, описывающая текст программы на встроенном языке системы "1С:Предприятие". Метод ExecuteBatch возвращает значение логического типа (true — если последовательность операторов выполнена успешно; false — если нет). В OLE Automation значения true и false представляются соответственно значениями -1 (минус единица) и о.
Ниже приведен пример выполнения процедур в OLE-базе (листинг 4.8).
Листинг 4.8. Выполнение операторов
СправочникОЬЕ = БазаОЬЕ.Е?аІЕхрг("СоздатьСправочникФирмы()”) СправочникОЬЕ.ВыбратьЭлементы();
Пока СправочникОЬЕ,Получить Элемент() Цикл Сообщить(СправочникОЬЕ.Наименование);
КонецЦикла;
// Выполнение процедур
БазаОЬЕ.ExecuteBatch("ПроцедураРеглІ();ПроцедураРегл2()");
Использование OLE Automation сервера в версии 8.0
Система "1C:Предприятие 8.0" может использоваться внешними приложениями в качестве OLE Automation сервера.
Обычно в этих целях "Ю.Предприятие" используют для управления конфигурациями системы программ "1С:Предприятие" из других приложений и выполнения действий аналогичным интерактивным действиям пользователя (например, построение отчетов).
Для запуска системы "ІС:Предириятие" в качестве OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:
1. Создается OLE объект с идентификатором "V8.Application".
2. Выполняется инициализация системы "1С:Предприятие" методом Connect.
3. Вызываются свойства и методы системы "1C:Предприятие" как OLE Automation сервера.
Приведем пример доступа к данным информационной базы посредством OLE Automation сервера системы "1С:Предприятие 8.0" из Visual Basic скрипта (листинг 4.9).
Листинг?Использование ЩAutomatic серв^
'•ІСгПредлриятие" 8.0
ННМНННЯІНННЯИННННЯННННННЯИНВЯНННННННННМНМЯНИЯННЯНЯН—шяявшшшвшшшшшшш
' Подключение к БД средствами OLE Automation
Set cc = CreateObject("v8.Application")
cc.Connect("File=C:\Progra~l\lcv8\Db\Trade; изг=Иванов")
' Установка видимости приложения cc.visible = True
' Задаем текст запроса
Text = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты"
' Создаем объект Запрос Set Query = cc.NewObject("Запрос")
Query.Text = Text ' Выполнение запроса Set Result = Query.Execute()
Set Choose = Result.Choose()
' Выборка результата выполнения запроса Do While Choose,Next()
' Пример вывода сообщения в OLE-базе cc.Message(Choose.Description)
Loop
' Пример вывода предупреждения в OLE-базе
cc.DoMessageBox "Форум для вопросов ", 10,
"Внимание!!!"
Данный пример последовательно выполняет все три перечисленные действия.
Некоторые версии внешних программ, в том числе и Visual Basic Script, обращающихся к программе "1C:Предприятие" посредством OLE Automation, могут неправильно интерпретировать русские идентификаторы объектов.
Примечание_^
Для обращения к свойствам и методам агрегатных типов данных системы "1С:Предприятие" из внешних приложений рекомендуется использовать их англоязычные синонимы.
При работе в качестве OLE Automation сервера "1С:Предприятие" предоставляет доступ ко всем свойствам и методам своего глобального контекста, а также позволяет включать и выключать пользовательский интерфейс (главное окно приложения). Поэтому объект OLE-сервер системы "1С:Предприятие" в качестве своих свойств может использовать: системные перечисления, значения констант, перечислений, справочников, документов и т. п., а также переменные, объявленные в модуле приложения с ключевым СЛОВОМ Экспорт.
Кроме того, OLE Automation сервер имеет одно дополнительное свойство и два метода с целью выполнения действий, специфичных для работы в режиме OLE Automation.
Единственное свойство visible имеет значение логического типа и позволяет управлять видимостью пользовательского интерфейса системы "1С:Предприятие". По умолчанию свойство имеет значение ложь.
Объект OLE-сервер системы "1C: Предприятие" в качестве своих методов может использовать системные процедуры и функции, а также процедуры и функции модуля приложения и общих модулей, объявленные с ключевым словом Экспорт. Кроме того, OLE-сервер системы "1C:Предприятие" имеет два дополнительных метода: Connect и Newobject.
Метод connect выполняет инициализацию системы "1С:Предприятие" и имеет единственный параметр — строку, используемую для соединения с информационной базой. Метод возвращает истина, если инициализация прошла успешно, или ложь, если нет.
Существует два варианта подключения к OLE-серверу системы "ЮПредприятие", которые зависят от варианта использования информационной базы (файловый или клиент-серверный варианты). Приведем пример подключения файловой и клиент-серверной версии системы "1С:Предприятие" (листинг 4.10).
С Us r — имя пользователя, под которым будет происходить авторизация.
? Pwd — пароль пользователя.
Для подключения к базе данных в клиент-серверном варианте используются четыре параметра.
П Srvr — указывает имя сервера, на котором работает сервер приложений системы "1С:Предприятие";
CD Ref — указывает имя базы данных на сервере приложений;
? Us r — определяет имя пользователя, под которым будет происходить авторизация;
П Pwd — пароль пользователя.
Второй специальный метод OLE-сервера системы " 1C: Предприятие” — Newobject, который создает объект агрегатного типа данных системы "1С:Предприятие" и возвращает ссылку на него. Единственный параметр метода — строковое выражение, значение которого содержит имя агрегатного типа данных, объявленного в конфигураторе.
В листинге 4.9 используется метод NewGbject для создания объекта типа запрос.
Поскольку система "1C:Предприятие" может создавать и использовать OLE Automation серверы, то из системы "1C:Предприятие" можно обращаться к другим информационным базам.
В последующем материале книги будут показаны примеры использования OLE Automation сервера системы "1С:Предприятие 8.0" из среды "1С:Предприятия".
Доступ к объектам базы данных
Как уже было сказано ранее, для создания объектов агрегатного типа используется метод Newobject, но для доступа к константам и перечислениям достаточно использовать свойства глобального контекста константы и перечисления сервера приложения (листинг 4.11).
 |
База = Новый |
// Доступ к константам
Сообщить(База.Константы.ОсновнаяВалюта.Получит().Наименование);
// Доступ к перечислениям
Сообщить(База.Перечисления.Периодичность.День)
Для доступа к справочникам и документам можно использовать метод NewObject. Однако можно использовать и свойства глобального контекста Справочники (листинг 4.12) и документы (листинг 4.13). После создания объекта справочника или документа к нему применимы все методы, касающиеся соответствующего объекта в среде "1 С:Предприятие".
і Листинг 4.12. Доступ к справочникам ;
База = Новый СОМОбъект("?8.Application");
База.Connect(СтрокаПодключения);
// Доступ к справочникам
СправочникОЪЕ = База.Справочники.Контрагенты;
Выборка = СправочникОЪЕ.Выбрать();
// Обход выборки элементов справочника Пока Выборка.Следующий() Цикл Если Не Выборка.ЭтсГруппа Тогда Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЦикла;
// Создание нового элемента справочника
СправочникОЪЕ = База.Справочники.Контрагенты;
НовыйЭлемент = СправочникОЪЕ.СоздатьЭлемент();
НовыйЭлемент. Наименование = "Михайлов Андрей ”;
НовыйЭлемент.Комментарий = "Создан автоматически.";
НовыйЭлемент.Записать() ;
Доступ к документам производится так же, как и к справочникам.
Листинг 4.1:5. Доступ к документам
База = Новый СОМОбъект("?8.Application");
База.Connect(СтрокаПодключения);
// Поиск контрагента в OLE-базе
СправочникОЪЕ = База.Справочники.Контрагенты;
СпрЭлемент = СправочникОЪЕ.НайтиПоНаименованию("Михайлов Андрей");
// Создание нового документа
ДокументОЬЕ = База.Документы.ПоступлениеТоваров.СоздатьДокумент(); ДокументОЬЕ.Дата = ТекущаяДата();
ДокументОЬЕ.Контрагент = СпрЭлемент;
ДокументОЬЕ.УстановитьНовыйНомер();
ДокументОЬЕ.Записать();
Так же, как и в версии 7.7 системы "1C:Предприятие", в объектах OLE-базы данных можно использовать только ее же объекты. В примере, рассмотренном выше (листинг 4.13), для заполнения реквизита документа контрагент используется элемент справочника контрагенты той же OLE-базы. Это правило касается не только объектов агрегатных типов (справочников, документов, регистров и т. п.), но и универсальных коллекций значений, таких как массивы, структуры, списки значений и т. п.
Рассмотрим пример вывода курса доллара из регистра сведений (листинг 4.14).
ШІШНННШИННІННШШННШВІІИІІНННННІШНННІІІЛММШ
Листинг 4.14. Доступ к регистрам сведений
База = Новый СОМОбъект("?8.Application");
База.Connect(СтрокаПодключения);
// Доступ к регистрам сведений
// Поиск элемента справочника с наименованием "USD"
СправочникОЬЕ = База.Справочники.Валюты;
СпрЭлемент = СправочникОЬЕ.НайтиПоНаименованию("USD");
// Создаем структуру в OLE-базе Структура = База.NewObject("Структура");
Структура.Вставить("Валюта", СпрЭлемент);
// Получаем курс доллара на текущую дату
РегистрСвденийОЬЕ = База.РегистрыСведений.КурсыВалют;
Структура = РегистрСведенийОЬЕ.ПолучитьПоследнее(ТекущаяДата(), Структура); Сообщить'"Курс доллара = + Структура,Курс);
Сообщить("Кратность = " + Структура.Кратность);
В этом примере для использования фильтра применяется структура, которая создается с помощью метода NewObject.
Примечание
Важно иметь в виду, что если создать структуру в исходной конфигурации с помощью конструктора Новый Структура (), то произойдет ошибка.
Как следует из кода, приведенного в листинге 4.14, работа с регистрами полностью аналогична работе со справочниками и документами.
Использование запросов
В системе "1C: Предприятие" использование запросов является самым основным способом получения сводных данных, поэтому и при использовании системы в качестве OLE Automation сервера очень важно уметь использовать механизмы запросов.
Для выполнения запроса к данным OLE-базы достаточно с помощью метода Newobject создать объект запрос и далее работать с ним стандартными методами.
Рассмотрим простой пример вывода списка наименований контрагентов (листинг 4.15).
Листинг 4,15. Использование запросов
База = Новый СОМОбъект("V8.Application") База.Connect(СтрокаПодключения);
Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
// Создаем объект запрос
Запрос = База.NewObject("Запрос");
Запрос.Текст = Текст,•
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Обход результата выполнения запроса Пока Выборка.Следующий(5 Цикл Сообщить(Выборка.Наименование);
КонецЦикла;
Вызов пользовательских интерфейсов
В предыдущем примере показана возможность выборки данных с помощью запроса и вывода результатов запроса в основную базу. Эти же данные можно визуализировать и в базе данных, используемой в качестве OLE Automation сервера.
Для начала необходимо показать основное окно приложения с помощью свойства visible, а затем можно вызывать стандартные операторы — сообщить, предупреждение, а также открывать формы объектов и формировать отчеты (листинг 4.16).
Листинг 4.16. Вызов пользое
База = Новый СОМОбъект("V8.Application")
// Шаг 1. Соединение с базой данных
База.Connect(СтрокаПодключения);
// Шаг 2, Установка видимости главного окна приложения
База.Visible = Истина;
// Шаг 3, Пример вывода сообщения в OLE-базе
База.Сообщить("Пример сообщения через OLE Automation");
// Пример вывода предупреждения в OLE-базе
База.Предупреждение("Форум для вопросов http://forum.erpg.ru",,"Внимание!!!");
// Шаг 4, Открытие формы списка справочника
Форма = База.Справочники.Контрагенты.ПолучитьФорму("ФормаСписка"); Форма.Открыть();
// Шаг Создание и формирование отчета
НовыйОтчет = База.Отчеты.Монитор.Создать();
НовыйОтчетФорма = НовыйОтчет.ПолучитьФорму();
ВыбраннаяНастройка = База.ВосстановитьЗначение("Монитор_настройка");
Если ВыбраннаяНастройкаоНеопределено Тогда
НовыйОтчетФорма.НачалъноеЗначениеВыбора = ВыбраннаяНастройка; КонецЕсли;
// Шаг 6. Открытие формы сформированного отчета
НовыйОтчетФорма.Открыть();
В приведенном примере последовательно выполняются следующие действия:
1. Соединение с базой данных.
2. Установка видимости главного окна приложения.
3. ВЫВОД сообщений С ПОМОЩЬЮ операторов Сообщить И Предупреждение.
4. Открытие формы списка справочника контрагенты.
5. Создание и формирование отчета монитор основных показателей.
6. Открытие формы сформированного отчета.
Данный пример полностью работоспособен на конфигурации "1С:Управление торговлей" (редакция 10).
Доступ к метаданным
Для доступа к метаданным можно использовать свойство глобального контекста Метаданные. Приведем пример вывода всех справочников и их реквизитов для конфигурации, используемой в качестве OLE Automation сервера (листинг 4.17).
Листинг 4.17. Доступ к метаданным j
База = Новый СОМОбъект("?8.Application");
База.Connect(СтрокаПодключения);
МетаСправочники = База.Метаданные.Справочники;
// Перебираем все справочники
Для каждого Справочник Из МетаСправочники ііыыі'і
Сообщить(Справочник.Имя);
// Перебираем все реквизиты
Для каждого Реквизит Из Справочник.Реквизиты Цикл Сообщить(Символы.Таб + Реквизит.Имя);
КонецЦикла;
КонецЦикла;
Использование СОМ-соединения в версии 8.0
Основная задача использования СОМ-соединения для конфигурации системы "1С:Предприятие 8.0" — это обеспечение надежного и быстрого программного доступа к объектам конфигурации из внешних приложений.
СОМ-сервер системы ” 1C:Предприятие 8.0" реализован в виде библиотеки COMCntr.dll, которая выполняется в рамках исполняющего процесса.
Применение СОМ-соединения во многом похоже на использование OLE Automation сервера, но существуют и очень важные отличия. Приведем некоторые общесистемные отличия СОМ-соединения от OLE Automation.
При использовании СОМ-соединения:
? затрачиваются гораздо меньше системных ресурсов;
? происходит более быстрая установка соединения с базой данных;
О происходит более быстрое обращение к свойствам и методам объектов;
П полностью отсутствуют пользовательские интерфейсы.
Отличия в программном использовании СОМ-соединения можно определить следующим образом:
О OLE-объект создается с идентификатором ”?8 . сомсоппесюг";
О отсутствует свойство visible;
П не работают все методы системы "1С:Предприятие", касающиеся визуализации объектов;
П недоступен модуль приложения, но при этом доступен модуль внешнего соединения;
П из общих модулей доступны только те, у которых установлено свойство
Внешнее соединение;
П метод connect возвращает объект соединения с базой данных (в OLE Automation метод возвращал значение логического типа, а доступ к базе данных происходил через объект, созданный с помощью идентификатора "?8.Application").
Приведем пример подключения к базе данных системы "1C:Предприятие 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 = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты"
Создаем объект Запрос Set Query = con.NewObjcct("Запрос")
Query.Техд = Text
' Выполнение запроса Set Result = Query.Execute()
Set Choose = Result.Choose()
ResultChoose =
Выборка результата выполнения запроса
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. Доступ к справочникам
L-----------_______________...—....-----.........
v8 = Новый СОМОбъект("V8.COMConnector"); База = ?8.Connect(СтрокаПодключения);
// Доступ к справочникам
СправочникОЬЕ = База.Справочники.Контрагенты;
Выборка = СправочникОЬЕ.Выбрать();
// Обход выборки элементов справочника Пока Выборка.Следующий() Цикл Если Не Выборка.ЭтоГруппа Тогда Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЦикла;
// Создание нового элемента справочника
СправочникОЬЕ = База.Справочники.Контрагенты;
НовыйЭлемент = СправочникОЬЕ.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Михайлов Андрей";
НовыйЭлемент.Комментарий = "Создан автоматически.";
НовыйЭлемент.Записать();
Данный пример отличается от приведенного в листинге 4.12 только способом создания объекта и методом подключения к базе данных.
Работа с 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. Основные методы работы с MicrosoftWord
// Создание объекта MS Word Word = Новый СОМОбъект("Word.Application"); // Установка видимости приложения
Word.Visible = Истина;
// Добавление нового документа в приложение
Word.Documents.Add();
// Получение активного документа Документ = Word.ActiveDocument ();
// Добавить параграф
Документ.Paragraphs.Add();
II Добавить текст
Документ.Paragraphs(НомерПараграфа).RangeO.InsertAfter(Текст);
// Стилевое оформление
Документ.Paragraphs(НомерПараграфа).Range().Style="3aro.noBOK 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: Word. 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.Item(2).Close() ИЛИ Word.ActiveDocument.Close().
Метод close имеет несколько необязательных параметров, влияющих на правила сохранения документа. Первый из них влияет на то, сохраняются ли внесенные в документ изменения, и может принимать три значения:
По — не сохранять изменения;
П -1 — сохранять изменения;
О -2 — вывести диалоговое окно с соответствующим вопросом.
Второй параметр влияет на формат сохраняемого документа:
CJ 0 — сохранить в формате 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.
Вставка текста и объектов в документ и форматирование текста
Для создания абзацев в документе можно использовать коллекцию Paragraphs объекта Document, представляющую набор абзацев данного документа. Добавить новый абзац можно с помощью метода Add этой коллекции: Word.ActiveDocurnent.Paragraphs.Add().
Для вставки собственно текста в документ, тем не менее, применяется не объект Paragraph, а объект Range, представляющий любую непрерывную часть документа (в том числе и вновь созданный абзац). Этот объект может быть создан разными способами. Например, можно указать начальный и конечный символы диапазона (если таковые имеются в документе), указать номер абзаца, или указать несколько абзацев, следующих подряд (листинг 4.21).
Гі
Листинг 4.21. Вставка текста в документ Microsoft Word
// 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("Это вставляемый текст");
Вставить текст можно с помощью методов insert Before (перед диапазоном) или InsertAfter (после диапазона) объекта Range.
Помимо объекта Range текст можно вставлять с помощью Selection, являющимся свойством объекта word.Application и представляющим собой выделенную часть документа (этот объект создается, если пользователь выделяет часть документа с помощью мыши, и может быть также создан с помощью приложения-контроллера). Сам объект selection можно создать, применив метод Select к объекту Range, например — Word.ActiveDocument.Paragraphs.Item(3).Range.Select(). В данном примере в текущем документе выделяется третий абзац.
Если необходимо вставить строку текста в документ вместо выделенного фрагмента текста, либо перед ним, это можно сделать с помощью фрагмента кода, который приведен в листинге 4.22.
\ Листинг 4.22. Замена ' выделенного текста
// Признак замены выделенного фрагмента при вставке текста
Арр.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 ("Это текст, который мы выделим жирным шрифтом."}; // Отмена полужирного шрифта
Зе!,Font.Bold = Ложь;
// Признак конца параграфа Sel.TypeParagraph();
// Установка стиля текста Sel. Style = "Заголовок 1";
Sel.TypeText("Это текст, который станет заголовком");
Sel.TypeParagraph();
Для наложения на вставляемый текст определенного заранее стиля можно использовать свойство style этого же объекта (листинг 4.24).
Нередко документы Word содержат данные других приложений.
Простейший способ вставить такие данные в документ — использование метода Paste объекта Range. Естественно, в этом случае в буфере обмена уже должны содержаться вставляемые данные. Если нужно поместить в буфер обмена часть документа Word, это можно сделать с помощью метода Сору объекта Range. Пример копирования и вставки данных приведен в листинге 4.24.
: Листинг 4.24. Копирование и вставка данных в документ
// Копирование данных
Rng = Word.Selection.Range;
Rng.Copy();
// Вставка данных
Rng = Word.Selection.Range;
Rng.Collapse(0);
Rng.Paste ;
Параметр метода Collapse указывает на то, где, в начале или в конце исходного фрагмента, окажется новый объект Range или selection:
? 1 — новый объект находится в начале фрагмента;
? 0 — новый объект находится в конце фрагмента.
Перемещение курсора по тексту
Перемешать курсор по тексту можно с помощью метода Move объектов Range и Selection. Этот метод имеет два параметра. Первый указывает на то, в каких единицах измеряется перемещение — в символах (по умолчанию) или словах, предложениях, абзацах и др. Второй параметр указывает, на сколько единиц при этом нужно переместиться (это число может быть и отрицательным; по умолчанию оно равно Примеры таких перемещений курсора приведены в листинге 4.25.
Листинг 4.25. Перемещение курсора по тексту
!.....................................................................................
// Перемещение курсора на один символ вперед
Rng.Move();
// Перемещение курсора на три абзаца вперед
Rng. Move (4,3);
II Перемещение курсора на одно слово вперед
Rng.Move(2);
// Перемещение курсора на десять слов назад
Rng.Move(2, -10);
Второй параметр метода Move может принимать следующие значения:
П 1 — символ;
П 2 — слово;
П з — предложение;
? 4 — абзац;
О 6 — часть документа (например, колонтитул, оглавление и др.);
П 8 — раздел;
П 9 — колонка таблицы;
П — строка таблицы;
П 12 — ячейка таблицы;
П 15 — таблица.
Нередко для перемещения по тексту используются закладки. Создать закладку в текущей позиции курсора можно путем добавления члена коллекции Bookmarks объекта Document с помощью метода Add. При этом надо указать имя закладки в качестве его параметра.
Проверить существование закладки в документе можно с помощью метода Exists, а переместиться на нее — с помощью метода Goto объектов Document, Range или selection. Пример работы с закладками приведен в листинге 4.26.
.—— -------------—
Листинг 4.26. Работа < |  |
........................г.........—
ли
....................-.........*—
'.
// Добавить новую закладку
Word.ActiveDocument.Bookmarks.Add("MyBookmark");
// Переместить курсор на закладку
Rng = Word.ActiveDocument.Goto(-1, 2, ,"MyBookmark"};
// Вставить текст после закладки
Rng.InsertAfter("Текст, вставленный после закладки");
В методе Goto данного примера первый параметр указывает на необходимость перейти к указанной закладке. Второй — определяет, что нужно искать следующий объект в тексте.
Отметим, что с помощью метода Goto можно перемещаться не только на указанную закладку, но и на другие объекты (рисунки, грамматические ошибки и др.). Направление перемещения тоже может быть различным. Поэтому список констант, которые могут быть использованы в качестве параметров данного метода, довольно велик.
Создание таблиц
Создавать таблицы можно двумя способами. Первый заключается в вызове метода Add коллекции Tables объекта Document и последовательном заполнении ячеек данными. Этот способ при позднем связывании работает довольно медленно.
Второй способ — более "быстрый". Сущность его заключается в создании текста из нескольких строк, содержащих подстроки с разделителями и последующей конвертации такого текста в таблицу с помощью метода
ConvertToTable объекта Range.
Примечание
В качестве разделителя можно использовать любой или почти любой символ. Нужно только, чтобы он заведомо не встречался в данных, которые будут помещены в будущую таблицу.
В листинге 4.27 приведен пример создания этим способом таблицы, состоящей из трех строк и трех столбцов (в качестве разделителя, являющегося первым параметром метода ConvertToTable, используется запятая).
--------------г------ -------------—-----------------------——————...................—-..............................................I
Листинг» 4.27. Создание таблицы
__ НЯННННЯВиН ВЯ Н . --------------------...-------....—И ЯШ
Rng = Word.Selection.Range;
Rng.Collapse(0);
Rng. InsertAfter {‘
:1,. 2,
Rng.InsertParagraphAfter();
Rng.InsertAfter("4,5,6") ;
Rng.InsertParagraphAfter();
Rng.InsertAfter("7,8,9”);
Rng.InsertParagraphAfter();
Rng.ConvertToTable
Отметим, что внешний вид таблицы можно изменить с помощью свойства Format, а также с помощью свойств коллекции columns, представляющей колонки таблицы, и коллекции ROWS, представляющей строки таблицы объекта Table.
Обращение к свойствам документа
Свойства документа можно получить с помощью коллекции BuiltInDocumentProperti.es объекта Document, пример работы С которой приведен в листинге 4.28.
Г................................ ..................
Листинг 4.28. Обращение к свойствам документа
// Получаем коллекцию BuiltlnDocumentProperties Prop = Word.ActiveDocument.BuiltlnDocumentProperties;
// Выводим некоторые свойства
Сообщить("Название: " + Prop[1].Value);
Сообщить("Автор: " + Prop[3].Value);
Сообщить ("Шаблон: "I| + Prop[6] .Value) ;
Ниже перечислены все возможные индексы коллекции
BuiltlnDocumentProperties:
П 1— название;
? 2 — назначение;
П з — автор;
П 4 — ключевые слова;
? 5 — комментарии;
? 6 — шаблон;
П 7 — автор, редактировавший текст последним;
П 8 — версия;
П 9 — имя приложения;
П — когда последний раз документ был выведен на устройство печати;
? 11 — время создания;
П 12 — время, когда документ был сохранен в последний раз П 13 — суммарное время редактирования;
? 14 — число страниц;
О 15 — число слов;
П 16 — число символов;
П 17 — правила доступа к документу;
П 18 — категория;
П — формат документа;
П 20 — менеджер;
? 21 — компания;
П 22 — число байт;
? 23 — число строк;
П 24 — число абзацев;
П 25 — число слайдов;
П 26 — число комментариев;
П 27 — число скрытых слайдов;
? 28 — число мультимедиаклипов;
П 29 — путь к гипертекстовым ссылкам;
П зо — число символов без учета пробелов.
Итак, сейчас были рассмотрены основные операции, которые наиболее часто применяются при автоматизации Microsoft Word. В дальнейшем будут рассмотрены примеры практического применения Microsoft Word в качестве OLE-сервера.
Выгрузка метаданных в MS Word
С помощью объекта wora,Application, предоставляемого OLE-сервером MS Word, можно программно создавать текстовые документы, включающие в себя форматирование текстов, таблицы, рисунки и другие объекты, доступные пользователям данного редактора.
Приведем пример формирования отчета о конфигурации, который будет сформирован в MS Word (листинг 4.29).
¦ Листинг 4.29. Выгрузка метаданных в MS Word для версии 8.0
Попытка
Word = Новый СОМОбъект("Word.Application");
Исключение
Сообщить("Не удалось открыть Word");
Возврат;
КонецПопытки;
Сообщить("Ждите... Это может занять продолжительное время.
// Добавим новый документ
Word.Documents.Add();
Документ = Word.ActiveDocument()
II Определяем все возможные объекты метаданных ВсеТипы = Новый Структура();
ВсеТипы.Вставить("ОбщиеМодули", "Обшуе модули");
ВсеТипы.Вставить("ОбщиеФормы", "Обшуе формы");
ВсеТипы.Вставить("ОбщиеМакеты", "Обшуе макеты'
1);
ВсеТипы.Вставить("ОбщиеКартинки", "Обшуе картинки");
ВсеТипы.Вставить("Роли", "Роли");
ВсеТипы.Вставить("Интерфейсы", "Интерфейсы");
ВсеТипы.Вставить("Стили", "Стили");
ВсеТипы.Вставить("Языки", "Языки");
ВсеТипы.Вставить("ПланыОбмена", "Планы обмена");
ВсеТипы.Вставить("Константы", "Константы");
ВсеТипы.Вставить("КритерииОтбора", "Крутеруу отбора");
ВсеТипы.Вставить("Справочники", "Справочники");
ВсеТипы.Вставить("Документы", "Документы");
ВсеТипы.Вставить("ЖурналыДокументов", "Журналы документов");
ВсеТипы.Вставить("Перечисления", "Перечисления");
ВсеТипы.Вставить("Отчеты", "Отчеты");
ВсеТипы.Вставить("Обработки", "Обработки") ;
ВсеТипы.Вставить ("ПланыВидовХарактеристик", "План^і вудов характеристик");
ВсеТипы.Вставить("ПланыСчетов", "План^і счетов");
ВсеТипы.Вставить("ПланыВидовРасчета", "Планы вудов расчета");
ВсеТипы.Вставить("РегистрыСведений", "Регустры сведений");
ВсеТипы.Вставить("РегистрыБухгалтерии", "Регустры бухгалтерии"); ВсеТипы.Вставить("РегистрыРасчета", "Регустры расчета");
/ / Определяем все возможные параметры ВсеПараметры = Новый Структура();
ВсеПараметры.Вставить("Измерения", "Измерения"); ВсеПараметры.Вставить("Ресурсы", "Ресурсы");
ВсеПараметры.Вставить("Реквизиты", "Реквизиты");
ВсеПараметры.Вставить("Формы", "Формы");
ВсеПараметры.Вставить("Макеты", "Макеты");
ВсеПараметры.Вставить("Графы", "Графы");
ВсеПараметры.Вставить("ТабличныеЧасти", "Табличные части"); ВсеПараметры.Вставить("Значения", "Значения");
/ / Перебор тупов метаданных
157
Использование OLE Automation.
Для Каждого ТипОбъекта Из ВсеТипы Цикл
Состояние(ТипОбъекта.Значение);
Если Метаданные[ТипОбъекта.Ключ!,Количество;) > 0 Тогда
// Добавляем новый параграф Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count();
Документ.Paragraphs(Номер-1).Range(). InsertAfter( ТипОбъекта.Значение); Документ.Paragraphs(Номер).Range().Style="3aronoBOK 1";
// Перебираем конкретные объекты
Для каждого Объект Из Метаданные[ТипОбъекта.Ключ] Цикл // Добавляем новый параграф Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count() ;
Документ.Paragraphs(Номер-1).Range().InsertAfter(Объект.Синоним); Документ.Paragraphs(Номер).Range().Style="3aronoBOK 2”;
// Перебираем параметры метаданных Для каждого Параметр Из ВсеПараметры Цикл Попытка
Количество = Объект[Параметр.Ключ].Количество();
Исключение Продолжить;
КонецПопытки;
Если Количество > 0 Тогда
// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер = Документ.Paragraphs.Count();
Документ.Paragraphs(Номер-1).Range().InsertAfter (Параметр.Значение+ " (" + Количество + ")");
Документ.Paragraphs(Номер).Range().Style="3aronoBOK 3”;
// Добавляем новый параграф
Документ.Paragraphs.Add();
Номер=Документ.Paragraphs.Count();
// Добавляем новую таблицу
Документ.Tables.Add(Документ. Paragraphs(Номер).Range О, Количество+1,4);
Счетчик = 1;
// Заполняем шапку таблицы
Таблица = Документ.Tables(Документ.Tables.Count());
Таблица.Cell(Счетчик,1).Range().InsertAfter("Имя");
Таблица.Cell(Счетчик,2).Rangef).InsertAfter("Синоним"); Таблица.Cell(Счетчик,3) .ЯапдеО .InsertAfter("Тип");
Таблица.Cell(Счетчик,4).Range О.InsertAfter("Комментарий"); // Устанавливаем жирный шрифт для шапки таблицы
Документ.Range( Таблица.Cell( Счетчик,1). Range.Start, Таблица.Cell(Счетчик,4).Range.End).Font.Bold = Истина;
Для каждого Значение Из Объект[Параметр.Ключ] Цикл Счетчик = Счетчик + 1;
// Заполняем содержимое таблицы Попытка
Таблица.Cell(Счетчик,1).Range().InsertAfter(Значение.Имя);
Исключение
КонецПопытки;
Попытка
Таблица.Cell( Счетчик,2)
..Range () .InsertAfter( Значение. Синоним);
Исключение
КонецПопытки;
Попытка
СтрокаТипов =
// Выводим все типы
Для каждого Тип Из Значение. Тип. Типы О Цикл
СтрокаТипов = СтрокаТипов + " " + Строка(Тип);
КонецЦикла;
Таблица.Cell(Счетчик,3).Range().InsertAfter(СтрокаТипов);
Исключение КонецПопытки;
Попытка
Таблица.Cell( Счетчик,4).Range () .
InsertAfter( Значение.Комментарий);
Исключение
КонецПопытки;
159
Использование OLE Automation,
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// Показываем документ
Word.Visible = Истина;
//Устанавливаем активность документа
Word.Activate();
Word = Неопределено;
В данном примере используется коллекция Tables, которая предназначена для доступа ко всем таблицам документа. С помощью метода Add данного свойства можно добавлять новые таблицы в документ. Данный метод имеет три параметра:
Первый параметр — область документа, в которую помещается таблица.
2. Второй параметр — количество строк.
3. Третий параметр — количество столбцов.
Для того чтобы заполнить ячейки таблицы значениями, нужно сначала получить ссылку на данную таблицу, указав в коллекции Tables номер необходимой таблицы, а затем с помощью метода таблицы cell указать, в какую область ячейки необходимо добавить текст.
В примере специально не описывается работа с метаданными, т. к. подразумевается, что читатель знаком с данным объектом. Для версии 7.7 системы " 1C:Предприятие" приведенный код будет отличаться только принципами работы с метаданными. Все, что касается объекта Word .Application одинаково работает в обеих версиях системы.
Динамическое создание и выполнение макросов MS Word
С ПОМОЩЬЮ Объектов Word .Applicat ion И Excel. Application МОЖНО Динамически добавлять макросы в документ MS Word или Excel и выполнять их на OLE-сервере.
Перед добавлением макроса необходимо проверить, существует ли доступ к ?В-ітроекту. Для этого в MS Word 2002 (в других версиях последовательность действий может быть другой) необходимо выбрать пункт Параметры в меню Сервис; на закладке Безопасность нажать кнопку Защита от макросов
и в появившемся окне установить флажок Доверять доступ к Visual Basic Project.
Приведем пример добавления макроса в документ MS Word и запуска его на OLE-сервере (листинг 4.30).
ПК
цп ста гтг
тст ЩШІ
-7Г"
Листинг 4.30. Добавление макроса в документ MS Word и запуск его
: »
на OLE-сервере
// Определяем текст макроса на языке VBA
ТекстМакроса = "Sub VBAFunctionО
I SelectionslypeText Text ;=”
:'Добрый день, уважаемый читатель і "” ISelection.TypeParagraph
I Selection,TypeText Text:="-Добро пожаловать на наш форум""
I Application. Keyboard (1033)
I Selection.TypeText Text:="": ""
ISelection.TypeParagraph ISelection.MoveUp Unit:=wdLine, Count:=2 jSelection.EndKey Unit:=wdLine, Extend:=wdExtend I Selection.Style =ActiveDocument.Styles(""Заголовок 1"")
I Select ion. MoveDown Unit :=wdLine, Count:=l I Selection. HomeKey Unit: =wdLine
I Selection. EndKey Unit: =wdLine, Extend: =wdExtend ISelection.Style = ActiveDocument.Styles (""Заголовок 2"")
JActiveDocument.SaveAs FileName:=""C:/Example.doc"", FileFormat: =
I wdFormatDocument, LockComments :=False, Passwords"'"
1",
I AddToRecentFiles:= _
I True, WritePassword:="""", ReadOnlyRecommended:=False,
I EmbedTrueTypeFonts:= _
I False, SaveNativePictureFormat:=False, SaveFormsData:=False, I SaveAsAOCELetter:=False End Sub";
// Создание объекта
Word = Новый СОМОбъект("Word.Application");
// Добавление нового документа
Word.Documents.Add();
// Определяем ссылку на VB-проект
VBComponents = Word. ActiveDocument .VBProj ect .VBComponents;
// Добавляем новый макрос Count = VBComponents.Count ();
VBComponents.Add(1);
VBComponents.Item(Count + 1).CodeModule.InsertLines(1, ТекстМакроса);
// Выполняем макрос с именем VBAFunction
Word.Application.Run("VBAFunction");
// Закрываем OLE-сервер
Word.QuitO ;
// Очищаем переменную Word = Неопределено;
Данный пример создает новый макрос с именем VBAFunction и запускает его на OLE-сервере. Процедура VBAFunction создает новый Идокумент в формате MS Word, пишет в него две строки, форматирует их и записывает созданный документ в файл Example.doc, который будет находиться в корневом каталоге диска С:.
Проверка орфографии текстов в MS Word
Как уже было сказано ранее, текстовые процессоры и другие программы предоставляют множество полезных возможностей. Например, самый популярный текстовый редактор Microsoft Word позволяет выполнять проверку орфографии. Эту очень важную функцию редактора можно использовать в конфигурациях системы "1C: Предприятие" там, где необходимо проверить орфографию введенного текста.
Для проверки орфографии необходимо создать OLE-объект Word. Application и вызвать его метод Checkspelling. Данный метод содержит множество параметров, но обязательным является только один — строка с текстом, который будет проверяться. Метод возвращает истина, если ошибок обнаружено не будет, и ложь, если текст содержит орфографические ошибки.
Рассмотрим пример работы метода CheckSpelling (листинг 4.31).
г.-"'""—¦— ж—¦ — —1—-—— я пкщаавц» ——а—дшямдмваяддмммиддамдмнмцыа
I Листинг 4.31. Проверка наличия орфографических ошибок в тексте
......ЯКІЯЯННШІ__________ШШЯШИШЯШЯЯШЯВВИШт
Попытка
Ворд = Новый СОМОбъект("Word.Application”); //Создаем объект MS Word Исключение
Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
Возврат Ложь;
КонецПопытки;
// Проверяем строку на ошибки
ТекстБезОшибок = Ворд. Checkspelling (Текст) ;
Если ТекстБезСшибок Тогда
Сообщить("Ошибок не обнаружено!");
Иначе
Сообщить("Текст содержит орфографические ошибки!");
КонецЕсли;
Данный пример позволяет определить, содержит текст орфографические ошибки или нет, но не дает знать, в каких именно словах были допущены эти ошибки. Для определения каждого неправильно написанного слова необходимо добавить новый документ в MS Word, перенести в него проверяемый текст и проверить с помощью метода Checkspelling каждое слово, после чего закрыть документ (листинг 4.32).
Листинг 4.32. Проверка орфографии слов в тексте
¦^¦ИЯМННві^НННІНІНННЯНшНПННЯПИНІ
// Проверяем строку на ошибки ТекстБезОшибок = Ворд.Checkspelling(Текст);
Если ТекстБезОшибок Тогда / / Нет ошибок
Сообщить("Ошибок не обнаружено!");
Иначе // Обнаружены ошибки, будем проверять по словам // Запомним, был ли Word активен Ворд_Активен = Ворд.Visible;
// Добавляем новый документ
ВреыДок = Ворд.Documents.Add();
// Получаем пустую область в начале документа МояОбласть = ВремДок.Range(0, 0);
// Добавляем в эту область нашу строку
МояОбласть.InsertBefore(Текст);
// Подсчитываем число слов в области ЧислоСлов = МояОбласть.Words.Count;
Для НомерСлова = 1 По ЧислоСлов Цикл // Выбираем очередное слово ПровОбласть = МояОбласть.Words(НомерСлова);
ПровСлово = СокрЛП(ПровОбласть.Text) ;
163
Использование OLEAutomation,
// Проверяем наше слово на ошибки
СловоБезОшибок = Ворд.Checkspelling(ПровСлово);
Если НЕ СловоБезОшибок Тогда
Сообщить ("Ошибка в слове: " + ПровСлово.) ;
КонецЕсли;
КонецЦикла;
ВрещЦок. Close (wdDoNotSaveChanges, , ) ;
Если Не Ворд_Активен Тогда Ворд.Quit();
КонецЕсли;
Сообщить("Текст содержит орфографические ошибки! " > ;
КонецЕсли;
Данный пример уже выводит те слова, в которых были обнаружены ошибки. Но MS Word, помимо проверки слов, позволяет предлагать еще и варианты замены неправильно написанных слов. Рассмотрим пример проверки орфографии слов и вывода вариантов их замены (листинг 4.33).
Листинг 4.33. Проверка орфографии слов в тексте с выводом возможных замен
¦^НІНЯННЯЯНИЯНННННННВИІИННВВННННИННННННвЯВ^ННКІ^..----------------------------—___________________•
Для НомерСлова = 1 По ЧислоСлов Цикл // Выбираем очередное слово
ПровОбласть = МояОбласть.Words(НомерСлова);
ПровСлово = СокрЛП(ПровОбласть.Text);
// Проверяем наше слово на ошибки СловоБезОшибок = Ворд.Checkspelling(ПровСлово);
Если НЕ СловоБезОшибок Тогда
Сообщить("Ошибка в слове: " + ПровСлово);
// Получаем варианты замен, но их может и не быть
// Проверяем орфографию, указав, что возвращать нужно множество замен
Замены = ПровОбласть.GetSpellingSuggestions(,Истина,,0);
// Получаем число возможных замен ЧислоЗамен = Замены.Count;
Если ЧислоЗамен > 0 Тогда
Для НомерЗамены = 1 По ЧислоЗамен Цикл
СловоЗамены = СокрЛП(Замены.Item(НомёрЗамены).Name);
Сообщить(" Вариант замены: " + СловоЗамены);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
С помощью предложенных примеров можно реализовать полноценную проверку орфографии в любых конфигурациях системы "ЮПредщгиятие" версий 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 — рабочая книга состоит из листа с данными.
В этом случае рабочая книга будет содержать лист того типа, который задан указанной константой (график, обычный лист с данными и др.).
Для открытия уже существующего документа следует воспользоваться методом Open КОЛЛекЦИИ WorkBooks:
Excel.Documents.Open("С:\MyExcelFile.xls").
Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого к рабочей книге можно обращаться по ее порядковому номеру. Например, ко второй открытой рабочей книге можно обратиться с помощью записи:
Excel.WorkBooks[2].
Сделать рабочую книгу активной можно с помощью метода Activate: Excel.WorkBooks[2].Activate().
Следующее, чему следует научиться, — это сохранять рабочие книги в файлах.
Сохранение, печать и закрытие рабочих книг MS Excel
Закрытие документа может быть осуществлено с помощью метода close: Excel .WorkBooks [2 ] . Close () ИЛИ Excel. ActiveWorkBook. Closet).
Метод close имеет несколько необязательных (в случае позднего связывания) параметров, влияющих на правила сохранения рабочей книги. Первый из параметров принимает значения истина или ложь и влияет на то, сохранять ли изменения, внесенные в рабочую книгу. Второй параметр — имя файла, в котором нужно сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр также принимает значения истина или ложь и влияет на то, будет ли пересылаться документ следующему пользователю по электронной почте.
Просто сохранить рабочую книгу, не закрывая ее, можно с помощью метода Save ИЛИ SaveAs:
Excel.ActiveWorkBook.Save();
Excel.ActiveWorkBook.SaveAs("C:\MyWorkBook.xls").
Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется документ (под каким именем, с паролем или без него, какова кодовая страница для содержащегося в ней текста и др.).
Закрыть среду Excel можно с помощью метода Quit объекта Excel .Application. В случае Excel этот метод параметров не имеет.
Вывод документа Excel на устройство печати можно осуществить с помощью метода Printout объекта workBook, например:
Excel.ActiveWorkBook.Printout( ".
Если нужно изменить параметры печати, следует указать значения соответствующих параметров метода Printout (в случае Excel их восемь).
Обращение к листам и ячейкам
Обращение к листам рабочей книги производится с помощью коллекции worksheets объекта WorkBook. Каждый член этой коллекции представляет собой объект Worksheet. К члену этой коллекции можно обратиться по его порядковому номеру, например:
Excel.WorkBooks[1].Worksheets[1].Name = "Страница 1".
Приведенная выше запись иллюстрирует, как можно изменить имя листа рабочей книги.
К листу рабочей книги можно обратиться и по имени, например:
Excel.WorkBooks[1].Worksheets["Листі"].Name = "Страница 1".
Обращение к отдельным ячейкам листа производится с помощью коллекции Cells объекта worksheet. Например, добавить данные в ячейку ві можно следующим образом:
Excel.WorkBooks[1].Worksheets["Листі"].Cells[1,2].Value="25".
Здесь первая из координат ячейки указывает на номер строки, вторая — на номер столбца.
Добавление формул в ячейки производится аналогичным способом:
Excel.WorkBooks[1].Worksheets["Листі"].Cells[3,2].Value=" =SUM(B1:B2)". Очистить ячейку можно с помощью метода ClearContents.
Форматирование текста в ячейках производится с помощью свойств Font и interior объекта Ceil и их свойств. Например, фрагмент кода, приведенный в листинге 4.34, выводит текст в ячейке красным жирным шрифтом Courier размера 16 на желтом фоне.
Листинг 4.34. Форматирование текста в ячейках,
вшшшшшжВ___ШШмВЙВИНИИДЯШ___ІздЯдИИИшЯИШ ІИИИИИІ
Excel.WorkBooks[1].Worksheets[1].Cells[3,2].Interior.Colorlndex = 6; Excel.WorkBooks[1].Worksheets[1].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 — черный;
? з — красный;
П 5 — синий;
П б — желтый;
? 7 — лиловый;
П — зеленый;
П зз — голубой;
П 39 — сиреневый;
П 46 — оранжевый.
Обратиться к текущей ячейке можно с помощью свойства ActiveCeli объекта Excel. Application, а узнать местоположение ячейки можно с помощью свойства Address объекта cell, например:
Сообщить(Excel.ActiveCeli.Address).
Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями ячеек с помощью объекта Range. В листинге 4.35 показан пример заполнения прямоугольного участка текстом и изменение цвета шрифта в ячейках.
 |
Excel.WorkBooks[1].Worksheets[2].Range["А1:С5"].Value = "MAV";
Excel.WorkBooks[1].Worksheets[2].Range["A1:C5"].Font.Colorlndex = 3; |
Объект Range также часто используется для копирования прямоугольных областей через буфер обмена. В листинге 4.36 приведен пример, иллюстрирующий копирование такой области.
Создание диаграмм
Диаграммам 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, являющегося свойством объекта chart object (члена коллекции chartobjects), имеется метод chartwizard. Первым параметром этого метода является объект Range, содержащий диапазон ячеек для построения диаграммы, а вторым — числовой параметр, указывающий, какого типа должна быть эта диаграмма (листинг 4.37). Возможные значения параметра, отвечающего за тип диаграммы, можно найти в справочном файле.
•і мі. -л ? гг-
1япкц
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, содержащем строку или столбец данных, а добавление серии к диаграмме производится путем добавления члена к коллекции SeriesCollection (листинг 4.38).
Листинг 4.38. Определение параметров диаграммы с помощью свойств объекта Chart
------- —-——-1—:-------------------------------------------------------------:----------------------------------*— _____________
Excel.WorkBooks[1].Sheets.Add(,,1,-4109);
Excel.WorkBooks[1].Sheets[1].ChartType := -4102;
Rng = App.WorkBooks[1].Worksheets[2].Range["Bl:B5"];
Excel.WorkBooks[1].Sheets[l].SeriesCollection.Add(Rng);
В данном примере к диаграмме, созданной на отдельном листе, специально предназначенном для диаграмм, добавляется одна серия на основе диапазона ячеек другого листа.
Далее будут рассмотрены примеры практического применения Microsoft Excel.
Выгрузка метаданных в MS Excel
Рассмотрим пример выгрузки метаданных произвольной конфигурации системы "1C: Предприятие 8.0" в лист Microsoft Excel (листинг 4.39).
Сообщить("Не удалось открыть Excel”);
Возврат;
КонецПопытки;
// Добавляем новый лист
Excel.Application.Workbooks.Add(1);
Лист = Excel.ActiveSheet;
// Задаем имя закладки
Лист.Name = "Данные”;
НомерСтроки = 0;
// Перебор типов метаданных Для Каждого ТипОбъекта Из ВсеТипы Цикл Состояние(ТипОбъекта.Значение);
Если Метаданные[ТипОбъекта.Ключ].Количество() > 0 Тогда
// Добавляем новую строку НомерСтроки = НомерСтроки + 1;
// Устанавливаем текст в ячейку
Лист.Cells(НомерСтроки, 1).Value = ТипОбъекта.Значение;
// Перебираем конкретные объекты
Для каждого Объект Из Метаданные[ТипОбъекта.Ключ] Цикл // Добавляем новую строку НомерСтроки = НомерСтроки + 1;
// Устанавливаем текст в ячейку
Лист.Cells(НомерСтроки, 1).Value = Объект.Синоним;
// Перебираем параметры метаданных Для каждого Параметр Из ВсеПараметры Цикл Попытка
Количество = Объект[Параметр.Ключ].Количество(); Исключение Продолжить;
КонецПопытки ;
Если Количество > 0 Тогда // Добавляем новую строку НомерСтроки = НомерСтроки + 1;
Лист.Cells(НомерСтроки, 1).Value = Параметр.Значение +
" (" + Количество + ")";
// Добавляем новую таблицу НомерСтроки = НомерСтроки + 1 ;
"Имя" ;
"Синоним";
"Тип" ;
"Комментарий";
Лист.Cells(НомерСтроки, 1).Value = Лист.CelIs(НомерСтроки, 2).Value = Лист.Cells(НомерСтроки, 3).Value = Лист.Cells(НомерСтроки, 4).Value =
Для каждого Значение Из Объект[Параметр.Ключ] Цикл НомерСтроки = НомерСтроки + 1 ;
// Заполняем содержимое таблицы
Попытка.
Лист.Cells(НомерСтроки, 1).Value = Значение.Имя;
Исключение
КонецПопытки;
Попытка
Лист.Cells(НомерСтроки, 2).Value = Значение.Синоним;
Исключение
КонецПопытки;
Попытка
СтрокаТипов =
// Выводим все типы
Для каждого Тип Из Значение.Тип.Типы() Цикл
СтрокаТипов = СтрокаТипов + " " + Строка(Тип);
КонецЦикла;
Лист.Cells(НомерСтроки, 3).Value = СтрокаТипов; Исключение КонецПопытки;
Попытка
Лист.Cells(НомерСтроки, 4).Value = Значение.Комментарий; Исключение КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// Показываем документ
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 (!).LineStyle = 1;
// Устанавливаем верхнюю границу Ячейка.Borders(8).LineStyle = 1;
// Устанавливаем нижнюю границу Ячейка.Borders(9).LineStyle = 1;
// Устанавливаем правую границу Ячейка.Borders(10).LineStyle = 1;
// Устанавливаем выравнивание по левому краю Ячейка.VerticalAlignment = -4160;
// Устанавливаем перенос слов Ячейка.WrapText = Истина;
В первой строке данного примера в переменную ячейка помещается ссылка на конкретную ячейку с координатами НомерСтроки и НомерКолонки. После этого через данную переменную устанавливается размер шрифта, цвет текста, ширина ячейки, границы, положение текста и т. д.
Создание сводных таблиц MS Excel
Большое количество пользователей, работающих с системой "1С:Предприятие", некоторые отчеты формируют и анализируют в Microsoft Excel. Самое удобное средство анализа данных в MS Excel — это сводные таблицы (рис. 4.1) и сводные диаграммы.
|
А |
е |
¦ С 1: D~ |
Е |
|
1 |
Тип |
Расход т |
Текущие расходы по фи |
лиалу |
|
2 |
Автор |
МА? т |
|
3 |
|
|
4 |
Сумма, $ |
Месяц Ў |
|
5 |
Счет Ў) Аналитика -г |
OS.2004 09.2004 |
Общий итог |
|
6 |
сч. 91 |
-4688,02 -407,66 |
-5095,68 |
|
7 |
сч. 60 |
-4812 -9116,2 |
-13928,2 |
|
8 |
сч. 68 |
; -1739,4' |
-1739,4 |
|
9 |
сч. 69 |
-2929,64 |
-2929,64 |
|
10 |
сч. 70 |
Зарплата за август |
-17028,9 |
-17028,9 |
|
11 |
|
Аванс за сентябрь |
.........................: -12228,41 |
-12228,41 |
|
12 |
сч. 70 Итог |
-29257,31 |
-29257,31 |
|
13 |
сч. 73 |
: -1854,6 |
-1854,6 |
|
14 |
сч. 10 |
-346,611 -627,48 |
-974,09 |
|
15 |
сч. 20 |
-390 |
-390 |
|
16 |
сч. 26 |
-383,18 |
-383,18 |
|
17 |
Общий итог |
-9846,63: -46705,47 |
-56552,1 |
|
18 |
|
|
|
Рис. . Пример сводной таблицы MS Excel |
С помощью встроенного языка системы "1C:Предприятие" и OLE-сервера MS Excel можно формировать сводные таблицы и диаграммы. Рассмотрим пример их формирования (листинг 4.41).
I Листинг4.41. Создание сводной таблицы MS Excel для версии7.7
_________________________________________________________________________________________________________________________________________j
Функция СфсрмироватьСводнуюТаСлицу(ТЗ, Заголовок, Период, Условия)
Перем Значение;
Если ТЗ.КоличествоСтрок() < 2 Тогда
Предупреждение("Невозможно сформировать сводную таблицу, содержащую
менее двух строк!", 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,Г) ; Excel.ActiveSheet.Cells(1, КолонкаТЗ).Value = Значение; КонецЕсли;
КонецЦикла;
КонецЦикла;
// Выводим сводную таблицу
Excel. Application. ActiveWorkbook. PivotCaches () . Md (1, "Данные! R1C1: R"- + (1+T3.КоличествоСтрок()) + "C" +
ТЗ.КоличествоКолонок()). 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;
Excel.ActiveSheet.Cells(1, Excel.ActiveSheet.Cells(1, Excel.ActiveSheet.Cells(1, Excel.ActiveSheet.Cells(1,
1).Font.Colorlndex = 3 ; 1).Font.Bold = 1;
1).Font.Italic = 1;
1).Font.Underline = 2;
Excel.ActiveSheet.Cells(2, Excel.ActiveSheet.Cells(2, Excel.ActiveSheet.Cells(2,
Excel.ActiveSheet.Cells(3, Excel.ActiveSheet.Cells(3,
Excel.ActiveSheet.Cells(7,
1).Value = Период;
1).Font.Size = 8;
1).Font.Colorlndex = 3;
1!.Value = Условия;
1).Font.Size = 8;
1) . Select () ;
// Все готово. Показываем окно Excel
Excel.Application.Visible = 1;
Исключение
Excel.Quit();
Сообщить(ОписайиеОшибки(),"!");
Возврат 0;
КонецПопытки;
Возврат
КонецФункции //Сформировать СводнуюТаблицу
В данном примере функция СформироватьСводнуюТаблицу имеет четыре параметра.
О тз — таблица значений, которая будет использоваться в качестве источника данных для формирования сводной таблицы. Имена колонок таблицы значений будут совпадать с именами колонок сводной таблицы MS Excel;
О Заголовок — название отчета (тип Строка), которое будет выводиться в первой строке таблицы Excel;
? период — период формирования отчета (тип Строка), которое будет выводиться во второй строке таблицы Excel;
? УСЛОВИЯ — условия и комментарии к отчету (тип строка), которые будут выводиться в третьей строке таблицы Excel.
Функция возвращает 1, если сводная таблица была успешно сформирована,
и о — иначе.
Работа с 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 и открытие презентации.
177
ной конкретную презентацию среди нескольких открытых. Для решения этой задачи следует обращаться к коллекции windows объекта Presentation либо К объектам Dooumentwindow И siideshowwindow, например: Арр.Presentations.Item(1).Windows.Item(1).Activate().
Сохранение, печать и закрытие презентаций
Закрытие презентации можно осуществить, используя метод close: Арр.Presentations.Item(2).Close() ИЛИ Арр.ActivePresentation.Close().
Обратите внимание на то, что в случае PowerPoint метод close закрывает презентацию, не предлагая пользователю сохранить изменения. К тому же он не имеет параметров, с помощью которых можно было бы повлиять на возможность сохранения изменений.
^_Примечание
В случае Word и Excel метод Close обладал параметрами, влияющими на возможность сохранения документа перед его закрытием.
Для сохранения презентации следует воспользоваться методом save или SaveAs. Например:
Арр.Presentations.Item(2).Save();
Арр.Presentations.Item(2) .SaveAs ("С:\Фундамент-Копия.ррі").
В общем случае метод SaveAs имеет три параметра, влияющих на то, как именно сохраняется презентация. Первый из них (обязательный) и представляет собой строку, содержащую имя файла, в котором сохраняется презентация. Если в этой строке путь к файлу не указан, файл сохраняется в текущем каталоге.
Второй параметр (необязательный). Он указывает, в каком формате сохраняется презентация. Этот параметр может принимать значения:
П 1 — формат текущей версии PowerPoint;
? 2 — формат PowerPoint (версия 7);
П з — формат PowerPoint (версия 4);
П 4 — формат PowerPoint (версия 3);
П 5 — сохранить как шаблон;
П б — формат RTF;
П 7 — формат SlideShow (*.pps);
? 8 — формат PowerPoint Addin (*.ppa);
П 10 — формат PowerPoint 4 Far East (версия для Китая, Японии, стран Юго-Восточной Азии);
Cl ii — формат по умолчанию, определяемый текущими настройками PowerPoint;
О 12 — формат HTML;
П 13 — формат HTML (версия 3);
? і 4 — формат HTML для текстов в двухбайтовой кодировке;
О 15 — формат WMF;
О 16 — формат GIF;
О 17 — формат JPG О 18 — формат PNG;
О 19 — формат BMP.
Третий параметр указывает, нужно ли внедрять в презентацию используемые в ней шрифты. Он может принимать значения истина (внедрять шрифты) или ложь (не внедрять шрифты). По умолчанию используется значение Ложь.
Закрыть PowerPoint можно с помощью метода Quit объекта PowerPoint .Application. В случае PowerPoint этот метод параметров не имеет.
Вывод документа PowerPoint на устройство печати можно осуществить с помощью метода Printout объекта Presentation, например:
Арр.Presentations.Item(2).Printout().
Если нужно изменить параметры печати, следует указать значения соответствующих (необязательных) параметров метода Printout. В случае PowerPoint их пять. Первые два параметра указывают номера слайдов, которые должны быть напечатаны. Третий параметр — представляет собой строку с именем файла, если вывод происходит в файл вместо принтера. Четвертый параметр (целое число) указывает, сколько экземпляров документа печатать. Пятый параметр определяет, должен ли быть напечатанный документ разобран по экземплярам, и принимает значения истина (по умолчанию) или Ложь. Так, для вывода документа с пятого по двадцатый слайды в файл C:\MyOutput.prn в трех экземплярах можно использовать следующий код:
Арр.Presentations.Item (2) .Printout(5,20,"с:\MyOutput.prn",3.
Однако, помимо параметров метода Printout, влияющих на то, какой принтер используется и сколько экземпляров печатается, на режим печати презентации влияет также свойство Printoptions объекта Presentation. Это свойство представляет собой объект Printoption, имеющий, в свою очередь, набор свойств, влияющих на то, в каком виде печатается презентация (слайды, выдачи, заметки и др.), печатаются ли рамки вокруг слайдов, сколько слайдов на странице располагается в случае печати выдач, печатается ли фон слайдов и др. Указанный набор свойств примерно отражает, что
пользователь PowerPoint может изменить, выбрав пункт Print из меню PowerPoint (в том числе и имя принтера, имя презентации, и число копий).
Демонстрация слайдов
Для показа слайдов используется метод Run объекта Slideshowsettings, являющегося свойством объекта Presentation:
Арр.Presentations.Item (1) .SlideShowSettings.Run().
Для установки режима показа слайдов также используется объект Slideshowsettings. Его свойство RangeType указывает, какой именно фрагмент презентации нужно демонстрировать. Возможные значения этого свойства следующие:
? 1 — вся презентация;
П 2 — выделенный диапазон слайдов;
П з — именованная демонстрация.
Свойства StartingSlide И EndingSlide объекта SlideShowSettings СОДержат номера первого и последнего слайда демонстрируемого фрагмента. Эти свойства имеет смысл применять в тех случаях, если свойство RangeType этого же объекта равно 2.
Свойство AdvanceMode объекта Slideshowsettings указывает, каким образом производится смена слайдов при демонстрации:
П 1 — ручная смена слайдов;
П 2 — смена слайдов в соответствии с временем показа каждого слайда;
П з — запись времени показа слайдов.
Свойство Loopuntiistopped объекта Slideshowsettings, принимающее значение истина или ложь, указывает, демонстрируются ли слайды непрерывно до нажатия пользователем клавиши <Esc>. Это свойство целесообразно применять, если свойство AdvanceMode объекта Slideshowsettings установлено равным 2. Отметим также, что время показа слайдов, если таковое не записано пользователем вручную, можно установить программно, с помощью свойства slideShowTransition объекта slide. В листинге 4.43 приведен пример использования описанных выше свойств и методов.
¦ ^ ---; —'---1 . -----~.Т _ . ' • . :
Листинг 4.43. Демонстрация слайдов
Для Номер = 2 по 7 Цикл
Арр.Presentations.Item(l).Slides.Item(Номер).SlideShowTransition. =
Арр.Presentations.Item(l).Slides.Item(HoMep).SlideShowTransition AdvanceOnTime = Истина;
КонецЦикла;
Арр.Presentations.Item(l).SlideShowSettings.StartingSlide = 2;
Арр.Presentations.Item(1).SlideShowSettings.EndingSlide = 7;
App.Presentations.Item(1).SlideShowSettings.AdvanceMod = 2;
App.Presentations.Item(l).SlideShowSettings.LoopUntilStopped = Истина; Арр.Presentations.Item(l).SlideShowSettings.RangeType = 2;
App.Presentations.Item(l).SlideShowSettings.Run();
В данном фрагменте кода время показа слайдов со второго по седьмой устанавливается равным одной секунде, далее указывается, что эти слайды будут демонстрироваться в соответствии с заданным временем непрерывно до нажатия клавиши <Esc>, а затем запускается показ слайдов.
Свойство slideShowTransition объекта slide может быть использовано для определения анимационных эффектов при смене слайдов. В листинге 4.44 приведен фрагмент кода, иллюстрирующий, каким образом устанавливаются анимационные эффекты и звуковое сопровождение при смене слайда.
ДМШИМДШЛ
Листинг 4.44. Звуковое сопровождение при смене слайда
.ь- -
Арр.Presentations.Item (1).Slides.Item(2).SlideShowTransition.EntryEffeet= 770;
App.Presentations.Item(l).Slides.Item(2).SlideShowTransition.SoundEffect ImportFromFile("C:\Program Files\NetMeeting\blip.wav");
Различные значения свойства EntryEffect можно найти в интерфейсном модуле или справочном файле системы PowerPoint.
А теперь кратко остановимся на управлении поведением объектов при показе слайдов. Для управления анимацией объектов на слайдах следует использовать свойство AnimationSetrings объекта shape. Это свойство возвращает объект AnimationSettings, свойства которого и отвечают за анимацию данного объекта. Так, свойство AdvanceMode указывает, каким образом появляется объект, а свойство Advance Time — через какое время после показа слайда появляется объект. Свойство TextLeveiEffeet определяет, до какого уровня текста происходит анимация объекта. И наконец, свойство Animate (принимающее значение истина или ложь) указывает, должен ли объект вообще отображаться с анимацией. Пример управления поведением объекта на слайде приведен в листинге 4.45.
,г...................."..................' ¦
г "...................................
Листинг 4.45. Управление поведением объекта на слайде
181
Арр.Presentations.Item(1).Slides.Item(3).Shapes.Item (1) . AnimationSettings.TextLevelEffect = 16;
App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1).
AnimationSettings.Animate = Истина;
Этот фрагмент кода устанавливает автоматическую анимацию первого объекта на третьем слайде через одну секунду после показа слайда.
Работа с Adobe Photoshop
С помощью OLE-сервера Adobe Photoshop можно автоматизировать выполнение действий, связанных с обработкой растровых изображений.
Для создания объекта приложения Adobe Photoshop используется конструкция, приведенная в листинге 4.46.
Листинг 4.46. Создание и уничтожение объекта приложения Adobe Photoshop
// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Установка видимости окна приложения
Photoshop.Visible = Истина;
// Уничтожение объекта приложения
Photoshop.Quit();
Важно отметить то, что OLE-сервер Adobe Photoshop может создать только один экземпляр приложения, т. е. при попытке создать еще один объект — установится связь с открытым ранее приложением.
Для открытия существующего файла используется метод Open объекта Photoshop. В листинге 4.47 приведен пример открытия файла с последующим его закрытием.
Як
! Листинг 4.47. Открытие и закрытие файла картинки в приложении i Adobe Photoshop
Над открытым документом можно производить различные действия, в том числе и выполнение определенных в Adobe Photoshop операций (Action). Для выполнения операции над открытым документом необходимо вызвать метод PlayAction объекта Photoshop с указанием в параметре названия выполняемой операции. В листинге 4.48 приведен пример открытия документа Photoshop с именем "Quadrant colors", выполнение над ним операции и последующим сохранением документа.
¦ПК
Листинг 4.49. Запуск выполнен
: определенных в Photoshop операций
// Создание объекта приложения Photoshop
Photoshop = Новый СОМОбъект("Photoshop.Application");
// Открытие картинки
PhotoDoc = Photoshop.Open("С:\picture.jpg">
// Перебор коллекции операций и запуск каждой из них
183
Использование OLE Automation.
Для каждого Action из Photoshop.Actions Цикл
КодОтвета = Вопрос С"Запустить " + Action.Name +
"?",РежимДиалогаВопрос.ДаНетОтмена,,,"Запустить операцию?");
Если КодОтвета = КодЗозвратаДиалога.Да Тогда Action.Play();
ИначеЕсли КодОтвета = КодВозвратаДиалога.Отмена Тогда Прервать;
КонецЕсли;
КонецЦикла;
// Закрытие документа
PhotoDoc.Close();
// Уничтожение объекта приложения
Photoshop.Quit();
В данном примере перебираются все элементы коллекции Actions. Для каждой операции (Action) появляется вопрос с просьбой подтвердить ее выполнение, при утвердительном ответе она выполняется.
Содержание раздела