Михайлов А.М.- 1С Предприятие 7.7 - 8.0. системное программирование

Содержится информация, предназначенная для практического применения скрытых возможностей операционной системы и разнообразных COM-объектов при разработке собственных информационных систем на платформе "^Предприятие" версий 7.7 и 8.0. Рассмотрены особенности использования объектов ActiveX, администрирования Windows средствами WMI и WSH, взаимодействия с базами данных посредством интерфейсов ADO и SQL-DMO, применения технологии OLE Automation и др. при работе в среде "1С:Предприятие". Материал сопровождается большим количеством наглядных и подробно прокомментированных примеров, полные тексты которых приведены на компакт-диске.

Глава 1 Применение технологий СОМ и ActiveX

Технологии СОМ и ActiveX

Аббревиатура СОМ расшифровывается достаточно просто. По существу это краткая запись понятия — Component Object Model (компонентная объектная модель). Иногда говорят — "модель СОМ".

Построение компонентной объектной модели осуществляется при помощи соответствующей информационной технологии. Суть ее заключается в том, что программы строятся из компонентов, которые в свою очередь состоят из объектов. Эти компоненты и объекты могут представлять собой непосредственно исполняемый двоичный код или файлы (DLL, EXE), которые никак не надо "связывать" с проектом, для которого они построены. Их достаточно зарегистрировать в операционной системе и они будут доступны любой программе, исполняющейся на данной машине. Таким образом, использование их в программе производится без применения операций сборки модуля. Более того, модель СОМ позволяет вызывать объекты какого-либо компонента из своей программы без указания того, где они расположены. Здесь достаточно знать только имя объекта.

Объекты СОМ можно создавать на любом языке, способном поддерживать данный интерфейс. После этого обращаться к методам этих объектов можно будет на любом языке, в том числе и на встроенном языке системы "1C:Предприятие", позволяющем осуществлять вызовы данного двоичного интерфейса. Ни объект, ни его клиент не знают (да и зачем им это) — на каком языке написаны другие.

Технология СОМ (в дальнейшем просто — СОМ) разработана Microsoft, а поэтому первоначально была доступна для программ, работающих под управлением Microsoft Windows 9x и Microsoft Windows NT. Теперь Microsoft предоставляет поддержку СОМ и для Macintosh. Хотя Microsoft не поддерживает СОМ на других операционных системах, этот пробел заполнен

третьими фирмами. Несколько компаний, больших и малых, предоставляют реализации СОМ и основанных на ней технологий для широкого диапазона операционных систем.

Технология ActiveX построена на основе компонентов COM. ActiveX — это технология, разработанная фирмой Microsoft с целью стандартизации программных компонент. Это системная технология, представляющая совокупность средств, с помощью которых объекты, разработанные различными разработчиками на разных языках программирования и работающие в разных средах могут взаимодействовать друг с другом без какой-либо модификации их исполняемых модулей (двоичных кодов).

Все ActiveX-компоненты можно разделить на два типа:

О Визуальные (например, Microsoft Agent, Progress Control, Slider Control,

календарь, таймер и пр.);

П не воспринимаемые визуально, но обеспечивающие какую-либо функцию интеграции разных по происхождению компонент.

Преимущества использования технологии ActiveX заключаются в следующем:

П быстрое написание программного кода, которое выражается в том, что разработка приложений становится очень похожей на программирование, в котором используются отдельные "программные кирпичики" (элементы ActiveX);

П открытость и мобильность, являющиеся следствием спецификации данной технологии, недавно переданной в Open Group, как основы открытого стандарта (кроме того, Microsoft совместно с компаниями Metro-werks и Bristol заканчивает реализацию технологий ActiveX для платформ Macintosh и UNIX);

П возможность написания приложений с использованием любых средств разработки, выражающееся в том, что программные элементы ActiveX могут использоваться в Visual Basic, Visual C++, Borland Delphi, Borland C++, 1С:Предприятие и других средствах разработки приложений;

П большое количество уже существующих программных элементов ActiveX, причем некоторые из разработанных компонентов являются бесплатными и могут применяться в приложениях независимых разработчиков;

П стандартность, выражающаяся в том, что технология ActiveX основана на широко используемых стандартах Интернета (TCP/IP, HTML, Java), с одной стороны, и стандартах, введенных в свое время Microsoft и необходимых дж сохранения совместимости с СОМ и OLE, с другой.

Как ни странно, при рассмотрении проблемы расширения встроенного языка системы "ІС.’Предприятие", речь заходит только о внешних компонентах, в основу которых положена идеология СОМ, но которые должны быть написаны по единому стандарту "1C". Следствием этого является невозмож-

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

В системе "1C:Предприятие" (версия 7.7) новый экземпляр СОМ-объекта создается с помощью конструкции Идентификатор = СоэдатьОбъект("ИмяОбъекта"). Для версии 8.8 оператор СоэдатьОбъект заменяется на новый сомобъект. Методы и свойства COM-объектов в дальнейшем становятся доступными через созданный объект.

Работа с объектом Internet Explorer

СОМ-объект, предоставляемый браузером Microsoft Internet Explorer, позволяет выполнять множество функций. Например, получение данных с различных Web-сайтов и использование полученной информации в своих целях, автоматическая регистрация сайта во всех поисковых системах сразу, решение задач посылки GET и POST-запросов и др. Поскольку данный браузер присутствует в любой современной операционной системе семейства Windows, то использование данного компонента является одним из самых универсальных способов получения сторонних HTML-данных.

Рассмотрим ряд приемов использования данного СОМ-объекта.

Определение текущего разрешения экрана

Для того чтобы определить текущее экранное разрешение, находясь в браузере, необходимо запустить объект internet Explorer и определить, как это показано в листинге 1.1, текущее разрешение.

; Листинг 1.1. Определение текущего разрешения экрана для версии 7.7

objIE = СоэдатьОбъект("InternetExplorer.Application"); objlE.Visible = 0; // Отключаем видимость

objIE.Navigate("about:blank"); // Загружаем пустую страницу

Пока objIE.readyState < 4 Цикл // Ждем пока она загрузится

КонецЦикла;

oScreen = objIE.document.parentWindow.screen;

Сообщить("Текущее разрешение экрана: " + oScreen.width + "х" + oScreen.height);

Приведенный код работает в системе ”1С:Предприятие 7.7". Для версии 8.0 необходимо в первой строке заменить "создатьОбъект" на "новый сомобъект".

І^Вниманиер^

Если в цикле ожидания готовности объекта obj ІЕ условие obj ie . readystate < 4 заменить на objiE.busy (распространенная ошибка), то в Windows 9х приложение будет завершаться с ошибкой примерно один раз из четырех.

Несмотря на всю привлекательность использования Internet Explorer, вышеописанный подход имеет и значительные недостатки, основной из которых — это существенное понижение общей производительности приложения. Для более эффективного определения текущего разрешения экрана рекомендуется использовать объекты WSH или WMI, о которых будет подробно рассказано в последующих главах.

Анализ HTML-страниц

Среди множества методов и свойств Microsoft Internet Explorer есть весьма ценное свойство Document, которое позволяет получить доступ к содержимому объектной модели HTML документа (то есть возвращает ссылку на тот же объект, что и строка клиентского JScript: window.document). Это позволяет в свою очередь легко и просто разбирать HTML-документы безо всяких регулярных выражений.

Рассмотрим примеры использования Internet Explorer для анализа всех ссылок на HTML-странице, получая информацию с сайта автора (листинги 1.2 и 1.3). Данную информацию можно использовать, например, для автоматического определения наличия необходимой ссылки на свой сайт при обмене кнопками и баннерами (рекламными блоками) с дружественными сайтами.

Листинг 1.2. Получение всех ссылок на сайте для версии 7.7

.___________.._________ _______________ ___________________. ___________.... ...............................................J

objIE = СоздатьОбъект("InternetExplorer.Application");

objIE.Visible = 0;

objIE.Silent = 0;

objIE.Navigate(Адрес);

Пока objIE.ready3tate<4 Цикл // Ждем пока она загрузится

КонецЦикла;

objDoc = objIE.Document;

AllTags = objDoc.all.tags ("A"); // Получаем всю коллекцию ссылок

Для Ном = 0 По AllTags.length-1 Цикл Сообщить(AllTags.item(Ном).href);

КонецЦикла;

objIE.Quit О; // Закрываем приложение objIE =

і Листинг 1.3. Получение scex ссылок на сайте для версии 8.0

І^ИИИмМЯЯМШІУІшИрІШтШШш'гіПИИітИгНІДІікаЯі...........................-.ЛыЛ......жЦУМяВдРЬ? . I

objIE = Новый СОМОбъект("InternetExplorer.Application"); objIE. Visible = Ложь ; // Отключаем видимость

objIE.Silent = Ложь; objIE.Navigate(Адрес);

Сообщить("Идет загрузка страницы. Ждите.,.");

Пока objIE.readyState<4 Цикл // Ждем пока загрузится страница КонецЦикла;

objDoc = objIE.Document;

Для каждого а Из objDoc.all.tags("А") Цикл // Перебираем все ссылки

Сообщить(a.href);

КонецЦикла ;

objIE.Quit(); // Закрываем приложение

objIE = Неопределено;

Существует несколько важных отличий в реализации данной задачи на разных версиях системы "1С:Предприятие".

1. Создание СОМ-объекта в версии 7.7 происходит с помощью конструкции СоздатьОбъект, а В версии 8.0 — Новый СОМОбъект.

2. Конструкция obj Doc. all. tags ("А") возвращает коллекцию СОМ-объектов с ссылками HTML-страницы, заключенные в тег <А>, но версия 7.7 не позволяет напрямую работать с подобными коллекциями. Поэтому для этой версии сначала определяется количество элементов в коллекции с помощью структур ы АН Tags. length, а только потом каждый элемент получаем методом item (<НомерЭлемента>). В версии 8.0 обход элементов любой коллекции происходит с помощью конструкции для каждого...из...цикл...конеццикла, причем каждый полученный элемент цикла уже будет соответствовать очередному элементу коллекции СОМ-объектов.

Работа с POST-запросами в HTML-формах

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

Обычно, для передачи данных POST-запроса, во всех популярных языках программирования применяется метод Navigate объекта InternetExplorer со

специальным параметром PostData. Однако, несмотря на это, его практическое использование в среде "1C: Предприятие" сопряжено с некоторыми трудностями. Дело в том, что данный аргумент должен иметь тип — указатель на структуру SafeArray, который не поддерживается системой "1C: Предприятие" версии 7.7.

Поэтому самым простым способом отправить POST-запрос посредством InternetExplorer.Application можно считать "эмуляцию" нажатия кнопки Submit (управляющая кнопка, используемая для передачи данных формы на сервер) на какой-либо реальной HTML-форме. Этот способ особенно интересен с учетом того, что многие скрипты, при обработке POST-запросов, как раз для защиты от подобной автоматизации, учитывают HTTP_REFERER, т. е. с какой страницы пришел запрос, и (или) выставляют специальные сессионные переменные или cookie на той странице, где находится форма, посылающая POST-запрос.

Листинги 1.4 и 1.5 демонстрируют примеры подобного программного эмулирования "интерактивного пользователя". При этом программа, написанная для версии 7.7, приведенная в листинге 1.4, демонстрирует заполнение HTML-формы (рис. 1.1) форума, расположенного по адресу http: //forum.erpg.ru.

Рис. Элементы HTML-формы форума
іна

Листинг 1.4. Заполнение HTML-формы сообщения на форуме для версии 7.7

objIE = СоздатьОбъект("InternetExplorer.Application"); objIE.Visible = 0; objIE.Silent = 0;

objIE.Navigate(");

Пока obj IE. readyState<4 Цикл // Ждем пока она загрузится

КонецЦикла ;

obj Doc = objIE.Document;

objForm = objDoc.forms(0); // Получаем первую форму в документе

Попытка

// Заполняем поле формы "Имя пользователя"

objForm.elements("username").value = СокрЛП(Имя);

Исключение

КонецПопытки;

objForm.elements("subject").value = СокрЛП(Тема); objForm.elements("message").value = СокрЛП(Описание); objIE.Visible = 1;

Сообщить("HTML-форма форума заполнена. Для отправки сообщения необходимо нажать кнопку Отправить в Internet Explorer.");

К сожалению, версия 7.7 не позволяет выполнить эмуляцию нажатия определенной кнопки HTML-формы из-за того, что система не опознает метод click о элемента формы, поэтому для окончательной отправки сообщения на форум пользователю необходимо вручную нажать на кнопку Отправить в окне Internet Explorer. Но если на форме имеется только одна кнопка, используемая по умолчанию, то для программной эмуляции ее нажатия можно ИСПОЛЬЗОВать метод submit: obyForm. submit О .

Версия 8.0 системы "1C: Предприятие" более корректно работает с СОМ-объектами, поэтому процедура отправки сообщения на форум полностью автоматизирована. Рассмотрим процедуру автоматического заполнения той же формы форума и эмуляции нажатия кнопки Отправить (см. листинг 1.5).

I Листинг 1.5. Отправка сообщений на форум (метод Post) для версии 8.0

objIE = Новый СОМОбъект(”InternetExplorer.Application"); objIE.Visible = Ложь; // Отключаем видимость objIE.Silent = Ложь;

objIE.Navigate(""); Сообщить("Идет загрузка страницы. Ждите...");

Пока objIE.readyState<4 Цикл // Ждем пока загрузится сраница

КонецЦикла;

objDoc = objIE.Document; // Получаем объект HTML-документ objForm=objDoc.forms(0); // Получаем первую форму в документе Попытка

// Заполняем поле формы "Имя пользователя"

objForm.elements("username").value = Имя;

Исключение КонецПопытки;

objForm.elements("subject").value = Тема;

objForm.elements("message").value = Описание;

objForm.elements("post").click(); // Нажимаем на кнопку "Отправить"

Сообщить ("Ваше сообщение отправлено на форум пс> адресу: " +

"");

objIE.Quit(), // Закрываем приложение

obj IE = Неопределено;

По-моему приведенный код должен быть понятен без дополнительных объяснений, за исключением использования конструкции Попытка...Исключение...КонецПопытки при заполнении имени пользователя на форме (элемент с именем username). Это делается для того, чтобы предотвратить ошибку системы в том случае, если поле username не существует. На форуме используется система авторизации пользователей, и если пользователь был авторизирован ранее, то поле username не появляется на форме.

Работа с объектом "Microsoft Winsock"

Microsoft Winsock — это объект ActiveX, который обеспечивает простой доступ к TCP или сетевым операциям. Чаще всего его используют для того, чтобы подсоединиться к удаленному компьютеру и обмениваться данными в обоих направлениях.

Объект Winsock имеет следующие свойства:

О ByteRecived — возвращает количество полученных данных, находящихся в данный момент в принимающем буфере;

П LocalHostName — возвращает имя местного компьютера;

П Local 1Р — возвращает IP-адрес местного компьютера в формате (ххх.ххх.ххх.ххх);

П Local Port — возвращает или устанавливает местный порт использования;

Примечание

Для клиента порт используется для отправки данных. Укажите порт 0, если приложение не требует специфического порта. В этом случае элемент управления выберет случайный порт. После установления соединения этот местный порт используется для TCP-соединений. Для сервера этот порт является принимающим. Если указан порт 0, будет использоваться случайный порт. После вызова функции Listen свойство содержит порт, который был выбран.

П Protocol — возвращает или устанавливает протокол, используемый Winsock (либо TCP, либо UDP);

и RemoteHost — возвращает или устанавливает имя или IP-адрес удаленного компьютера, с которым нужно обмениваться данными (можно указать IP-адрес, имя компьютера или FTP-адрес);

П RemoteHostlP — возвращает IP-адрес удаленного компьютера;

П RemotePort — возвращает или устанавливает порт удаленного компьютера для соединения (порты, устанавливаемые по умолчанию: 80 — HTTP, 26 - FTP);

П state — возвращает состояние элемента управления в числовом выражении.

Определение IP-адреса локального компьютера

Для определения IP-адреса локального компьютера используется свойство Local IР объекта wins ос к. В листинге 1.6 приведен фрагмент программы, показывающий вариант реализации этого действия.

¦нвннннннмнннннннининнвншмнннннншшшнншишин

Листинг 1.6. Определение IP-адреса локального компьютера

¦¦ННВНИнШШэНтНІІМНМНЯІННИЯШЮНІНММШЖіЕНШшІЯИ&іы

Winsock = Новый СОМОбъект("MSWinsock.Winsock");

Сообщить(Winsock.LocallP);

Winsock = Неопределено;

Определение IP-адреса удаленного компьютера

Для определения IP-адреса удаленного компьютера используется свойство RemoteHostip объекта winsock. В листинге 1.7 приведен фрагмент программы, показывающий вариант реализации этого действия.

Листинг 1.7. Определение IP-адреса удаленного компьютера

Winsock = Новый СОМОбъект("MSWinsock.Winsock");

Winsock.Connect(ИмяСервера, 139);

Пока Winsock.State = 4 Цикл // Ждем пока произойдет соединение

КонецЦикла;

Сообщить(Winsock.RemoteHostlP);

Winsock = Неопределено;

Код довольно простой, но в нем есть некоторые особенности.

П Для TCP-соединения с удаленным сервером используется порт 139, который, как правило, доступен всегда.

П Метод Connect является асинхронным, то есть возврат из него осуществляется сразу же, не дожидаясь установления соединения.

П Для ожидания соединения с удаленным компьютером в цикле анализируется состояние соединения state.

Создание штрихкодов с использованием ActiveX ActiveBarCode

Для эффективного учета движения товаров в организации необходима технология, позволяющая присваивать каждому товару уникальный код и обеспечивать быстрое его считывание при минимальных ошибках. Именно этим условиям и удовлетворяет технология штрихового кодирования товаров. На данный момент насчитывается около 20 форматов штрихкодов (включая их модификации), различающихся, в основном, областями применения. Некоторые форматы имеют механизм контроля корректности, заключающийся в вычислении одной части кода по другой.

Безусловно, система "I С:Предприятие" позволяет использовать технологию штрихкодирования при автоматизации предприятия с использованием входящего в поставку многих конфигураций ActiveX-элемента — ActiveBarCode. Он позволяет формировать образ штрихкода непосредственно в "1С:Предприятии". Этот элемент поддерживает практически все известные форматы штриховых кодов, управление цветом и шрифтом выводимого штрихкода, автоматическое определение формата кода, а также вычисление контрольных цифр.

Компонент ActiveBarCode имеет множество свойств, методов и событий. Рассмотрим основные свойства, которые чаще всего используются:

П Text — текст выводимый под штрихкодом (обычно номер);

П туре — тип штрихкода (полный список кодов можно найти на сайте

производителя );

П AutoType — признак автоматического определения типа исходя из номера штрихкода;

П showText — признак включения или отключения вывода текста под штрихкодом;

О ForeColor — цвет текста штрихкода;

П BackColor — цвет фона;

П Font — шрифт текста штрихкода.

Фактически данный компонент представляет из себя файл Barcode.ocx, который может располагаться где угодно, но перед использованием его обязательно необходимо зарегистрировать в системе командой regsvr32 Barcode, осх.

ActiveBarCode является визуальным компонентом, т. е. его можно разместить в диалоге или таблице. Однако следует заметить, что использование данного ActiveX-компонента несколько отличается в разных версиях системы "1C: Предприятие". Основное различие состоит в том, что в версии 7.7 невозможно размещать ActiveX-компоненты на формах (разрешено только в табличных документах). В восьмой версии таких ограничений нет.

Есть еще одна крайне неприятная особенность версии 7.7. Она заключается в том, что в этой версии нельзя штатными средствами вставить данный элемент в табличный документ. Чтобы все-таки это сделать, необходимо вставить ActiveBarCode в любом другом приложении (например в MS Word, "1С:Предприятие" 8.0 и др.), а потом через буфер обмена перенести его в табличный документ 7.7. Далее, для динамического вывода нужного номера на штрихкоде надо в свойствах данного объекта прописать необходимые свойства объекта (рис. 1.2).

Рис. 1.2. Настройка параметров динамического формирования ActiveBarCode
Для вывода табличного документа используется стандартный код ”1С:Предприятия" (листинг 1.8).

В версии 8.0 системы "1C:Предприятие" все намного проще. В этом случае ActiveX-элементы можно устанавливать как на форму (Форма | Вставить ActiveX и затем выбрать ActiveBarcode), так и в табличный документ (Таблица | Рисунки | Вставить объект).

Так, если элемент ActiveBarcode находится на форме и имеет имя Штрихкод, то для его формирования достаточно написать код, приведенный в листинге 1.9.

Листинг 1.9. Формирование штрихкода средствами ActiveBarcode для версии 8.0 і

И^ДИИЯИЯЯЯИІІ^ИЯЯИНИШИИИЯИЯИЯЯЯИИЯЯЯЯИИІІ^ДІІ^ИІ

ЭлементыФормы.ШтрихКод.Type = Тип;

ЭлементыФормы.ШтрихКод.Text = Номер;

ЭлементыФормы.ШтрихКод.ShowText = Показывать;

ЭлементыФормы.ШтрихКод.AutoType = Автоопределение;

В результате выполнения этого кода на форме появится необходимый номер со штрихкодом (рис. 1.3).

Рис. 1.3. Результат формирования штрихкода для версии 8.0
Использование ActiveX Windows Media Player

ActiveX-компонент Microsoft Windows Media Player позволяет просматривать видео, прослушивать аудиофайлы, а также просматривать рисунки различных форматов (JPG, BMP и др.). Данный компонент бывает очень полезен, когда необходимо просмотреть определенную мультимедийную информацию о товаре или поставщике.

Существует несколько версий Windows Media Player. Для определенности будем рассматривать версию 9.0, которую можно загрузить на сайте производителя .

Примечание

К сожалению, в редп версии 7.7 невозможно использование дан

ного компонента, поэтому все дальнейшее рассмотрение будет актуально только для восьмой версии платформы.

Для работы Windows Media Player в системе "1C:Предприятие" необходимо выполнить всего два условия.

1. Для размещения ActiveX-компонента на форме в меню Форма следует выбрать пункт Вставить ActiveX. В появившемся списке выбрать Windows Media Player.

2. Написать код, который бы передавал файл с мультимедийной информацией в ActiveX-компонент (листинг 1.10).

і Листинг 1.10. Запуск мультимедиафайла в ActiveX Windows Media Player j

Попытка

ЭлементыФормы.WMP.settings.autoStart = True; // Автовоспроизведение ЭлементыФормы.WMP.URL = ИмяФайла;

Исключение

Предупреждение(ОписаниеОшибки() , 10, "Ошибка");

КонецПопытки;

В данном Примере Применена КОНСТРУКЦИЯ Попытка...Исключение...КонецПопытки для предотвращения ошибок, связанных с отсутствием в системе данного компонента. Элемент формы wmp как раз и является ActiveX-компонентом.

С помощью ActiveX Windows Media Player можно также просматривать свойства файла (tag, Bitrate и пр.). В листинге 1.11 демонстрируется пример просмотра свойств произвольного файла.

-т———------——1—~—щ— ..........' ШЯШШЯЯ--------I— I—¦— ..........щшшшвш

Листинг 1.11. Получение свойств файла с помЬщью ActiveX Windows Media Player

Попытка

ЭлементыФормы.ШР. settings. autoStart = False;

ЭлементыФормы.WMP.URL = ИмяФайла ;

// Получаем объект, предназначенный для работы с выбранным файлом

CM = ЭлементыФормы.ШР. currentMedia;

// Получение значения свойства по имени

Сообщить("Полное имя файла: " + CM.getltemlnfo("SourceURL”));

// Получение всего списка свойств

Для Ном = 0 по СМ.attributeCount-І Цикл ИмяСвойства = CM.getAttributeName(Ном);

ЗначениеСвойства = CM.getltemlnfo(CM.getAttributeName(Ном);

Сообщить(ИмяСвойства + " = " + ЗначениеСвойства);

КонецЦикла;

Исключение ¦

Предупреждение(ОписаниеОшибки() , 10, "Ошибка");

КонецПопытки;

Использование помощников JMicrosoft Agent

Понятие MS Agent

Microsoft Agent — это набор программных средств, которые поддерживают воспроизведение интерактивных анимированных персонажей. Разработчики могут использовать эти персонажи для создания различных интерактивных приложений, справочных систем, в том числе и в системе "1 С: Предприятие".

Также Microsoft Agent предлагает поддержку распознавания голосовой информации (на основе Microsoft Speech Application Programming Interface, SAPf 4.0), позволяя управлять приложениями на уровне голосовых команд. Персонажи могут воспроизводить синтезированную речь (text-to-speech, TTS), аудиофрагменты или текст.

Персонажи отображаются в собственных окнах, что делает интерфейс более удобным и гибким. В состав Microsoft Agent входит компонент ActiveX, доступный из системы "1C:Предприятие".

Эта технология напрямую используется в Office 2000 и включена в состав ядра Windows 2000. Для установки Microsoft Agent в Windows 98 и Windows NT 4.0 требуется загрузить соответствующее программное обеспечение с Web-узла фирмы Microsoft ().

В настоящее время на сайте Microsoft доступны четыре стандартных персонажа, которые можно использовать. Это маг — Merlin, джин — Genie, робот — Robby и попугай — Peedy (рис. 1.4).

Рис. Основные персонажи Microsoft Agent
Кроме стандартных персонажей в сети Интернет существуют персонажи, разработанные другими разработчиками на любой вкус.

Примечание

На том же сайте Microsoft можно загрузить Microsoft Text-To-Speech для того, чтобы "агенты" воспроизводили речь (русский голосовой модуль — Lernout&Hauspie TTS3000), а также редактор "агентов" и официальную документацию Microsoft. Так, при написании материала данной главы были использованы Microsoft Agent Control 2.0 и персонаж Merlin.

Практическое применение MS Agent

Microsoft Agent очень удобно применять в приложениях, где необходимо выводить какие-либо сообщения, подсказки и указания пользователю, но не хочется ограничиваться штатными методами системы. Microsoft Agent позволяет все это сделать красиво, удобно и необычно. Наверняка работать со столь дружественным интерфейсом, как показано на рис. 1.5, будет приятно любому пользователю.

В системе "1C:Предприятие" доступ к объекту Microsoft Agent создается С ПОМОЩЬЮ конструктора СоздатьОбъект ; "Agent .Control. 2 "), ДЛЯ версии 7.7, и новый СОМОбъект ( "Agent, Control. 2 ”), для версии 8.0. После создания объекта минимальное, что нужно сделать, — это подключиться к созданному объекту, загрузить необходимый персонаж и вывести его на экран (листинг 1.12).

Листинг 1.12. Создание объекта MS Agent и вывод персонажа

Попытка

// Устанавливаем ссылку на объект Agent = Новый СОМОбъект("Agent.Control.2

Исключение

Сообщить("MS Agent не установлен!");

Сообщить("Загрузить MS Agent можно с сайта. Microsoft —

");

Возврат;

КонецПопытки ;

Agent.Connected = Истина; // Подключаемся к объекту

Agent.Characters.Load("Merlin", "Merlin.acs"); // Загружаем персонаж Agent.Characters("Merlin").Show(); // Выводим на экран

Рассмотрим код, приведенный в листинге 1.12, более подробно.

Прежде чем приступить к анимации персонажа, необходимо загрузить его, используя метод Load, и в качестве аргументов передать два параметра: идентификатор персонажа и полное имя файла персонажа или его HTTP-адрес. Microsoft Agent по умолчанию ищет персонажи в каталоге %WinDir%\MSAgent\Chars (где %WinDir% — это переменная окружения, которая указывает путь к каталогу операционной системы Microsoft Windows). Если файл вашего персонажа находится в другом месте, указывайте для него полный путь. Microsoft Agent поддерживает два формата для хранения данных доступных анимаций: одиночный файл (ACS) для локального применения и множественный формат (ACF, АСА), который хранит отдельные виды анимаций и используется для загрузки анимации отдельно через http-сервер.

Журнал Действиям «ж fe

“ ~ І

операций

операций

IS'

? Перейти в журнал проводок

Номер _ j Содержание операции 0000000013 I Ф ормирование уставного

Вид Документа

Организация

Операция

ОАО "Глобус"

"Глобус1

ОООООООС

ОООООООС Чтобы ввести новую

ООООООЙ опеРа|Дию нажмите 00000001 .

0000000ІЛБ b знос^ставныи капитал

ПродаяОговаров покупателю Ма... і! Оплата покупателя Магазин ’В..

Я:

Операция

ОАО

Операция

02.06.2003 19:30:22 | ОАО "Глобус"

02^08.200319:31:5б I ОАО1Глобус"

ем 0...
j -?
кнопку

Операция

ОАО
Операция

03.06.200312:00:00 ІОАО“Глобус"

Операция

"Глобус"

03.06.2003
0000000018

ОАО
Операция

0000000020

рЗ.06.2003 т 2:00:01 ;0А0 Тяобус"

\ Субконто Дт іКоличество Дт

: ВалютаДт_

’Вал. сумма Дт

Дт

Субконто Кт ;Коли‘ Сумма

jВалюта КтРІР Содержание________

журнала

Кт

80

Волков Ник

Волков Ник

ена задолжен.

Либерзон м

75.1

Либерзон М

1 OU LAJU,

Отражена

задолжен.

задолжен.

Рис. 1.5, Пример вывода сообщения Microsoft Agent

Приложение может загрузить только единственный экземпляр заданного персонажа. Но при этом можно использовать одновременно разные персонажи.

Метод show выводит заданный персонаж на экран с одновременным проигрыванием соответствующей анимацией и не имеет параметров. Для скрытия персонажа существует метод Hide, который тоже параметров не имеет.

Вместо загрузки заданного персонажа, жестко определяя его имя, вы можете загрузить персонаж по умолчанию (листинг 1.13). Метод ShowDefaultCharacterProperties объекта Agent ВЫВОДИТ панель настройки свойств для выбора персонажа по умолчанию. В качестве аргументов в метод можно (но не обязательно) передавать пару координат (X, У), задающие горизонтальную и вертикальную координаты экрана в пикселах для вывода окна.

Листинг 1.13. Создание объекта MS Agent и вывод персонажа по умолчанию

_____________-........... ......t_____________________________________________________________________________________________________________________________________

Попытка

Agent = Новый СОМОбъект("Agent.Control.2");

Исключение

Сообщить("MS Agent не установлен!");

Возврат;

КонецПопытки;

Agent.Connected = Истина; / / Подключаемся к объекту

// Вывод панели настройки свойств для выбора персонажа по умолчанию

Agent.ShowDefaultCharacterProperties(4, 4) ;

Agent.Characters.Load(,) ; // Загружаем персонаж по умолчанию

Agent.Characters("").Show(); // Выводим на экран персонаж по умолчанию

После вывода персонажа на экран было бы очень хорошо "оживить" его, т. е. анимировать. Для анимации персонажа MS Agent предоставляет два метода: MoveTo и Play. Важно отметить, что эти методы не объекта Agent, а методы конкретного загруженного персонажа (листинг 1.14).

! Листинг 1,14. Анимация персонажа MS Agent

____Liij___шсИ99__HI__________'_______жиННИИНИИИНИИНННИНВННів

Попытка

Agent = Новый СОМОбъект("Agent.Control.2");

Исключение

Сообщить("MS Agent не установлен!'');

Возврат;

КонецПопытки;

Agent.Connected = Истина; // Подключаемся к объекту

Agent.Characters.Load("Merlin", "Merlin.acs"); // Загружаем персонаж Characters = Agent. Characters ("Merlin") // Получаем ссылку на персонаж Characters.Show(); // Выводим на экран

// Перемещаем персонаж

Characters.Мо?еТо (100, 100); // Перемещаем в координаты (X, Y)

Characters.Мо?еТо(200, 0, 500); // 500 — скорость анимации

Characters.Мо?еТо(300, 100, 0); // 0 - без анимации

// Проигрываем заданную анимацию Для Ном = 1 По 5 Цикл

// Волшебник постучится в монитор Characters.Play("GetAttentionContinued");

КонецЦикла;

Characters.Play("Search"); // Волшебник покажет волшебный шар

Метод MoveTo перемещает персонаж в указанное место и имеет три параметра. Первые два являются обязательными и задают новые координаты персонажа (X, Y) относительно всего экрана. Третий параметр необязательный и означает время перемещения персонажа. По умолчанию используется 1000 миллисекунд. При использовании нулевого значения персонаж перемещается без анимации.

Метод Play проигрывает заданную анимацию для заданного персонажа и имеет всего один параметр — строку, содержащую имя анимации. Каждый персонаж имеет свой набор анимаций, поэтому перед использованием данного метода рекомендуется прочитать документацию к вашему персонажу. Для того чтобы получить весь список возможных имен анимаций для персонажа, существует метод AnimationNames, который возвращает коллекцию этих имен. К сожалению, версия 7.7 системы "1C:Предприятие" не позволяет получить все элементы этой коллекции. В версии 8.0 код вывода всех возможный анимаций персонажа будет выглядеть так, как это показано в листинге 1.15.

Листинг 1.15. Получение всех

іажа MS Agent
Попытка

Agent = Новый СОМОбъект("Agent.Control.2'*);

Исключение

Сообщить("MS Agent не установлен!");

Возврат;

КонецПопытки ;

Agent.Connected = Истина; // Подключаемся к объекту

Agent.Characters.Load("Merlin", "Merlin.acs"); // Загружаем персонаж Characters = Agent.Characters("Merlin"); // Получаем ссылку на персонаж

// Получение всех возможных анимаций. Перебор элементов коллекции.

Для каждого Имя Из Characters . AnimationNames (S Цикл Сообщить (Имя) ;

КонецЦикла;

Microsoft Agent выполняет все вызовы по порядку. Поэтому каждая новая команда начнет выполняться только после завершения предыдущей. Для того чтобы узнать, выполнена ли заданная команда, вы можете послать запрос объекту Request, который используется для получения информации о состоянии выполнения.

Microsoft Agent имеет также одну интересную особенность. Например, если статус персонажа не меняется несколько секунд, то Agent начинает самостоятельно проигрывать некоторые виды анимаций.

Для того чтобы остановить анимацию персонажа, применяется метод stop, а для того чтобы остановить все (анимацию, перемещение, речь) — метод StopAll.

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

Для того чтобы персонаж вывел какой-либо текст, существует метод Think, а для воспроизведения текста — метод Speak (листинг 1.16).

: Листинг 1.16. Вывод и воспроизведение текстов персонажем MS Agent

[НННИІ_____________ыЖ.ыы_____i Іг-І .і_________-____L—

Попытка

Agent = Новый СОМОбъект("Agent.Control.2") ;

Исключение

Сообщить("MS Agent не установлен!") ;

Возврат;

КонецПопытки;

Agent.Connected = Истина; // Подключаемся к объекту

Agent.Characters.Load("Merlin", "Merlin.acs"); // Загружаем персонаж

л

Characters = Agent.Characters("Merlin"); // Получаем ссылку на персонаж

Characters.Show(); // Выводим на экран

Characters.Think("Добрый день, приятной работы!") // Вывести текст

// Воспроизвести одну фразу из заданных

Characters.Speak("Хорошая погодка!]Не пора ли на обед?");

Characters.Speak(" ", "welcome.wav"); // Воспроизвести WAV—файл

Метод Think выводит заданный текст в особом окне в виде облачка (как в комиксах).

Метод speak воспроизводит заданный текст или звуковой файл для заданного персонажа и имеет два параметра. Первый задает воспроизводимую строку и является необязательным. Второй — строка, содержащая местоположение звукового файла (WAV или Здесь указывается либо местопо

ложение файла (абсолютный или относительный адрес), либо URL-адрес (если анимация персонажа реализуется через http-протокол).

^ Примечание

Хотя оба параметра являются необязательными, но один из них непременно должен присутствовать. Используйте пробел в первом параметре, чтобы воспроизвести звуковой файл без вывода текста.

Используйте вертикальную черту (|) в первом параметре в качестве разделителя между фразами. Это позволит выбирать в случайном порядке текст при каждом вызове операции. Можно также использовать специальные теги — Speech Output Tags, предназначенные для изменения голоса (громкость, тембр и т. п.). Пример использования тегов, характеристика которых приводится ниже, приведен в листинге 1.17.

О Тег \chr\ — определяет голос, каким произносится текст и может принимать значения Normal (нормальный голос), Monotone (монотонно) и whisper (шепотом). По умолчанию Normal.

? Тег \ctx\ — определяет контекст произносимого текста. Параметр может принимать значения Address — адреса или телефонные номера, E-mail — адреса электронной почты и Unknown — неизвестный контекст. По умолчанию Unknown.

? Тег \Lst\ — позволяет повторить текст, вызванный ранее.

П Тег \мар\ — позволяет произносить один текст, а показывать другой.

П Тег \Рац\ — позволяет выдерживать паузу в произносимой фразе. Длительность паузы задается в миллисекундах (\Раи=гооо\).

П Тег \Pit\ — позволяет управлять высотой голоса персонажа. Частота произносимого текста в герцах (\pit-50\).

? Тег \Spd\ — позволяет изменять скорость чтения текста. Число, указываемое как параметр, определяет количество произносимых слов в минуту (\Spd=100\).

? Тег \vol\ — позволяет определять громкость произносимого текста. Параметр может принимать значения от 0 до 65 535 (\?оі=б5!335\).

цщииииииииидмииииии«нгаиавниМДВЩДМИЙйЯМИШМ|ШШШЯШЦВ8ИМИЙЯЙ^М|^ИИюациддИИЯЦИ

! Листинг 1.17. Использование тегов при воспроизведении текстов в MS Agent

// Текст, воспроизводимый шепотом

Characters.Speak("\Chr=""Whisper""\Тихо, всем спать..;

// Указываем, что воспроизводим электронный адрес Characters.Speak("Пишите мне: \Ctx=""E-mail""\");

// Повторяем предыдущий текст Characters.Speak("\Lst\");

// Выводим один текст, а воспроизводим другой

Characters.Speak("\map=""Посетите наш сайт"Добро пожаловать на сайт www.erpg.ru""\");

// Выдерживаем паузу между фразами

Characters.Speak("Привет!\Раи=1000\Почему не отвечаешь?");

// Плавно изменяем интонацию голоса

Characters.Speak("\pit=50\He делай этого! \pit=300\Oroft! \pit=500\He надо!");

// Воспроизводим текст в медленном режиме

Characters.Speak("\Spd=100\KaK я тебе завидую!");

// Воспроизводим текст пониженной громкостью

Characters.Speak("\Vol=20000\He ори, все спят!");

До сих пор мы рассматривали только методы объектов. Помимо методов MS Agent имеет еще свойства и события. На событиях останавливаться не будем, т. к. их невозможно создать средствами системы "1С:Предприятие". Рассмотрим основные свойства MS Agent.

П Name — возвращает имя персонажа (Джинн, Маг, Робби, Кеша);

П Description — возвращает описание персонажа;

? ExtraData — возвращает расширенные сведения о персонаже;

О version — возвращает версию персонажа;

? visible — возвращает 0, если персонаж скрыт методом Hide, и ~ . если персонаж видим на экране;

П AutoPopupMenu — с помощью этого свойства можно включить или выключить показ контекстного меню, появляющегося при щелчке правой

2 Зак. 722

кнопки мыши на персонаже или иконке в трэйбаре (возвращает текущее состояние свойства);

О Languageю — возвращает или устанавливает языковой идентификатор для персонажа;

П Height — устанавливает или возвращает значение высоты кадра для заданного персонажа;

? width — устанавливает или возвращает значение ширины кадра для заданного персонажа;

П Left — получает или устанавливает левый край кадра персонажа;

О тор — получает или устанавливает верхний край кадра персонажа;

О OriginalHeight — возвращает значение высоты, определенное как настоящее (оригинальное) для заданного персонажа;

? Originaiwidth — возвращает значение ширины, определенное как настоящее (оригинальное) для заданного персонажа;

П TTSModeiD — возвращает или устанавливает идентификатор голосового движка Text-to-Speech (TTS) для персонажа.

В листинге 1.18 показан пример вывода свойств.

; Листинг 1.18. Пример работы со свойствами персонажа MS Agent

Попытка

Agent = Новый СОМОбъект("Agent.Control.2");

Исключение

Сообщать("MS Agent не установлен!");

Сообщить("Загрузить MS Agent можно с сайта Microsoft —

");

Возврат;

КонецПопытки;

Agent.Connected = Истина; / / Подключаемся к объекту

Agent.Characters.Load("Merlin”, "Merlin.acs"); // Загружаем персонаж

Characters = Agent.Characters("Merlin"); // Получаем ссылку на персонаж

Characters. Show () ; // Выводим на экран

// Вывод основных свойств

Сообщить("Имя = ” + Characters.Name);

Сообщить("Описание = " + Characters.Description);

Сообщить("Дополнительные сведения = " + Characters.ExtraData);

Сообщить("Версия = " + Characters.Version);

Сообщить("Видимость = " + Characters.Visible);

Сообщить("Показ контекстного меню = " + Characters.AutoPopupMenu );

// Увеличиваем персонаж вдвое

Characters.Height = Characters.Height * 2;

Characters.Width = Characters.Width * 2;

// Выключаем показ меню

Characters.AutoPopupMenu = Ложь;

Рассмотрим еще один объект — Balloon.

Объект Balloon — это область вывода текстов персонажа, который имеет ряд свойств.

О BackCoior — цвет фона;

О BorderColor — цвет рамки;

О Enabled — возвращает признак включения окна сообщений;

О FontcharSet — номер набора таблицы символов (например, 0 — ANSI);

? FontName — имя шрифта;

? Font Во id — признак полужирного выделения шрифта;

Ш Font italic — признак курсивного выделения шрифта;

? Fontsize — размер шрифта;

П FontUnderline — признак подчеркивания текста;

П ForeColor — цвет текста;

П NumberOfLines — количество строк для вывода текста;

? style — стиль окна сообщений;

П visible — признак видимости окна сообщений.

Свойства BackCoior, BorderColor, FontBoid, Fontitalic, FontUnderline, Forecoior являются свойствами только для чтения. Изменить их значения можно лишь на странице свойств Microsoft Agent, причем только одновременно для всех персонажей. Пример изменения свойств окна сообщений приведен в листинге 1.19.

; Листинг 1.19. Пример изменения свойств окна сообщений MS Agent

Characters.Balloon.FontName = "Comic Sans MS";

Characters .Balloon*FontSiz-e = 24;

Characters.Think("Добрый день, приятной работы!");

Интерактивное взаимодействие с MS Agent

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

Существует множество подобных разработок, большая и лучшая часть которых являются коммерческими, хотя и не дорогими (обычно не более $10).

Для однозначности остановимся на разработке BalloonDialog 6.5 ActiveX компании SommyTech.

Примечание

Загрузить демо-версию BalloonDialog 6.5 можно на сайте производителя —

.

Компонент BalloonDialog позволяет:

П работать совместно с MS Agent;

О выводить модальные предупреждения (замена стандартного оператора Предупредить);

П выводить сообщения с флажком (замена стандартного оператора сообщить);

П выводить вопросы с предложением различных вариантов ответов (замена стандартного оператора вопрос);

CD показывать диалог ввода текста (замена стандартного оператора ВвестиСтроку);

П выводить сложные диалоговые окна, состоящие из текстовых полей, полей для ввода текстов, комментариев, кнопок и радиокнопок одновременно.

Рис. 1.6. Вывод модального окна предупреждения BalloonDialog совместно с Microsoft Agent
Начнем по порядку. Приведем пример создания объекта BaiioonDiaiog, вывода предупреждения и связи с персонажем MS Agent (листинг 1.20). На рис. 1.6 показан вид окна предупреждения.

Листинг 1.20. Интеграция BaiioonDiaiog с MS Agent и вывод предупреждения

МШІИтиИИИмИИИИтаИаИИИИМ№ДДаІЯИРВшІЕИ№іКм1і!а8аиіідШІШІшНИИИЯИД

Попытка

// Устанавливаем ссылку на объект Agent = Новый СОМОбъект("Agent.Control.2");

Исключение

Сообщить("MS Agent не установлен ! ") ;

Сообщить("Загрузить MS Agent можно о сайта Microsoft —

");

Возврат;

КонецПопытки;

Попытка

// Создаем объект BaiioonDiaiog

Balloon = Новый СОМОбъект("BlnDialogT.Balloon");

// Сброс всех установок свойств в значения по умолчанию

Balloon.ResetProperties() ;

Исключение

Сообщить("BaiioonDiaiog не установлен!");

Сообщить("Загрузить BaiioonDiaiog можно с сайта SommyTech — ");

Возврат;

КонецПопытки ;

Agent.Connected = Истина; // Подключаемся к объекту

Agent.Characters.Load("Merlin", "Merlin.acs"); // Загружаем персонаж Characters = Agent.Characters("Merlin"); // Получаем ссылку на персонаж

Characters.Show(); // Выводим на экран

// Вывод модального предупреждения

Balloon.MsgBalloon("Вы не имеете прав для входа в данный модуль!",, "Ошибка!", Characters);

Создание объекта Balloon в версии 8.0 системы " ІСіПредприятие" выполняется С ПОМОЩЬЮ конструктора— Новый СОМОбъект ("BlnDialog. Balloon"), в версии 7.7 — СоздатьОбъект ( "BlnDialog. Balloon") . Если вы используете

демо-версию, то имя СОМ-объекта будет "BlnDialogT.Balloon", при этом каждый раз при инициализации будет появляться окно с информацией о производителе и просьбе зарегистрироваться.

Метод Ms два 11 ооп выводит рядом с персонажем диалог и ждет, пока пользователь нажмет кнопку. Он возвращает целое число — номер, соответствующий нажатой кнопке и имеет четыре параметра. Первый параметр метода — строка сообщения; второй — целое число, определяющее набор кнопок диалога и тип отображаемой на поле диалога иконки; третий — строка заголовка диалога; четвертый — ссылка на персонаж MS Agent. Используя последний параметр, окно диалога автоматически позиционируется на экране в зависимости от положения персонажа. Кроме того, при перетаскивании персонажа пользователем диалог объекта Balloon перемещается вместе с ним.

С помощью этого же метода, как показано в листинге 1.21, можно заменить и стандартную функцию встроенного языка вопрос (рис. 1.7).

Рис. Вывод модального окна с вопросом BalloonDialog совместно с Microsoft Agent

Листинг 1.21. Вывод вопроса С помощью BalloonDialog

По сравнению с предыдущим кодом в методе MsgBaiioon появился второй параметр. Как уже было сказано, второй параметр означает целое число, определяющее набор кнопок диалога и тип отображаемой на поле диалога иконки. Точнее этот параметр определяется суммой двух чисел: кодом набора кнопок и кодом типа иконки диалога.

Например, число 36 (4+32) обозначает, что диалог будет содержать кнопки Yes и No (код 4) и отображаться иконка с вопросом (код 32).

Все возможные наборы кнопок, которые применяются в BalloonDialog, приведены ниже.

? 0 — отображается только кнопка ОК.

П 1 — отображаются кнопки ОК и Cancel.

О 2 — отображаются кнопки Abort, Retry и Ignore.

П з — отображаются кнопки Yes, No и Cancel.

О 4 — отображаются кнопки Yes и No.

П j — отображаются кнопки Retry и Cancel.

Кроме этого, в BaiioonDialog допускается пять типов иконок диалога.

П 16 — отображается иконка Ошибка.

П 32 — отображается иконка Вопрос.

П 4 8 — отображается иконка Предупреждение.

П 64 — отображается иконка Информация.

П 80 — отображается произвольная иконка, определяемая свойствами IconPicture ИЛИ URLIconPicture.

Как уже было сказано, метод MsgBaiioon возвращает номер, соответствующий нажатой кнопке.

П 1 — если пользователь нажал кнопку ОК.

П 2 — если пользователь нажал кнопку Cancel.

П з — если пользователь нажал кнопку Abort.

П 4 — если пользователь нажал кнопку Retry.

П 5 — если пользователь нажал кнопку Ignore.

? п — если пользователь нажал кнопку Yes.

П 7 — если пользователь нажал кнопку No.

Так как система "1C: Предприятие" в основном используется в России и с русским интерфейсом, то крайне желательно, чтобы все кнопки выводились на русском языке. Чтобы изменить названия кнопок, существует свойство ButtonsCaptions. Вообще говоря, с помощью этого свойства можно переименовывать кнопки абсолютно произвольным образом (рис. 1.8).

Внимание вопрос!

Предлагаю отдохнуть и перекусить!

Чай Кофе Сок

Рис. 1.8. Замена названий кнопок в сообщениях BalloonDialog

Рассмотрим пример вывода диалога с произвольными кнопками (листинг 1.22).

Листинг 1.22. Вывод вопроса с помощью BalloonDialog с произвольными кнопками

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

Balloon.ButtonsCaptions="&OK;&Сок;П&рервать;&Повторить;&Игнорировать;&Чай ;&Кофе";

// Выводим модальный вопрос

Ответ = Balloon.MsgBalloon("Предлагаю отдохнуть и перекусить!", 35, "Вни

мание вопрос!", Characters);

Если Ответ = 6 Тогда

Сообщить("Чай закончился!");

КначеЕсли Ответ = 1 Тогда

Сообщить("Кофе не закупили! ") ;

ИначеЕсли Ответ = 2 Тогда Сообщить("Сок выпил кот!");

КонецЕсли;

// Вернем названия кнопок в более привычный вид, причем русский

Balloon.ButtonsCaptions="&OK;0&TMeHa;II&pepBaTb;&Повторить;Шгнорировать;& Да;&Нет";

Символ & в заголовке кнопки ставится перед "горячим" или подчеркнутым символом для отработки комбинации <АИ>+<подчеркнутый символХ

Для заметы стандартной функции "1C: Предприятия" ВвестиСтроку в BalloonDialog применяется метод InputBalloon (рис. 1.9).

Имя пользователя Введете Ваше имя.

Андрей Михайлов

OK j Отмена

Рис. 1.9. Поле ввода текста в сообщениях BalloonDialog

Данный метод предназначен для формирования модального диалога при вводе текста и возвращает введенную пользователем строку (листинг 1.23).

Листинг 1.23. Вывод диалога BalloonDialog для ввода текста

// Диалог ввода текста

Имя = Balloon.InputBalloon("Введите Ваше имя.", "Имя пользователя",

"Андрей Михайлов", Characters);

// Сообщение, выводящее введенный текст

Balloon.MsgBalloon(Имя,, "Здравствуйте!", Characters);

Метод inputBalloon имеет четыре параметра. Первый — текст сообщения, второй — заголовок сообщения, третий — значение, подставленное в поле ввода по умолчанию, и четвертый — ссылка на персонаж.

Помимо довольно простых диалогов BalloonDialog позволяет конструировать довольно сложные диалоговые окна, включающие в себя сообщения, комментарии, кнопки, радиокнопки, поля ввода. Специально для этого существует объект FormBalloon.

Приведем пример, в котором пользователю предлагается диалог выбора одного из нескольких справочников; после выбора справочника должна открываться его форма списка (рис. 1.10).

Открыть справочник

Список справочников в Банковские счета в Валюты

в В иды деятельности

© Контрагенты

О Нематериальные активы

В диалоге показаны первые 5 справочников

Отмена

-~)Г~

Рис. 1.10. Вывод сложных диалогов BalloonDialog с кнопками, радиокнопками и сообщениями

Для того чтобы код работал в произвольной конфигурации, немного усложним задачу и сделаем так, чтобы имена справочников и форм брались из метаданных конфигурации. А так как работа с метаданными и формами существенно различается в версиях 7.7 и 8.0, рассмотрим примеры работы в обеих версиях (листинги 1.24 и 1.25).

тщ мниматпш

I' ЛйепіЧг 1.24. Выбор справочника из радиокнопок в ВаіІоопОіаІоддля версии 7.7

// Добавление кнопки

Balloon.FormBalloon.Buttons.Add("&Отмена");

// Добавление радиокнопок

Для Ном = 1 По Мин (Метаданные . Справочник () , 5) Цикл

Balloon.FormBalloon.OptionButtons.Add(Метаданные.Справочник(Ном) . Представление ) ;

КонецЦикла;

Balloon.FormBalloon.TextBox = 0; // Поле ввода не показываем

Balloon.FormBalloon.TBoxLines = 3; // Трехстрочный текст

// Текст по умолчанию

Balloon.FormBalloon.TBoxText = "Некоторый текст для ввода”;

Balloon.FormBalloon.Title = "Открыть справочник"; // Заголовок диалога

Balloon.FormBalloon.Message = "Список справочников"; // Сообщение диалога // Комментарий

Balloon.FormBalloon.Comment = "В диалоге показаны первые 5 справочников";

Balloon.FormBalloon.SepLine = 1; // Признак вывода разделителя

// Показать сложный диалог

Balloon.ShowFormBalloon(Characters);

/ / Если была выбрана радиокнопка, а не кнопка Отмена Если Balloon.FormBalloon.ButtonPressed = 0 Тогда // Получаем номер выбранной позиции НомерПозиции = Balloon.FormBalloon.OptionPressed;

// Из метаданных получаем имя справочника

ИмяСправочника = Метаданные.Справочник(НомерПозиции).Идентификатор; ОткрытьФорму("Справочник." + ИмяСправочника); // Открываем форму КонецЕсли;

Листинг 1.25. Выбор справочника из радиокнопок B^BalloonDialog

// Добавление кнопки

Balloon.FormBalloon.Buttons.Add("&Отмена");

// Добавление радиокнопок Количество = 1;

Для каждого Справочник Из Метаданме.Справочники Цикл

Balloon.FormBalloon.OptionButtons.Add(Справочник.Представление()); Количество = Количество + 1;

Если Количество = 6 Тогда

Прервать;

КонецЕсли;

КонецЦикла;

Balloon.FormBalloon.TextBox = Ложь; // Поле ввода не показываем

Balloon.FormBalloon.TBoxLines = 3; // Трехстрочный текст

// Текст по умолчанию

Balloon.FormBalloon.TBoxText = "Некоторый текст для ввода";

Balloon.FormBalloon.Title = "Открыть справочник"; // Заголовок диалога

Balloon.FormBalloon.Message = "Список справочников"; // Сообщение диалога

Balloon.FornBalloon.Comment = "В диалоге показаны первые 5 справочников";

// Комментарий

Balloon.FormBalloon.SepLine = Истина; // Признак вывода разделителя

// Показать сложный диалог

Balloon.ShowFormBalloon(Characters);

// Если была выбрана радиокнопка, а не кнопка Отмена Если Balloon.FormBalloon.ButtonPressed = 0 Тогда // Получаем номер выбранной позиции НомерПозиции = Balloon.FormBalloon.OptionPressed;

// Из метаданных получаем имя справочника

ИмяСправочника = Метаданные.Справочники[НомерПозиции—1].Имя;

// Получаем ссылку на форму

Форма = Справочники[ИмяСправочника].ПолучитьФормуСписка();

Форма.Открыть(); // Открываем форму КонецЕсли;

Оба приведенных листинга различаются только работой с объектом метаданных. Все остальные методы почти идентичны.

Метод Buttons .Add объекта FormBalloon добавляет на форму кнопку. Метод OptionButtons.Add добавляет радиокнопку.

Метод ShowFormBalloon открывает модально сконструированный диалог и ждет пока пользователь сделает свой выбор. Данный метод имеет единственный параметр — ссылку на персонаж MS Agent.

После возвращения управления программой в "1C:Предприятие" становится доступно свойство ButtonPressed, которое может принимать два значения:

? 0 — диалоговое окно закрылось без нажатия на кнопку;

О 1 — диалоговое окно пользователь закрыл нажатием на какую-либо кнопку.

Для определения номера позиции выбранной пользователем радиокнопки используется СВОЙСТВО OptionPressed.

Работа с метаданными преднамеренно не описывается, т. к. это не является темой данной главы.

Вы так же можете изменить шрифт текстов, выводимых в диалоге. Для этого у объекта Balloon есть свойство Font:

О Balloon. Font.Bold — признак полужирного выделения текста;

П Balloon. Font .charset — номер набора символов;

? Balloon. Font, italic — признак выделения текста курсивом;

П Balloon. Font. Name — ИМЯ шрифта;

П Balloon. Font. Size — размер шрифта;

П Balloon. Font. strikethrough — признак зачеркнутого текста;

П Balloon, Font. Underline — признак подчеркивания текста.

Создание HTML-редактора

Для создания полноценного HTML-редактора с возможностью визуального редактирования больше всего подходит ActiveX-компонент Microsoft Internet Explorer.

В системе "1C: Предприятие 7.7" использование данного компонента ActiveX, как и любого другого, является затруднительным, поэтому все, о чем здесь пойдет речь, будет касаться версии 8.0.

На рис. 1.11 изображена форма HTML-редактора, реализованная средствами встроенного языка системы "1C:Предприятие 8.0".

Рис. Визуальный HTML-редактор
Основным элементом данной формы является ПолеНТМЪДокумента, который имеет один очень важный метод — перейти, и одно не менее важное свойство — документ. Метод перейти переводит элемент управления ПолеНТМЪДокумента на страницу с заданным адресом, который определяется в единственном параметре метода. Свойство документ возвращает значение типа сомобъект, которое предоставляет доступ к HTML-документу.

Рассмотрим основные методы объекта документ.

О Open — открывает новый поток для методов write и WrieeLn;

О Close — закрывает текущий документ;

О write (Text) — записывает HTML-текст в текущий открытый поток;

О writeLn (Text) — аналогичен методу write, но добавляет в конец возврат каретки;

П ExecCornmand (Command, Userlnter face, Value) — выполняет команду над всем выбранным фрагментом, при этом переменные метода определяются как:

• Command — идентификатор команды, подлежащей выполнению;

• Userlnterface — признак того, нужно ли при необходимости предоставлять графический интерфейс (необязательный параметр);

• value — значение команды (необязательный параметр);

О QueryCommandEnabled (Command) — возвращает двоичное значение, показывающее, доступна ли заданная команда;

О QueryCommandValue (command) — возвращает текущее значение заданной команды;

О ElementFromPoint (x, Y) — возвращает элемент, которому принадлежит точка, заданная координатами х и у;

? QueryCommandSupported (Command) — возвращает признак, доступна ЛИ заданная команда;

П QueryCommandState (Command) — возвращает текущее состояние команды;

П QueryCommandlndeterm (Сornmand) — Возвращает Признак, Находится ЛИ команда в неопределенном состоянии или нет;

О CreateElement (Tag) — создает объект элемента заданного тега;

Рассмотрим пример формирования простейшей HTML-страницы (листинг 1.26).

I Листинг 1.26. Пример формирования HTML-страницы ' V f''.‘-і-';"’-|

Документ = ЭлементыФормы.ПолеНТМДДокумента.Документ;

Документ.Open();

Документ.WriteLn("IIpHMep формирования HTML страницы");

Документ.Write("<Р>Пишите <а href=""mailto:mav@erpg.ги"">письма"); Документ.Close();

Данный пример демонстрирует динамическое формирование HTML-документа, но не редактирование его. Для реализации возможности полноценного редактирования документа предназначен метод ExecCommand (Command, изегІпДегІіасе, Value). Здесь, как уже было сказано ранее, command — это имя выполняемой команды, userinterface — необязательный логический параметр (принимает значения истина или ложь), который отвечает за вывод пользовательского интерфейса команды (если таковой имеется). Если данный параметр опущен, то его значение будет — Ложь, value — необязательный параметр, указывающий дополнительные значения для команды.

Важно отметить, что метод ExecCommand может работать с выделенным текстом.

С помощью данного метода можно: преобразовывать обычный текст в полужирный (выделенный текст будет помещен в теги ); наклонный; задавать цвет фона; цвет текста; вставлять гиперссылки, рисунки и многое другое (листинг 1.27).

ГІІТТЙИНЕ1 ТУГ wT ігт: MTSgLViT ~Г? T~ ЯВаШВВЯМШЯ-"ШЕгУ 5БЯ?іЕ2?ЗЕНН

Листинг 1.27. Пример форматирования выделенного фрагмента текста

// Раскрасить выделенный фрагмент в красный цвет

Документ.execCommand("ForeColor"f Ложь, "FF0000");

// Выделить текст полужирным шрифтом

Документ.execCoramand("Bold", Ложь);

// Вставить рисунок

Документ.ехесСоітшкі("ІпзегЬІтаде",иіЛожь, "C:\Img\mav.jpg">

// Отформатировать текст по правому краю

Документ.execCommandC'JustifyRight", Ложь);

// Установить для выделенного фрагмента текста шрифт Arial

Документ.execCommand("FontName", Ложь, "Arial");

// Отформатировать текст как заголовок второго уровня

Документ.execCommand("FormatBlock", Ложь, "<Н2>");

Приведем полный список доступных команд.

П BackColor — устанавливает или получает цвет фона текущего выделения (value должно содержать имя цвета или его шестнадцатеричный RGB эквивалент, например, FFCCOO);

О Bold — переключает начертание текста текущего выделения между полужирным и нормальным;

? сору — копирует выделение в буфер обмена;

? CreateBookmark — получает имя якоря или создает его для текущего выделения (value — строка, содержащая имя якоря);

П CreateLink — получает URL-ссылки или создает новую ссылку (параметр value должен содержать URL);

П cut — вырезает текущее выделение в буфер обмена;

П Delete — очищает текущее выделение (удаляет все его содержимое);

О Find — находит текст, заданный в параметре value в текущем выделении;

? FontName — устанавливает шрифт для текущего выделения, причем value содержит описание этого шрифта (как в теге );

П Fontsize — устанавливает размер шрифта (value — число от 1 до 7 включительно);

О ForeCoior — устанавливает цвет текста, при этом Value должно содержать имя цвета или его шестнадцатеричный RGB-эквивалент (например, FFCCOO);

П FormatBlock — устанавливает или получает форматирование текущего блока (value может содержать теги-описатели);

П indent — увеличивает отступ выделенного текста на одну единицу приращения;

О InsertButton — перезаписывает идентификатор кнопки вместо текущего выделения (value — строка, содержащая идентификатор кнопки);

П insertFieldset — вставляет поля ввода;

П insertHorizontalRule — вставляет горизонтальную полосу;

О insertiFrame — вставляет встроенный фрейм (іframe);

О Insertimage — вставляет изображение;

П Insert inputButton — вставляет кнопку;

П InsertlnputCheckbox — вставляет флажок (checkbox) ;

П insertinputFiieUpicad — вставляет элемент выбора файла;

П insertinputHidden — вставляет скрытое поле (hidden) ;

П insert inputimage — вставляет изображение;

П insertlnputPassword — вставляет поля ввода пароля;

О xnsertinputRadio — вставляет радиокнопку (Radio);

П insertinputReset — вставляет кнопку Reset;

? Insert input Submit — вставляет кнопку submit;

? insertinputText — вставляет поля ввода текста;

? insertParagraph — вставляет новый раздел (абзац);

П insertorderedList — переключает стиль текущего выделения между нумерованным списком и простым текстом;

П insert'JnorderedList — переключает стиль текущего выделения между маркированным списком и простым текстом;

П insert Select Dropdown — записывает элемент Drop-down вместо текущего выделения (value должно содержать идентификатор элемента);

П I nsertTextArea — вставляет элемент TextArea;

О italic — переключает начертание текста текущего выделения между наклонным и обычным;

П Justifycenter — устанавливает выравнивание по центру для всего блока, в котором расположено текущее выделение;

П JustifyLeft — устанавливает выравнивание по левому краю для всего блока, в котором расположено текущее выделение;

О justifyRight — устанавливает выравнивание по правому краю для всего блока, в котором расположено текущее выделение;

О outdent — уменьшает отступ для всего блока, в котором расположено выделение, на одну единицу;

П overwrite — переключается между режимами вставки текста и замены текста при вводе (значением value может быть истина — замена, ложь — вставка);

О Paste — вставляет текст из буфера обмена вместо текущего выделения;

П Refresh — обновляет текущий документ;

П Remove Format — удаляет из текущего фрагмента все теги форматирования;

П SelectAll — выделяет все содержимое документа;

П ur.Bookmark — удаляет все закладки из текущего выделения;

П underline — переключает начертание текста текущего выделения между подчеркнутым и обычным;

П unlink — удаляет все гиперссылки из текущего выделенного фрагмента;

П unselect — снимает выделение.

С помощью объекта документ можно переключать представления редактируемого HTML-документа между режимами визуального редактирования, текстового и режимом просмотра.

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

| Листинг 1.28. Процедура переключения между режимами

'і ____________-__I______!__. . .. ... __-................—....К-..___---- -- —...^..ИГГ—;-----Г.!.— -----------— —-KM_____ ... . --------!

Процедура ПереключитьРежим(Документ,- ПредыдущийРежим, НовыйРежим)

Если НовыйРежим = "Текст" Тогда

Документ.Body.InnerText = Документ.Body.InnerHTML;

ИначеЕсли ПредыдущийРежим = "Текст" Тогда

Документ.Body.InnerHTML = Документ.Body.InnerText;

КонецЕсли;

Если НовыйРежим = "Просмотр" Тогда

Документ.Body.ContentEditable = "false";

Иначе

Документ.Body.ContentEditable = "true";

КонецЕсли;

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

Данная процедура имеет три параметра:

? документ — ссылка на объект документ;

? ПредыдущийРежим — строка, описывающая ранее использованный режим документа, причем этот параметр может принимать значения текст И Просмотр;

О НовыйРежим — строка, описывающая новый режим документа.

При использовании процедуры, описанной в листинге 1.29, для переключения в режим редактирования HTML-кода существует довольно большой недостаток — весь код отображается одним цветом, что очень затрудняет его чтение и понимание, в то время как все современные редакторы выделяют разными цветами различные группы тегов. Чтобы раскрасить код в окне редактора, необходимо запустить специальный скрипт, который будет выполняться средствами компоненты Internet Explorer.

Приведем пример процедуры переключения между режимами с возможностью раскраски тегов (рис. 1.12) в режиме редактирования HTML кода (листинг 1.29).

Ш HTML Editor

i
; Обычный

згІЭІФ

<• I 1

• Arial

class=tdtbl

Sir

>

vAlign=top>


проекта: < I

href= "forum, erpg. ги">Перейти

форум

на

wldth="33%'

<Н2>Голосование
^Include
<Н2>Новости

number*40"

><ДР>

<Н2>Подписка на новости проекта'

первыми узнавать все новости нашего проекта - подпишитесь на них и Вы никогда не пропустите ничего интересного.

action=http://subscribe,ru/member/quick target=_blank> value="Bam e-mail" name=email>

value=OK> < INPUT tvpe=hidden value = list comp.soft, proa.erect name

<Р>Чтобы

method=post


INPUT

type=submlt

maxLength=100


rc>

0 6 авторе Закрыть

Рис. 1.12. Цветовая раскраска тегов в HTML-редакторе

Листинг 1.29. Процедура переключения между режимами с цветовой раскраской тегов

I code = code.replace(conmentTag,

""$l"")

I code = code.replace(imageTag,""$l"")

I code = code.replace(linkTag,""cfont color=#008000>$l
"")

I code = code.replace(scriptTag,""$l"")

I return code;

I

Документ.parentWindow.execScript(sExpression);

ИначеЕсли ПредьщущийРежим = "Текст" Тогда

Документ.Body.InnerHTML = Документ.Body.InnerText;

КонецЕсли;

Если НовыйРежим = "Просмотр" Тогда

Документ.Body.ContentEditable = "false";

Иначе

Документ.Body.ContentEditable = "true";

КонецЕсли;

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

Регулярные выражения

Регулярные выражения — это очень мощный механизм для обработки строк. С его помощью можно легко найти нужные части текста, проверить, удовлетворяет ли строка определенной маске, и т. п. Такие выражения встроены во многие языки программирования, такие как Perl, JavaScript, Visual Basic. К сожалению, встроенный язык системы "1С:Предприятие" не позволяет напрямую работать с регулярными выражениями, поэтому для решения подобных задач используются СОМ-объекты.

Регулярные выражения являются частью технологии Microsoft Windows Script Technologies и входят в VBScript. Для использования движка регулярных выражений вам необходимо иметь библиотеку vbscript.dll. Данная библиотека включена в Internet Explorer 4 и выше.

С помощью регулярных выражений можно производить поиск, замену подстрок, используя шаблоны. Шаблоны состоят из обычных символов и так называемых метасимволов (metacharacters) — управляющих символов. Список метасимволов достаточно обширен. Наиболее часто используемые метасимволы приведены в табл. 1.1.

Таблица 1.1. Основные метасимволы регулярных выражений

Символ Назначение

Соответствует выражению, находящемуся до знака взятому ноль или большее количество раз. Например, шаблон " [0-9]*" определяет строку, содержащую ноль или большее количество цифр

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

Определяет начало входной строки

Определяет конец входной строки

Соответствует выражению, находящемуся до знака взятому один или более раз. Например, шаблон “ [0~9] определяет строку, содержащую одну или более цифр

. (точка) I

[a-z]

\w

\w

\s

\s

\d

\D

U

0

Определяет любой символ, кроме символа перевода строки

Разделяет два выражения. Например, шаблону "а ) Ь" будут соответствовать строки "а" и "Ь"

Определяет диапазон символов. Например, шаблон "[0-9]" определяет цифру

Определяет любой символ, не соответствующий заданному набору. Например, шаблон " [Л0-9]" определяет любой символ, кроме цифры

Слово. То же, что и [a-zA-z_0-9]

Все, кроме слов. То же, что и [Aa-zA-z_0-9]

Любое пустое место

Любое непустое место

Десятичная цифра. То же, что и [0-9]

He цифра. То же, что и [ло-9]

В фигурных скобках указывается количество символов, подходящих по описанное ранее правило

С помощью круглых скобок можно объединять метасимволы в группы

Для лучшего понимания синтаксиса регулярных выражений рассмотрим несколько примеров.

О "(два! три) богатыря" — соответствует как строке, которая может принимать значение как "два богатыря", так и "три богатыря".

? ",+@.+\..+" — соответствует e-mail-адресу.

П ”а (. ) \іс" — соответствует одному символу затем любым двум одинаковым символам, потом символу "с". Например, шаблон совпадет С "аххс", НО не С "ахус”.

П " (\d\d) \. \1\. \ti\d\d\d" — соответствует дате, у которой число и месяц одинаковы, то есть дата ”0 9.0 9.2001" - подойдет, а дата

"09.12.2001" — нет.

П "\d(2}-\d{5}" — данный шаблон проверяет правильность номера идентификатора, состоящего из двух цифр, дефиса, и еще пяти цифр.

П "<(.*) >. *<\/\1>"— шаблон соответствует тегу НТ Ml..

Для использования в системе механизма регулярных выражений необходимо

создать СОМ-объект с идентификатором VBScript .RegExp.

Объект RegExp имеет следующие свойства:

? Global — признак поиска соответствия во всей строке, причем если свойство принимает значение истина, то поиск ведется во всей строке, если ложь — то только до первого совпадения;

П igr.oreCase — признак игнорирования регистра символов при поиске (свойство может принимать значение истина и Ложь);

О Pattern — строковый шаблон для поиска;

П Multi Line — признак, является ли текст многострочным или нет (свойство может принимать значение истина и Ложь).

Рассмотрим три метода объекта RegExp.

П Test (ИсходнаяСтрока) — метод Test позволяет протестировать строку исходнаяСтрока на соответствие ее шаблону (pattern). Возвращает значение истина, если строка, переданная в качестве параметра, соответствует определенному шаблону, ложь — иначе.

П Execute (ИсходнаяСтрока) — метод выполняет поиск всех совпадений регулярного выражения в строке исходнаяСтрока и возвращает коллекцию MatchCollection, которая содержит в себе всю информацию о совпадениях. Метод Execute может быть использован, например, для извлечения всех e-mail-адресов из строки ИсходнаяСтрока.

П Replace(ИсходнаяСтрока, НопаяСтрока) —метод Replace дает ВОЗМОЖНОСТЬ заменить все совпадения регулярного выражения строкой но-

ваяСтрока.

В листинге 1.30 приведен пример использования метода Execute и разбора коллекции MatchCoiiection.

Листинг 1.30. Поиск совпадений регулярного выражения в строке

L —;__________________________-----------------— ( —....

// Описание регулярного выражения (шаблона)

РегулярноеВыражение = "";

// Определение строки

ТестоваяСтрока = "3To npnMep

";

// Создание объекта работы с регулярными выражениями RegExp = Новый СОМОбъект("VBScript.RegExp");

RegExp.MultiLine = Ложь;

RegExp.Global = Истина-RegExp.IgnoreCase = Истина,•

RegExp.Pattern = РегулярноеВыражение-

// Поиск совпадений регулярного выражения в строке Matches = RegExp.Execute(ТестоваяСтрока);

// Обход элементов коллекции MatchCollection Для каждого Match Из Matches Цикл

Сообщить("Номер первого совпавшего символа: " + Match.FirstIndex); Сообщить("Длина совпавшего образца: " + Match.Length);

Сообщить("Первый совпавший образец: " + Match.SubMatches(0));

Сообщить("Полный образец: " + Match.Value);

КонецЦикла;

В результате выполнения такого кода в окне сообщений появятся следующие строки:

? первая — число (свойство Firstlndex) определяет номер первого совпавшего символа (т. е. символа "Ь");

? вторая строка — <і 6 (свойство Length) определяет длину совпавшего образца;

П третья строка — "bgcolor=#FFAABB>

3To пример" является первым совпавшим образцом, т. е. текст, попавший в скобки " (. л; " в шаблоне (для второго совпадения нужно выполнить метод SubMatches (1) и т. д.);

? последняя строка — "3To пример " (свойство value) представляет полный образец.

Для того чтобы получить цвет фона, определенного в теге в переменной ТестоваяСтрока достаточно изменить регулярное выражение на

строку (# [0-9A-F] {6})". При этом свойство SubMatches (0) вернет как раз необходимую строку "#ffaabb", содержащую цвет в шестнадцатеричной системе счисления.

Для проверки совпадения строки с регулярным выражением используется метод Test. В листинге 1.31 приведен пример такой проверки.

- II fjj] tp?|i , . _ ¦ . ; . ,м ; • ' щ "rr‘hrr'"IT"’ . jij j :

Листинг 1.31. Проверка совпадений регулярного выражения в строке

// Описание регулярного выражения (шаблона)

РегулярноеВыражение = "(#[0-9A-F]{6})";

// Определение строки

ТестоваяСтрока = "cHTMLXBODY bgcolor=#FEAABBXP>3ro npHMep

";

// Создание объекта работы с регулярными выражениями RegExp = Новый СОМОбъект("VBScript.RegExp");

RegExp. MultiLine = Ложь;

RegExp.Global = Истина;

RegExp.IgnoreCase = Истина;

RegExp. Pattern = РегулярноеВыражение;

// Проверка совпадений регулярного выражения в строке Если RegExp.Test(ТестоваяСтрока) Тогда Сообщить("Найдены совпадения!");

Иначе

Сообщить("Совпадений нет!");

КонецЕсли;

Данный пример приведен для системы "1С:Предприятие 8.0". В версии 7.7 метод Test будет возвращать при значении истина и о при значении

Ложь.

Для демонстрации работы метода Replace рассмотрим пример, приведенный в листинге 1.32, который заменит текст, находящийся в тегах <р>, на другой.

¦' .....- ----------------------------------------------------ТіТ----

Листинг 1 ;32. Заме на совпадения регулярного выражения в строке // Определение строки

ТестоваяСтрока = "<Р>Это npMMsp

"; // Определение регулярного выражения

RegExp.Pattern = "<Р>( . *?)";

// Замена текста в переменной ТестоваяСтрока на другую

НовкйТекст = RegExp. Replace (ТестоваяСтрока, "<Р>Новь;й текст в теге Р!")

// Вывод нового текста

Сообщить ("Текст после замены: " + Символы. ПС + НовыйТекст);

В результате работы метода Replace переменная НовыйТекст будет содержать

строку "chtmlxbody bgcolor=# ffaabb хржовый текст в теге

Р! ".

В данном случае в тестируемой строке будет только одна пара тегов <РХ/Р>. Но вы можете сами добавить еще одну пару и проверить работоспособность кода.

Глава 2 Администрирование Windows средствами WMI

Понятие WMI

Одной из базовых технологий компании Microsoft, предназначенной для централизованного управления и слежения за работой различных частей компьютерной сети, под управлением Windows, является Windows Management Instrumentation (WMI).

Объектную модель WMI можно использовать практически в любых языках и средах программирования, в том числе и в системе ”1С:Предприятие". Кроме этого, в операционных системах Windows Xp или Server 2003 реализован механизм доступа к WMI из командной строки и обычных пакетных файлов (технология WMI Command line, WMIC). Применение WMI позволяет автоматически выполнять административные задачи практически любой степени сложности, включая отслеживание и обработку событий, связанных с теми или иными изменениями в информационной системе (например, появление определенной записи в журнале событий на локальном или удаленном компьютере, заполнение жесткого диска сервера до определенного предела и т. п.).

Напомним, что в Windows NT для администрирования операционной системы приходилось пользоваться несколькими утилитами и инструментами. Это обусловлено тем, что данные о компонентах системы хранятся в различных источниках (база пользователей SAM, журнал событий Event Log, системный реестр и т. д.), доступ к которым осуществлялся с помощью разных утилит (диспетчер пользователей — User Manager, просмотрщик журнала событий — Event Log Viewer, редактор реестра — Regedit) и программных интерфейсов (Network API — для работы с данными о пользователях, Event Log API — для просмотра сведений о произошедших событиях, Registry API — для чтения или редактирования системного реестра). Понятно, что это неудобно, т. к., во-первых, приходилось осваивать множество не связанных друг с другом технологий и инструментов, а во-вторых, усложнялось

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

С появлением Windows 2000 эта ситуация была в основном исправлена. Появилась встроенная в операционную систему консоль управления ММС (Microsoft Management Console), с помощью которой можно из одной точки управлять большинством логических и физических компонентов компьютерной сети, построенной на основе Windows. В свою очередь, это стало возможным именно благодаря применению технологии WMI. Данная технология, во-первых, делает доступ к информации о самых различных компонентах информационной системы (журнал событий, системный реестр, подсистема производительности, драйверы устройств и т. д.) независимым от типа этих компонентов, а во-вторых, осуществляет управление любой подсистемой стандартным, не зависящим от реализации этой подсистемы, методом.

Итак, технология WMI — это глобальная концепция настройки, управления и слежения за работой различных частей корпоративной компьютерной сети. В частности, используя WMI, можно с помощью специальных утилит или сценариев Windows Script Host (WSH) решать ряд важных задач.

D Управление различными версиями операционной системы Windows. С помощью сценариев WMI можно обращаться к системным счетчикам производительности, анализировать журналы событий (Event Logs), работать с файловой системой, установленными принтерами, управлять запущенными процессами и сервисами, просматривать и изменять настройки реестра, создавать и удалять совместно используемые ресурсы и т. д. При этом все операции можно выполнять одинаковым образом, как на локальной, так и на удаленной машине.

О Управление ресурсами и службами сети. Сценарии WMI позволяют настраивать сетевые службы (DNS, DHCP и т. п.) и управлять сетевыми устройствами, поддерживающими технологию SNMP (Simple Network Management Protocol).

П Мониторинг состояния системы в реальном времени. Можно создавать сценарии — обработчики событий WMI, которые позволяют отслеживать и нужным образом обрабатывать события, связанные с теми или иными изменениями в информационной системе. Например, появление определенной записи в журнале событий на локальном или удаленном компьютере, заполнение жесткого диска сервера до определенного предела, изменение определенного ключа в системном реестре и т. п.

О Управление серверными приложениями Windows. С помощью WMI можно управлять различными приложениями Microsoft: Application Center, Operations Manager, Systems Management Server, Internet Information Server, Exchange Server, SQL Server.

Доступ к объектам WMI

Для программирования WMI разработан набор классов, которые осуществляют управление объектами WMI. Ввиду большого их количества, ограничимся рассмотрением только основных, с которыми обязательно придется работать.

О swbemLocator — обеспечивает доступ к объекту swbemServices, который осуществляет подключение к WMI. Предоставляет дополнительные возможности проверки подлинности при установлении соединения.

? swbemServices — обеспечивает доступ к экземплярам управляемых объектов, выполняет запросы к классам WMI, выполняет другие связанные с WMI операции.

П SWbemGbjectSet — является коллекцией объектов SWbemObject. Создать объект swbemobjectset и получить к нему доступ можно при помощи нескольких методов, принадлежащих объектам swbemServices

И SWbemObject.

П swbemobject — представляет собой определение одного класса WMI в форме экземпляра объекта.

Подробное описание всех объектов, их свойств и методов можно найти на сайте Microsoft Developer Network Library (MSDN) —

.

Для доступа к WMI через библиотеку сценариев WMI из системы "1 С:Предприятие" нужно сделать три шага, которые являются общими для большинства сценариев WMI. Первое — необходимо подключиться к службе Windows Management Service, второе — получить экземпляры управляемых объектов WMI, третье — вызвать метод или получить доступ к свойствам управляемого объекта. После знакомства с интерфейсами, которые используются для выполнения этих трех шагов, гораздо увереннее чувствуешь себя на пути к вершине искусства написания сценариев.

Самое неприятное в этих основных трех шагах то, что код их написания довольно коренным образом отличается в разных версиях "1 С: Предприятия" (7.7 и 8.0). Причем многие конструкции в версии 7.7 штатными средствами просто не выполнить, поэтому приходится прибегать к внешним вспомогательным инструментам.

Для доступа к объектам WMI из "1C:Предприятия" версии 8.0 вполне хватает стандартных языковых конструкций внутреннего языка, поэтому сначала будут описаны алгоритмы подключения именно для этой версии.

Рассмотрим пример подключения к классу win32_Logicaioisk (листинг 2.1).

г — ----- ------- — ........................... ............................................................................

і Листинг 2.1. Создание доступа к объектам WMI для версии 8.0

II Создать указатель на объект SWbemLocator Попытка

Locator = Новый СОМОбъект("WbemScripting.SWbemLocator");

Исключение

Сообщить(ОписаниеОшибкиО);

Возврат;

КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer;

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл Сообщить("Имя: " + Item.Caption);

КонецЦикла;

Данный код покажет название всех имеющихся логических дисков на локальном компьютере, но это пока нам не важно. Можно также просмотреть все процессоры не только на локальном компьютере, но и на удаленном. Для этого необходимо в предыдущем коде только изменить первый шаг (листинг 2.2).

Листинг 2.2. Подключение к удаленному серверу для вер

И Шаг 1 .^Подключение к WMI на удаленном компьютере

ServicesSet = Locator.ConnectServer("MainServor", "root\cimv2", "Achin", "password");

Рассмотрим каждый из параметров метода ConnectServer в отдельности.

П Первый — имя удаленного компьютера (для локального указывается точка

П Второй — имя пути для WMI. По умолчанию roots с іют2 можно не указывать;

О Третий — имя пользователя (для авторизации).

О Четвертый — пароль пользователя (для авторизации).

Иногда возникает необходимость подключиться к компьютеру создав СОМ-объект с помощью расширенной функции Получить СОМОбъект (аналог Getobject в Visual Basic и Visual Basic Script). Пример такого подключения показан в листинге 2.3.

Листинг 2.3. Подключение к серверу с помощью моникера для версии 8.0

[ЩнВИнПНжНЯНИ______ИЯ_________У-. - V/¦' г- -. У- ____КяМЕазЯИі_______і___т_____________

ИмяКомпьютера = ".";

// Шаг Подключение к WMI на локальном компьютере ServicesSet =

nony4HTbC0M06beKT("winmgmts:{impersonationLevel=impersonate}!\\ + ИмяКомпьютера +"\root\cirnv2”);

// Шаг 2. Извлечение экземпляров класса Win32 LogicalDisk ObjectSet = ServicesSet.ExecQuery("Select * from Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из Obj ectSet Цикл

Сообщить("Имя: ' + Item.Caption);

КонецЦикла;

В данном примере для подключения к WMI на целевом компьютере и доступа ко всем экземплярам класса Win32 _LogicalDisk используется WMI-моникер (moniker) winmgmts. Моникер — это специальный СОМ-объект, который отыскивает в сети или создает и инициализирует экземпляр объекта и возвращает клиенту указатель на него. Для повышения безопасности WMI-моникер использует встроенные средства аутентификации, а также позволяет устанавливать дополнительные маршруты к объектам.

Сценарий возвращает каждый экземпляр Win32_LogicalDisk как SWbemObject из коллекции SWbemObjectSet. SWbemObjectSet И SWbemObject — ЭТО ЛИШЬ ДВ& ИЗ

нескольких интерфейсов, которые предоставляет библиотека сценариев WM1. Так как SWbemObj ectSet является коллекцией, то доступ к ее элементам можно организовать При ПОМОЩИ КОНСТРУКЦИИ Для каждого..Из...Цикл...КонецЦикла. Внутри цикла организован доступ к свойству caption, которое определено в классе Win32_LogicalDisk.

Самое интересное в этом примере то, что на втором шаге пишется текст запроса, который очень похож на конструкции структуризированного языка запросов (SQL). Благодаря этому мы можем выбрать не все экземпляры выборки, а только необходимые, т. е. соответствующие некоторым условиям отбора.

Модифицируем последний пример так, чтобы он выводил информацию только о жестких дисках (HDD) и не показывал CD-ROM, дисководы FDD и т. п. (листинг 2.4).

I Листинг 2.4. Пример извлечения экземпляров класса с условием для версии 8.0

// Шаг 2. Извлечение экземпляров класса Win32 LogicalDisk

ObjectSet = ServicesSet.ExecQuery{"Select * from Win32 LoqicalDisk Where DriveType=3");

// Шаг Просмотр SWbemObjeerSet, ' содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Имя: " + Item.Caption) ;

КонецЦикла;

В данном примере тип диска (DriveType), равный трем, соответствует жестким дискам. Это бывает довольно удобно для ограничения выборки элементов и повышения производительности системы.

Хотя варианты подключения с помощью моникера и объекта SWbemLocator функционально одинаковы, они демонстрируют действие различных механизмов, заложенных в библиотеке WMI. Новичкам может показаться, что синтаксис моникера излишне запутан, поэтому вначале они могут поработать С SWbemLocator. С ТОЧКИ зрения фунКЦИОНЭЛЬНОСТИ метод ConnectServer, который предоставляет swbemLocator, позволяет распределять полномочия, необходимые для проведения аутентификации WM 1-соединения. Синтаксис моникера предоставляет возможность выполнения нескольких действий в одной строке кода.

Теперь рассмотрим, как все то же самое выполняется в системе "1С:Предприятие" версии 7.7.

Сразу необходимо отметить, что в версии 7.7 невозможно штатными средствами:

? перебрать элементы коллекции, так как в 7.7 нет цикла, аналогичному КОНСТРУКЦИИ Для каждого...Из...Цикл...КонецЦикла;

П получить доступ к экземплярам классов, если используется WMI-моникер, так как в 7.7 нет аналога функции ПолучитьСОМОбъект.

Это довольно серьезные ограничения, связанные с работой СОМ-объектов, но вполне решаемые с помощью вспомогательных внешних компонент или дополнительных СОМ-объектов, которые можно написать на любом другом языке программирования. Так как эта глава книги (как, впрочем, и многие другие) посвящена СОМ-технолопіям, то и для обхода ограничений версии 7.7 будет использоваться СОМ-объект.

Для обхода данных ограничений понадобятся всего три функции (листинг 2.5):

0 функция получения очередного элемента коллекции;

? функция получения количества элементов в коллекции;

? функция, заменяющая функцию получитьсомобъект в версии 8.0.

Местоположение файла COMServices.dll не важно, главное зарегистрировать его в системе командой regsvr32 COMServices.dll.

Теперь рассмотрим, как описанные ранее три шага подключения к WMI будут выглядеть в версии 7.7 с использованием вспомогательного СОМ-объекта COMServices (листинг 2.6).

ЯШШВШШШШШШШШШВШВ---------------------------------------..............................~

Листинг 2.6. Создание доступа к объектам WMI для версии 8.0

______1---—...........................................................- .........................J

// Создать указатель на объект COMServices Попытка

COMServices = СоздатьОбъект("COMServices.СОМ");

Исключение

Предупреждение("Ошибка загрузки COM-объекта COMServices.");

Возврат,-КонецПопытки;

// Создать указатель на объект SWbernLocator Попытка

Locator = СоздатьОбъект("WbemScripting.SWbernLocator");

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer(".");

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk") ;

// Шаг З. Просмотр SWbernObjectSet, содержащего экземпляры Для Ном = 0 По ObjectSet.Count-1 Цикл

Item = COMServices.EnumerateCollection(ObjectSet, Ном);

Сообщить("Имя: " + ioerv Caption);

КонецЦикла;

В данном примере используется конструкция цикла Для...По...Иукл...конеиЦукла от нуля до количества элементов (свойство count) коллекции минус один. Внутри цикла вызывается метод EnumerateCol lection объекта COMServices ,

в который передается ссылка на коллекцию objectset и номер извлекаемого элемента коллекции. Во всем остальном код ничем не отличается от аналогичного кода в версии 8.0. Важно отметить, что не каждый класс имеет свойство Count. Если оно отсутствует, то для определения количества элементов в коллекции применяется метод GetCountCoiiection объекта COMServices.

Рассмотрим второй вариант подключения к объектам WMI с помощью моникеров в версии 7.7 (листинг 2.7).

Листинг 2.7.

Подключение к серверу с помощью моникера для версии 7.7

// Сетевое имя компьютера, к которому производится подключение

ИмяСервера = "

// Шаг Подключение к WMI на локальном компьютере

ServicesSet = COMServices.GetCOMObject

("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяСервера + "\root\cimv2");

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.ExecQuery("Select * from Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для Ном = 0 По ObjectSet.Count-1 Цикл

Item = COMServices.EnumerateCollection(Objectset, Ном);

Сообщить (:’Имя: + Item, Caption) ;

КонецЦикла;

Данный пример модифицировался лишь в том, что на первом шаге добавился вызов метода GetCOMObject для получения объекта swbemservices.

В следующих частях этой главы будут показаны примеры практического применения технологии WMI. Большинство примеров будет написано только для версии 8.0 системы "1C:Предприятие". При необходимости перевести их в формат версии 7.7 не составит труда.

Сбор данных об аппаратном составе

В листинге 2.1 приведен пример вывода названий всех имеющихся логических дисков локального компьютера. Помимо названий класс Win32 LogicaiDisk имеет еще очень большое количество свойств, таких как описание, файло-

вая система, метка диска и т. п. В листинге 2.8 приведен пример вывода основных свойств каждого элемента класса win32_LogicalDisk.

; Листинг 2.8. Вывод ОСНОВНЫХ СВОЙСТВ класса Win32_LogicalDi.sk.

// Создать указатель на объект SWbemLocator Попытка

Locator ¦= Новый СОМОбъект("WbemScripting.SWbemLocator");

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Имя: ” + Item.Caption);

Сообщить("Описание: " + Item.Description);

Сообщить("Файловая система: " + Item.FileSystem); Сообщить ("Свободное место: " + Item.FreeSpace);

Сообщить ("Метка диска: " + Item.VolumeName) ;

Сообщить ( "=========================;==" )

КонецЦикла;

Для вывода всех имеющихся свойств класса win32_LogicaiDisk необходимо модифицировать только третий шаг (листинг 2.9).

// Шаг 3. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Диск: " + Item.Caption) ;

// Выборка по всем свойствам

Для каждого Свойство Из Item. Propertie.s_ Цикл

Сообщить(Свойство.Name + "

" + Свойство.Value); ”);

КонецЦикла;

Сообщить ("=============

КонецЦикла;

На практике чаще всего обращаются к конкретному свойству по его имени, однако нужно учитывать, что каждый класс имеет свой набор свойств.

Помимо класса win32_LogicalDisk есть еще ряд классов, позволяющих получать информацию об аппаратном составе локального или удаленного компьютера. Наиболее интересные из них следующие:

? win32_Processor — информация о процессорах;

? win32_BaseBoard — информация о материнской плате;

? Win32 DiskDrive — информация о дисковых накопителях (HDD);

? win32_PhysicalMemory — информация о физической памяти (RAM);

П win32_SoundDevice — информация о звуковых картах;

О Win32 NetworkAdapter — информация о сетевых адаптерах;

П win32_CDROMDrive — информация о приводах CD-ROM;

П win32_FloppyDrive — информация о дисководах (Floppy);

G Win32 DesktopMoni tor — информация о мониторах;

О win32_videoController — информация о видеосистеме;

П win32_Pr inter — информация о принтерах;

П win32_Keyboard — информация о клавиатуре;

П — информация о точечных манипуляторах (мыши, трекболы и т. и.); •

П win32_usBHub — информация о портах USB.

Работа с программным обеспечением

Для работы с программным обеспечением предназначен класс win32_Product. Единственное ограничение данного класса состоит в том, что он работает только с тем программным обеспечением, которое было установлено с помощью Microsoft Windows Installer (MSI).

Основные свойства класса win32_Product:

О Name — название продукта;

П Description — описание;

П identifyingNumber — идентификационный номер продукта (например серийный номер или номер аппаратного устройства);

П instaiiDate — дата инсталляции;

? instaliLocation — путь к продукту; О vendor — производитель;

П version — версия.

Основные методы win32_Product:

П Install(PackageLocation, Options, AllUsers) — установка продукта, причем параметры метода определяются как:

• PackageLocation — путь К файлу установки;

• Options — параметры командной строки;

•Aiiusers — признак установки продукта для всех пользователей;

П Reinstall (ReinstallMode) — переустановить продукт с параметром:

• ReinstaiiMode — режим переустановки продукта (например і — скопировать только недостающие файлы, б — обновить все файлы).

П uninstall О — удалить целиком продукт.

|^|ВниманиеР^|

Все методы возвращает о, если они завершены успешно. Иначе возвращается ЧИСЛО 2147549445.

Получение списка

установленного программного обеспечения

Пример получения всего списка установленного на данном компьютере программного обеспечения, с помощью класса win32_Product, представлен в листинге 2.10.

I ЛИСТИНГ2.10. Получение списка установленного программного обеспечения

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, ”root\cimv2"( Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Product");

Для каждого Item Из Items Цикл

Сообщить ("Имя: " + Item.Name + " (Вер.” + Item.Version +

КонецЦикла;

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

| Листинг2.11. Получение списка продуктов Microsoft

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery!"Select * from Win32_Product Where Vendor LIKE '%Microsoft%';

Для каждого Item Из Items Цикл

Сообщить ("Имя: " + I ten'.. Name + (Вер.” + Item.Version +

КонецЦикла;

В данном примере используется фильтр по маске — "%Microsofl%". Это означает, что в запрос попадут все объекты, у которых свойство vendor содержит строку "Microsoft".

Удаление программного обеспечения

Для удаления какого-либо программного продукта используется метод Uninstall класса Win32 Product. Приведем пример удаления программы Adobe Acrobat 6.0 Professional (листинг 2.12).

і Acrobat 6.0 Professional

Листинг 2.12. Удаление продух

ИмяПрограммы = "Adobe Acrobat 6.0 Professional";

Если Вопрос ("Вы уверены, что хотите удалить " + ИмяПрограммы +

РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Product Where Name = ’" + ИмяПрограммы +

Для каждого Item Из Items Цикл

Item.Uninstall() ;

КонецЦикла;

КонецЕсли;

Работа со службами и процессами

Для работы со службами (сервисами) в WMI используется класс Win32 Service. Класс имеет довольно большое количество свойств. Рассмотрим только основные:

? Accept Pause — признак возможности приостановить службу;

? Acceptstop — признак возможности остановить службу;

О Name — название службы;

? Description — описание;

П DisplayName — имя службы, показываемое пользователю;

О PathName — Путь К файлу;

О Process!d — идентификатор процесса;

П started — признак, показывающий, запущена служба или нет;

O State — строка, описывающая состояние службы (stopped, Start Pending, Stop Pending, Running, Continue Pending, Pause Pending, Paused, Unknown).

Рассмотрим основные методы класса win32_Service:

O startservice () — запускает службу;

П stopservice О — останавливает службу;

П PauseService — приостанавливает работу службы;

П ResumeService <; — восстанавливает работу после приостановления;

П Delete — удалить службу;

O Create (...) — создать службу (метод имеет множество параметров, которые не будут рассматриваться в рамках данной книги).

Для работы с процессами в WMI используется класс win32_ Process. Рассмотрим основные свойства класса:

П Description — описание процесса;

П Process id — идентификатор процесса;

П Name — имя процесса;

П Priority — приоритет (от 0 до 37);

П virtuaisize — объем памяти, необходимый процессу.

Основные методы класса Win32 Process

П SetPriority (Priority) — установить приоритет процесса, при этом параметр Priority может принимать значения:

• 64 — Idle (Ожидание, наиболее низкий приоритет);

• 16384 — Below Normal (Ниже нормального);

• 32 — Normal (Обычный);

• 32768 — Above Normal (Выше нормального);

•128 — High Priority (Высокий приоритет);

• 256 — Realtime (Приоритет реального времени, наивысший приоритет).

О Terminate о — завершить процесс и выгрузить его из памяти.

Получение списка сервисов

Для получения списка установленных сервисов используется класс Win32_service (ЛИСТИНГ 2.13).

Листинг 2.13. Получение списка сервисов

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\

" + ИмяКомпыотера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * from Win32_3ervice’') ;

Для каждого Item Из |Items Цикл

Сообщить ("Сервис: " + Item.DisplayName + " (" + Item.State +

КонецЦикла;

Для определения списка сервисов, которые возможно остановить, используется также класс win32_Service. Однако запрос ограничивается условием того, что свойство Acceptstop равно True (истина). Пример определения такого списка показан в листинге 2.14.

Листинг 2.14. Получение списка сервисов с ограничением по условию

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}! \\" + ИмяКомпыотера + "\root\cimv2"); _

Items = ServicesSet.ExecQuery("Select * from Win32 Service Where Acceptstop = True");

Для каждого Item Из Items Цикл

Сообщить ("Имя процесса: " + Item.DisplayName) ;

КонецЦикла;

Установка приоритета процесса

Рассмотрим пример (листинг 2.15) установки среднего приоритета для запущенного процесса Notepad.exe (блокнот).

7— -------------Я---------------Щ— "Т-’і

Листинг 2.15. Установка приоритета процесса

....... .Safi___ашщзямвгшаШш___¦НшвВВВННЬ;___шаіг&іьдаа:—.—я.—ляат

ABOVE_NORMAL = 32768;

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяКомпыотера + "\root\cimv2");

Items

= ServicesSet.ExecQuery("Select * from Wm32_Process Where Name =

'Notepad.exe'");

Для каждого Item Из Items Цикл

Item.SetPriority(ABOVE_NORMAL); КонецЦикла;

Завершение процесса

Для завершения процесса используется метод Terminate без параметров (листинг 2.16).

процесса

I Листинг 2.16. Завершение

ServicesSet = ПолучитьСОМОбъект

("winmgmts:{impersonationLevel=impersonate}!\\" +

ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from Win32_Process Where Name =

'Notepad.exe'");

Для каждого Item Из Items Цикл

Item.Terminate();

КонецЦикла;

Запуск и приостановка выполнения сервиса

Для запуска сервиса используется метод startservice (листинг 2.17). Для приостановки - метод stopservice. Оба метода используются без параметров .

Листинг 2.17. Приостановление Сервиса

ServicesSet = ПолучитьСОМОбъект ("winmgmts:{impersonationLevel=impersonate}!\\" +

ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from Win32jService Where Name.

='Alerter; // Оповещатель

Для каждого Item Из Items Цикл

Item.StartService(); // Запустить процесс КонецЦикла;

В запросе метода ExecQuery используется фильтрация списка сервисов по имени Alerter (Оповещатель). Таким образом, в выборку попадает всего один сервис — Оповещатель, который и запустится после выполнения метода StartService.

Работа с операционной системой

Для работы с операционной системой в WMI существует несколько классов,

ОСНОВНЫМ ИЗ КОТОРЫХ ЯВЛЯетСЯ — Win32_OperatingSystem. Рассмотрим ОСновные свойства данного класса:

О Name — название операционной системы;

О BootDevice — имя физического диска, с которого загружается операционная сиситема;

П SystemDrive — символ логического диска, на котором установлена система;

О windowsDirectory — папка, в которой установлена система;

П Description — описание к объекту класса;

? FreePhysicalMemory — размер свободной физической памяти (в килобайтах);

? FreeVirtualMemory — размер свободной виртуальной памяти (в килобайтах);

П Manufacturer — производитель операционной системы. Обычно данное свойство имеет значение "Microsoft Corporation";

? NumberOfProcesses — количество запущенных процессов;

? organization — название организации, на которую зарегистрирована данная копия системы;

? RegisteredUser — имя пользователя, на которого зарегистрирована данная копия системы;

П serialNumber — регистрационный номер;

О osLanguage — языковая версия системы. Например с со 9 — английская, 0419 — русская и т. д.;

П озтуре — тип операционной системы. Например, — WIN98, 18 — WINNT, зо - SunOS и т. д.;

П Primary — признак основной операционной системы;

? version — версия системы;

П BuildNumber — номер сборки операционной системы;

Основные методы класса Win32_OperatingSystem:

П Reboot — перезагрузить систему;

П shutdown — выключить компьютер;

П win323hutdown (Flag) — управление функциями выключения компьютера (для\?іп32-операционных систем). Параметр Flag может принимать следующие значения:

• о — завершить работу пользователя (Log Off);

• 4 — принудительное завершение работы пользователя (Forced LogOff);

• 1 — выключение компьютера (Shutdown);

• 5 — принудительное выключение компьютера (Forced Shutdown);

• 2 — перезагрузка( Reboot);

• 6 — принудительная перезагрузка (Forced Reboot);

• 8 — выключение питания (PowerOf'f);

• 12 — принудительное выключение питания (Forced Power Off).

Определение информации об ОС

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

ии об ОС

Листинг 2.18. Определение информаци

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQueryt"Select * from Win32_OperatingSystem"); Для каждого Item Из Items Цикл

Сообщить("Название: " + Item.Caption);

Сообщить("Путь: " + Item.WindowsDirectory);

Сообщить("Версия: "• + Item.Version);

КонецЦикла;

Выключение компьютера

Рассмотрим пример выключения компьютера с помощью метода Win32 Shutdown (ЛИСТИНГ 2.19).

ШШННШНМНШНВННу ' ‘ : —т:------------

i Листинг 19 Выключение компьютера

L_-__________J________— — ____U-._J_Li._-'--.!__________

ServicesSet=nony4MTbC0M06beKT("winmgmts:{impersonationLevel=impersonate, (Shutdown)}!\\" + ИмяКомпыотера + "\root\cimv2");

Stems = ServicesSet.ExecQuery("Select * from Win32_OperatingSystem");

Для каждого Item Из Items Цикл

Item.Win32Shutdown(5); // Выключение КонецЦикла;

Определение разрешения экрана

Для определения разрешения экрана используются свойства Screenwidth

(ширина) И ScreenHeight (высота) класса wi.n32_DesktopMonitor (ЛИСТИНГ 2.20).

мннмшнмнмшмммамшшнннншмнн-------иннишшшшкш

Листинг 2.20. Определение разрешения экрана

-................'.'..Л'.................................................................................................................

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, ”root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_DesktopMonitor");

Для каждого Item Из Items Цикл

Сообщить ("Разрешение: " + Item.ScreenWidth + ,f- x " + Item. ScreenHeight); КонецЦикла;

Список элементов автозагрузки

Для определения списка программ, которые загружаются при запуске операционной системы Windows, предназначен класс win32_startupCommand (листинг 2.21).

Листинг 2.21. Получение списка элементов автозагрузки

.........*____................. ....................................-і__

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_StartupCommand");

Для каждого Item Из Items Цикл

Сообщить("Команда: " + Item. Command);

Сообщить("Описание: " + Item.Description);

Сообщить("Путь: " + Item.Location);

Сообщить("Имя: " + Item.Name);

Сообщить("Пользователь: " + Item.User);

КонецЦикла;

Активизация копии Windows XP/Server 2003

Для активации операционной системы Windows XP или Windows Server 2003 используется метод ActivateOnline () класса Win32_WindowsProductActivation (листинг 2.22).

Листинг 2.22. Активизация копии Windows XP/Server 2003

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2', Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_WindowsProductActivation");

Для каждого Stem Из кtems Цикл

Item.ActivateOnline();

КонецЦикла;

Просмотр учетных записей и доменов

Для работы с учетными записями и доменами обычно используются следующие классы:

О win32_ComputerSystem — содержит системную информацию компьютера; П win32_Group — содержит данные о пользовательских группах;

О win32_Account — содержит данные о группах и пользователях системы. Рассмотрим основные свойства класса Win32_ComputerSystem:

П Description — описание объекта;

О Domain — имя домена, в котором зарегистрирован компьютер;

П DomainRole — роль компьютера;

О infraredSupported — признак поддержки работы с инфракрасным портом; П Manufacturer — производитель компьютера;

П Model — название компьютера;

П NumberOfProcessors — количество процессоров;

П UserName — имя пользователя, работающего в настоящее время с системой; П workgroup — имя рабочей группы.

Класс win32_ComputerSystem имеет важный метод Rename (строка), который может изменять сетевое имя компьютера. Метод имеет один параметр — строка, содержащий новое имя компьютера.

Так как классы Win32_Group И Win32_Account довольно простые, поэтому подробно они рассматриваться не будут.

Определение домена компьютера

Для определения домена, в котором находится компьютер, необходимо прочитать СВОЙСТВО Domain класса Win32_ComputerSystem (ЛИСТИНГ 2.23).

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem"); Для каждого Computer Из Computers Цикл

Сообщить("Имя: " + Computeг.Name);

Сообщить("Домен: " + Computer.Domain);

КонецЦикла;
Для определения домена так же можно использовать свойство DNSDomain класса Win32_NetworkAdapterConfiguration.

Определение роли компьютера

Для определения роли компьютера, т. е. является ли компьютер сервером или рабочей станцией, используется свойство DomainRole класса win32_ComputerSystem. Данное свойство может возвращать одно из следующих значений:

? 0 — самостоятельная рабочая станция (Standalone Workstation);

П 1 — член рабочей станции (Member Workstation);

П 2 — самостоятельный сервер (Standalone Server);

П з — рядовой сервер, т. е. сервер, не имеющий статуса контроллера в конкретном домене (Member Server);

П 4 — резервный контроллер домена, т. е. компьютер в домене Windows NT, который содержит копию политики безопасности домена и его базы данных, а также служит резервом на случай, если главный контроллер домена недоступен (Backup Domain Controller);

П 5 — главный контроллер домена, е. компьютер в домене, который хранит главную копию базы данных учетных записей домена, проводит аутентификацию пользователей, а также может работать как файл-сервер, принт-сервер и сервер приложений (Primary Domain Controller).

Пример определения сетевой роли компьютера показан в листинге 2.24.

і Листинг 2.24. Определение роли компьютера

L.............—.......................-____д_-_--------------------------------

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem") ;

Для каждого Computer Из Computers Цикл

Массив = Новый Массив();

Массив.Добавить("Standalone Workstation");

Массив.Добавить("Member Workstationn");

Массив.Добавить("Standalone Server");

Массив.Добавить("Member Server");

Массив.Добавить("Backup Domain Controller");

Массив.Добавить("Primary Domain Controller");

Сообщить("Роль компьютера: " + Массив[Computer.DomainRole]);

КонецЦикла;

Определение имени текущего пользователя

Для определения имени пользователя, который в настоящее время подключен К компьютеру, используется СВОЙСТВО UserName класса Win32_ComputerSystem (листинг 2.25).

Листинг 2.25. Определение имени текущего пользователя

ЯЯНВНІННННННННННННІ^НІНННННВНЯННННшиКаСіяНИВИпЯІНВНИИВНІНВНМИНННННИНЯНИННННННННЯнЯНННІ^ІНІ

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem") ,-Для каждого Computer Из Computers Цикл

Сообщить("Пользователь: " + Computer.UserName);

КонецЦикла;

Определение локальныхгрупп компьютера

Для определения только локальных групп компьютера используется класс

Win32_Group С условием, ЧТО СВОЙСТВО LocalAccount равно True (Истина) .

Пример определения локальных групп приведен в листинге 2.26.

Листинг 2.26. Определение локальных групп компьютера

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2”, Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Group Where LocalAccount = True");

Для каждого Item Из Items Цикл

Сообщить("Локальная запись: " + Item.LocalAccount);

Сообщить ("Имя группы: + Item.Name) ;

Сообщить("Идентификатор: " + Item.SID);

Сообщить("Тип: " + Item.SIDType) ;

Сообщить("Статус: " + Item.Status);

КонецЦикла;

Определение списка пользователей и групп

Для получения полного списка пользователей и групп используется класс win32__Account. Данный класс имеет свойство SIDType, которое может принимать следующие значения:

П 1 — если объект представляет свойства пользователя;

0 2 — группы пользователей;

П з — домена;

П 4 — псевдонима;

П 5 — общие группы;

О 0 — удаленной учетной записи;

П 7 — ошибочной учетной записи;

П 8 — неизвестной учетной записи;

П 9 — компьютера.

Ниже приведен пример вывода только пользователей и групп (листинг 2.27).

! Листинг 2.27. Определение списка пользователей и групп

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.InstancesOf("Win32_Account");

Для каждого Item Из Items Цикл

Если Item.SIDType = 1 Тогда

Сообщить("Пользователь: " + Item.Caption);

ИначеЕсли (Item. SIDType = 2) или (Item. SIDType = 4) или (Item. SIDType = 5) Тогда Сообщить("Группа: " + Item.Caption);

КонецЕсли;

КонецЦикла; ,

Важно отметить, что объекты данного класса имеют разные наборы свойств в зависимости от значения свойства SIDType.

Работа с системной датой и временем

Для работы с датой и временем в WMI используется класс Win32 LccalTime Подробно останавливаться на нем не будем, т. к. он довольно простой.

Определение даты и времени

Приведем пример определения даты и времени, установленные на конкретном компьютере с помощью класса win32__LocalTime (листинг 2.28).

ши

{Листинг 2.28. Определение даты и времени

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32 LocalTime"); Для каждого Item Из Items Цикл Сообщить("День: " + Item.Day);

Сообщить("Месяц: " + Item.Month) ;

Сообщить("Год: ” + Item.Year);

Сообщить ("Час: ’’ + Item. Hours ;

Сообщить("Минута: " + Item.Minute);

Сообщить ("Секунда ; + item. Second) ;

КонецЦикла;

Определение временной зоны

Для определения временной зоны, установленной на компьютере, используется класс win32_?imeZone (листинг 2.29). В данном классе имеется два свойства: для отображения имени временной зоны, соответствующей летнему Времени (Day light Name), И стандартное ИМЯ (StandardNarne), которое СОответствует временной зоне зимнего времени.

Класс win32_TimeZone имеет следующие свойства для определения данных летнего времени:

DaylightName — ИМЯ Временной ЗОНЫ;

? Day.l iqhtDayOfWeek — день недели — воскресенье, 2 — понедельник и т. д., 7 — суббота);

П DaylightHour — час ДНЯ;

П DaylightMinute — Минута;

П DaylightSecond — секунда;

Администрирование Windows средствами WMI__83

П DaylightDay — день;

CD DaylightMonth — месяц;

? DaylightYear — ГОД.

Для временной зоны зимнего времени существует такой же набор свойств, ТОЛЬКО префикс Daylight заменен на Standard.

Листинг 2.29. Определение названий временных зон и их времени

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_TimeZone");

Для каждого Item Из Items Цикл

Сообщить ("Временная зона (светлое время суток) : " + Item. DaylightName) ;

Сообщить("Время: " + Item.DaylightHour + + Item.DaylightMinute +

+ Item.DaylightSecond) ;

Сообщить ("Временная зона (стандартное имя) : " + Item. StandardName) ;

Сообщить ("Время: " + Item. StandardHour + + Item. StandardMinute +

":" + Item.StandardSecond);

КонецЦикла;

Работа с журналами событий

Для работы с журналами событий в WMI существуют два класса:

? Win32_NTEventLogFile — работа с файлами журналов событий;

CJ Win32_NTLogEvent — просмотр записей журналов.

Класс win32_NTEventLogFile имеет следующие свойства:

? compressed — признак сжатия файла журнала событий;

П CompressionMethod — метод сжатия файла;

? Description — описание объекта;

О Drive — имя логического диска, на котором располагается файл;

ГН Encrypted — признак криптования файла;

П EncryptionMethod — метод криптования файла;

? FileName — имя файла;

? FileSize — размер файла в байтах;

П NumberOfRecords — количество записей в журнале.

Класс win32_NTEventLogFile имеет следующие методы:

П Copy (FiieName) — копирует файл журнала в имя, указанное в параметре FiieName;

О Rename{Filename) — переименовывает файл журнала. Новое имя файла задается в параметре FiieName;

О Delete () — удаляет файл журнала; ?

? compress о — сжимает (архивирует) файл;

П Uncompress о — разархивирует файл журнала;

П ClearEventLog () — очистка записей журнала.

Свойства класса win32._NTLogEvent рассматриваться не будет, т. к. их довольно немного и все предназначены только для просмотра журнала событий. Пример просмотра журнала событий показан в листинге 2.32.

Получение информации о журнале событий

Приведем пример просмотра количества записей журнала "System", максимально допустимого размера и имени файла (листинг 2.30).

[/Листинг2.30. Получение информации о журнале событий

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль) ;

Items = ServicesSet.ExecQuery("Select * from Win32_NTEventLogFile where LogFileName='System'");

Для каждого Item Из Items Цикл

Сообщить("Количество записей в журнале: " + Item.NumberOfRecords); Сообщить ("Максимальный размер файла: " + Item.MaxFileSize) ,•

Сообщить("Имя файла журнала: " + Item. Name);

КонецЦикла;

В запросе данного кода происходит фильтрация объектов по условию — метод LogFileName (имя журнала) равен строке 'System'.

Копирование и очистка журнала

Иногда бывает необходимо сделать копию журнала событий, после чего очистить его. Для этих целей предназначены методы сору и ciearEventLog класса Win32_NTEventLogFile (ЛИСТИНГ 2.31).

LogFileName='Application'");

Для каждого Item Из Items Цикл

Item.Copy("c:\application.evt"); // Копирование журнала Item.ClearEventLog(); // Очистка журнала от записей

КонецЦикла;

Просмотр записей журнала

Для просмотра записей журнала используется класс win32__NTLogF,vent. Приведем пример просмотра записей журнала "System" (листинг 2.32).

Листинг 2.32. Просмотр записей журнала

ServicesSet - Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_NTLogEvent where Logfile='System'");

Для каждого Item Из Interns Цикл

Сообщить("Category: " + Item. Category);

Сообщить("ComputerName: " + Item.ComputerName);

Сообщить("Message: " + Item.Message);

Сообщить("RecordNumber: " + Item.RecordNumber);

Сообщить("TimeWritten: " + Item.TimeWritten);

Сообщить("User: " + Item.User);

Сообщить - ;

КонецЦикла;

Работа с файлами и папками

Для работы с файлами обычно применяется класс ciM_DataEiie. Основные свойства класса:

? Name — полное имя файла;

П Path — путь к файлу;

? Archive — признак архивного файла;

? system — признак системного файла;

О compressed — признак сжатого файла;

П Drive — символ (идентификатор) логического диска, на котором записан файл;

О Extension — расширение файла;

? FileSize — размер файла;

? EightDotThreeFiieName — DOS-совместимое имя файла (например, c:\progra~l).

Основные методы класса:

Г1 Compress о — сжимает файл;

? Copy (FiicName) — копирует файл (новое имя файла определяется параметром File Name5 ;

О Delete о — удаляет файл;

П Rename (FileName) — переименовывает файл (новое имя файла определяется параметром FileName).

В листингах 2.33 и 2.34 приведены примеры работы со свойствами и методами данного класса.

Переименование файлов

Приведем пример переименования файла ReadMe.txt, который находится в папке c:\Program Files\lCv77 (листинг 2.33).

-¦’•-—¦-Гт*’-—

| Листинг 2.33. Переименование файлов

ННЕВЕшЗ&Яееэ!

ServicesSet = ПолучитьСОМОбъект ("winmgmts: !\\" + ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from CimDatafile where Name = 'c:WProgram Files\\lCv77\\ReadMe.txt'");

Для каждого Item Из Items Цикл

Результат = Item.Rename("с:WProgram Files\\lCv77\\ReadMe.bak"); КонецЦикла;

Поиск всех файлов по расширению

Для того чтобы найти все файлы пользователя по расширению, используется запрос к классу clM_DataFile с условием по расширению (свойство Extension). Пример поиска всех файлов с расширением МРЗ приведен в листинге 2.34.

| Листинг 2.34. Поиск всех файлов по расширению

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from CIM_DataFile where Extension

= 'mp3'");

Для каждого Item Из Items Цикл

Сообщить("Имя файла: + Item.Name)

КонецЦикла;

Открытие общего доступа к папке

Для управления доступом к папкам в WMI используется класс win32_Share. Для создания доступа к папке предназначен метод Create, который имеет следующие параметры:

П Path — путь к папке;

? Name — имя общего ресурса;

П туре — тип общего ресурса (о — папка или диск, — принтер, 2 — какое-либо устройство);

? Max imumAI lowed — максимальное количество подключений;

П Description — описание.

Для удаления доступа предназначен метод Delete без параметров.

Пример создания общего доступа к папке C:\Program Files приведен в листинге 2.35).

гт~~——~——-г“~ —щагмишм

i Листинг 2.35. Открытие общего доступа к пап

FILE_SHARE =

MAXIMUM_CONNECTIONS = 25;

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяКомпьютера +

NewShare = ServicesSet.Get("Win32_Share");

Попытка

'Share4You",

Результат = NewShare.Create("C:\Program Files”, FILE_SHARE, MAXIMUM__CONNECTIONS, "Общшя доступ.") ,

Исключение

Сообщить("Ошибка. Невозможно открыть доступ."); КонецПопытки;

Работа с принтерами

Для работы с принтерами используется класс Win32_Printer. Рассмотрим основные свойства данного класса:

О Name — имя принтера;

П Comment — комментарий к принтеру;

d Default — признак принтера по умолчанию;

? Description — описание;

О DriverName — название драйвера принтера;

О Local — признак локального принтера;

П Network — признак сетевого принтера;

? shared — признак наличия общего доступа к принтеру;

О PortName — имя порта принтера;

? PrinterStatus — текущий статус принтера (і — прочий, 2 — неизвестный, з — ожидает, 4 — печатает, 5 — подготавливается, 6 — остановлен, 7 — выключен).

Класс Win32_Printer имеет следующие методы:

О AddPrinterCor.nection (Name) — добавить новый сетевой принтер с сетевым именем Name;

П SetDefaultPrinter() — установить принтер по умолчанию;

П cancelftUJofcs о — отменить все задания;

О Pause {) — приостановить печать;

? Resume {) — возобновить печать;

? PrintTestPage о — распечатать тестовую страницу;

? RenamePrinter(NewPrinterName) — переименовать принтер (новое ИМЯ принтера задается в параметре NewPrinterName).

Добавление нового сетевого принтера

Приведем пример добавления сетевого принтера с сетевым именем "\\OfficeServer\MainOfficePrinter" (листинг 2.36).

Листинг 2.36. Добавление нового сетевого принтера

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!W" + ИмяКомпьютера + "\root\cimv2");

NewPrinter = ServicesSet.Get("Win32_Printer");

Попытка

Результат = NewPrinter.AddPrinterConnection ("\\0fficeServer\MainOfficePrinter");

Исключение

Сообщить("Ошибка. Невозможно добавить принтер.");

КонецПопытки;

Установка принтера по умолчанию

Пример установки принтера по умолчанию приведен в листинге 2.37.

адюдам

Іш

Листинг 2.37. Установка принтера по умолчанию

?НННКгаЯгаНмМННИЯНЯШННННННННИЯНштИВЛНшІЕзІішІ

ИмяПринтера = "MainOfficePrinter";

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel= impersonate}!\\" + ИмяКомпыотера + "\root\cimv2");

Printers = ServicesSet.Get("Win32_Printer");

Items “ ServicesSet.ExecQuery("Select * from Win32_Printer Where Name = ' " + ИмяПринтера + " ' ");

Для каждого Item Из Items Цикл

Item.SetDefaultPrinter() ;

КонецЦикла;

В данном примере, в запросе, используется конструкция where для фильтрации объектов коллекции по имени (свойство Name).

Работа с заданиями планировщика

Для работы с заданиями планировщика используется класс Win32 SchedulodJob.

Основные свойства данного класса определены на примере просмотра заданий (листинг 2.38).

Класс win32_ Scheduled job имеет два метода.

О create — добавить задание. Метод имеет следующие параметры:

• Command — путь к программе, которая будет запускаться;

• startTime — время запуска в UTC-формате (Universal Time Coordinated — универсальное синхронизированное время), при этом общее представление формата можно записать в виде — "YYYYMMDDHHMMSS.MMMMMM(+-)000", где "YYYYMMDD" можно заменить на "*******=1=" (например, дата "******** 123000.000000420" означает запуск в 12:30 после полудня;

• RunRepeatedly — признак многократного выполнения;

• Daysofweek — день недели (1 — понедельник, 2 — вторник, 4 — среда, 8 — четверг, 16 — пятница, 32 — суббота, 64 — воскресенье);

• DaysOfMonth — число месяца;

• interactWithDesktop — признак взаимодействия с рабочим столом;

• Jobld — идентификационный номер задания.

О Delete () — удалить задание.

Просмотр заданий в планировщике

Рассмотрим пример просмотра всех заданий планировщика (листинг 2.38).

Листинг 2,38; Просмотр заданий в планировщике

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel= impersonate}! \\" + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * from Win32_ScheduledJob"); Для каждого Item Из Items Цикл

Сообщить("Заголовок: " + Item.Caption);

Сообщить("Команда: " + Item.Command) ;

Сообщить ("День месяца : " + Item. DaysOfMonth) ;

Сообщить("День недели: " + Item. DaysOfWeek);

Сообщить("Описание: " + Item.Description);

Сообщить("Продолжительность: " + Item.ElapsedTime);

Сообщить ("Дата инсталляции: " + Item. InstallDate) ;

Сообщить("Имя: ” + Item.Name);

Сообщить ("Оповещение: Item.Notify) ;

Сообщить("Приоритет: " + Item.Priority);

Сообщить("Время старта: " + Item. StartTime);

Сообщить("Статус: " + Item.Status);

Сообщить("====================5==========”);

КонецЦикла;

Создание заданий

Для создания задания используется метод create. Приведем пример ежемесячного запуска программы "Блокнот" (notepad.exe) каждого второго числа месяца в 23:30 (листинг 2.39).

ний в планировщик-

at:іл??ЗяшаСа

Листинг 2.39. Создание:

Номер;

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLeveb impersonate}!\\" + ИмяКомпьютера +

Obj ectSet = ПолучитьСОМОбъект("WinMgmts:Win32_ScheduledJob")

ObjectSet.Create("notepad.exe", "********123000.000000 420",True,1,2,True,Номер);

Сообщить ("Заданию присвоен номер: " + Номер) ;

Работа с системным реестром

Для работы с системным реестром предназначен класс stdRegProv, принадлежащий пространству имен root\defauIt. Данный класс совсем не имеет свойств, все действия и значения ключей доступны только через методы.

? CreateKey(DefKey, SubKeyName) — создание нового ключа. Параметры метода могут принимать значения:

• DefKey — идентификатор корневого имени раздела, определяется значениями:

О 2147483648 — HKEY_CLASSES_ROOT;

О 214 7 4 83649 -HKEY_CURRENT_USER;

О 2147483650 - HKEY_LOCAL_MACHINE;

О 2147483651-HKEY_USERS;

О 2147483653 - HKEY_CURRENT_CONFIG;

О 2147483654- HKF.Y DYN.....DATA:

• SubKeyName — имя создаваемого ключа (раздела).

О De]eteKey(DefKey, SubKeyName) — удаление раздела. Параметры метода

аналогичны Методу CreateKey.

? DeleteValue (DefKey, SubKeyName, ValueName) — удаление параметра. Параметры DefKey и SubKeyName аналогичны параметрам метода create-Кеу, параметр ValueName задает имя удаляемого параметра.

П GetDWORDValu.e (De СКеу, SubKeyName, ValueName, Value) — Получение

значения параметра типа DWORD. Параметры DefKey, SubKeyName и ValueName аналогичны параметрам метода DeleteValue. В параметр value возвращается значение ключа ValueName.

П GetStringValue(DefKey, SubKeyName, ValueName, Value) — Получение строкового параметра. Все параметры аналогичны параметрам метода

GetDWORDValue.

О GetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) —

получение значения расширяемого строкового параметра. Все параметры аналогичны параметрам метода GetStringValue.

П SetDWORDVaiue (DefKey, SubKeyName, ValueName, Value) — создание нового параметра типа DWORD. Здесь параметр value задает значение ключа, остальные аналогичны параметрам метода GetStringValue.

П SetStringValue(DefKey, SubKeyName, ValueName, Value) — создание строкового параметра. Все параметры аналогичны параметрам метода SetDWORDVaiue.

О SetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) — создание параметра расширяемого строкового типа. Все параметры аналогичны параметрам метода SetowoRDvaiue.

Чтение значений ключей реестра

Для чтения значений ключей реестра используются методы Getstringvaiue, GetExpandedStringValue И GetstringValue, В зависимости ОТ Типа значения параметра.

Рассмотрим пример чтения значения параметра с именем "HistoryBuffersize", находящимся в разделе HKEY__CURRENT_USER\Console (листинг 2.40).

! Листинг 2.40. Чтение значений ключей реестра

I,..........................................................і..............................................................I—

Перем Значение;

HKEY_CURRENT_USER = 2:47483649; ПутьККлючу = "Console"; ИмяПараметра = "HistoryBufferSize"

Reg = ПолучитьСОМОбъект("winmgmts: {impersonationLevel=impersonate} !\\" + ИмяКомпьютера + "\root\default:StdRegProv")

Reg.GetDWORDValue(HKEY_CURRENT_USER, ПутьККлючу, ИмяПараметра, Значение); Сообщить("Значение: " + Значение);

Создание нового раздела

Приведем пример создания нового раздела с помощью класса StdRegProv (листинг 2.41).

I Листинг 2.41. Создание нового ключа раздела

HKEY_LOCAL_MACHINE = 2147483650;

Reg -- ПолучитьСОМОбъект (’Vinmgmts : { iir'.personationLevei=impersonate} !W" + ИмяКомпьютера + "\root\default:StdRegProv");

ПутьККлючу = "SOFTWAREXNewKey";

Reg.CreateKey(HKEY_LOCAL_MACHINE, ПутьККлючу);

В приведенном примере создается раздел HKEY_LOCAL_MACHINE\ SOFTWARE\ NewKey.

Создание нового параметра

Рассмотрим пример создания нового параметра реестра (листинг 2.42). В примере создается параметр "Форум для вопросов" со значением "" в разделе HKEY_L0CAL_MACH1NE\ SOFlWARE\ NewKey.

- --------------------

I Листинг 2.42. Создание нового параметра реестра

L.„: _______----______.___ „..L__________!u: '

HKEY LOCAL MACHINE = 2147483650;

ПутьККлючу = " SOFTWARE\NewKey" ,• .

Reg = ПолучитьСОМОбъект("winrngmts:{impersonationLevel=impersonat.eji\\" + ИмяКомпьютера + "\root\default:StdRegProv");

ИмяПараметра = "Форум для вопросов";

Значение = "";

Reg.SetExpandedStringValue(HKEY_LOCAL_MACHINE, ПутьККлючу, ИмяПараметра Значение);

Работа с сетью

Для работы с сетью в WMI предназначены два основных класса: Win32_NetworkAdapterConfiguration И Win32_NetworkAdapter. Перечислять все свойства и методы не имеет смысла, т. к. их огромное количество. Назначение многих очень специфичные и будут понятны только сетевым администраторам.

Рассмотрим только некоторые из них.

Отключение сетевого соединения

Если вы используете протокол динамической конфигурации хоста (DHCP, Dynamic Host Configuration Protocol), то отключить сетевое соединение можно методом ReleaseDHCPLease класса Win32_NetworkAdapterConfiguration (листинг 2.43). Иначе, с помощью WMI, это выполнить невозможно. Для возобновления соединения используется метод RenewDHCPLease.

Листинг 2.43. Отключение сетевого соединения

ЯНБшЯНННННІ—ИНННННННННН_____ИННЯН—ЯН—Hi

ServicesSet = ПолучитьСОМОбъект("winrngmts:{impersonationLevel impersonate}!\\” + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True");

Для каждого Item Из Items Цикл Item.ReleaseDHCPLease ();

КонецЦикла;

Определение MAC- и ІР-адресов

Для определения IP-адреса, который назначен данному сетевому компьютеру, необходимо сначала определить его МAC-адрес, используя класс Win32_NetworkAdapter. А затем, ИСПОЛЬЗуя класс Win32j>fetworkMapterConfiguratian, найти IP-адрес, соответствующий данному МАС-адресу. Пример реализации такого механизма поиска приведен в листинге 2.44.

Листинг 2.44. Определение MAC- IP-адресов

MACAddress =

ServicesSet ¦= ПолучитьСОМОбъектГ?іптдпЛз:{impersonationLevel= impersonate!і W‘ + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapter")

Для каждого Item Из Items Цикл MACAddress = Item.MACAddress;

КонецЦикла;

Если MACAddress о Тогда

Сообщить("MAC адрес: + MACAddress;;

Items = ServicesSet.ExecQuery("Select * From Win32_JsIetworkAdapterConf iguration") ;

Для каждого Item Из Items Цикл

Если Item,MACAddress = MACAddress Тогда

Для каждого IPAddress Из Item,IPAddress Цикл Сообщить(”IP адрес: + IPAddress);

КонецЦикла;

КонецЕсли;

КонецЦикла;

КонецЕсли;

Использование команды Ping

Для проверки доступности адресата путем передачи ему специального сигнала можно использовать программу ping.exe. Средствами WMI это можно сделать с помощью проверки значения свойства statusCode класса Win32_PingStatus (ЛИСТИНГ 2.45).

В качестве значения свойства Address, в запросе, может использоваться как имя компьютера (Hostname), так и IP-адрес.

Администрирование Windows средствами WMI_

95

Листинг 2.45, Использоізание команды Ping

//IPAddress = "172.20.129.102"; // IP-адрес IPAddress = "MAVCOMP"; // Hostname

ServicesSet = ПолучитьСОМОбъект ("winmgmts:\\" + ИмяКомпыотера + "\root\cimv2");

Items = ServicesSet,ExecQuery; "Select * From Win32 PingStatus

where Address = + IPAddress +

Для каждого Item Из Items Цикл

Если (Item,StatusCode = NULL) или (Item. StatusCode <> 0) Тогда

Сообщить("Компьютер не отвечает.");

Иначе

Сообщить("Компьютер ответил.");

КонецЕсли;





Глава 3 Использование скриптов WSH

Что такое WSH

Windows Script Host (WSH) — это стандартный компонент операционной системы Windows, который позволяет без предварительной компиляции непосредственно в операционной системе запускать сценарии, написанные на любых языках, поддерживающих технологию СОМ. Собственная объектная модель WSH позволяет из сценариев работать с файловой системой, системным реестром, специальными папками и ярлыками Windows, ресурсами локальной сети, а также запускать процессы и контролировать ход их выполнения. Кроме этого, в самих сценариях WSH можно использовать любые серверы автоматизации (COM-объекты), зарегистрированные в системе.

Примечание_Jjj

WSH встроена в операционные системы Microsoft Windows 98/ME/NT/2000/XP/ Server 2003. Для Windows 95 Windows Script Host можно загрузить с сайта M icrosoft—http: //msdn. microsoft. com /scripting.

Объектная модель WSH

Для того чтобы воспользоваться всеми возможностями, которые представляет эта технология, нужно разобраться в ее структуре. Windows Script Host состоит из целого ряда объектов.

lj Wscript — это главный объект WSH, который содержит информацию о сервере сценариев WSH и позволяет создавать СОМ-объекты, выдавать сообщения в операционную систему, вводить данные с клавиатуры и т. п. Так как данный объект позволяет выполнять все те базовые действия, которые без особых трудностей можно выполнить в среде "1С:Предприятие", то рассматривать этот объект в контексте данной книги будет не уместно.

? WshArguments, WshNamed И WshUnnamed — объекты, обеспечивающие ДОСтуп к параметрам командной строки запущенного сценария Windows. Данные объекты используются исключительно во время запуска скриптов из операционной системы, поэтому их рассмотрение в рамках данной книги бессмысленно.

? Wshshe.il — объект, который позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными папками Windows.

П wshSpeciaiFoiders — объект, обеспечивающий доступ к специальным папкам Windows.

П wshShortout — объект, который обеспечивает работу с ярлыками Windows.

О wshUrlshortout — объект, предназначенный для работы с ярлыками сетевых ресурсов.

? wshEnvironment. — объект, предназначенный для работы с переменными среды (для просмотра, изменения и удаления переменных среды).

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

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

О Wshcontroller — объект, управляющий запуском сценариев на удаленных машинах.

О wshRemote — объект, позволяющий управлять сценарием, запущенным на удаленной машине.

П — объект, используемый для получения информации об

ошибке, возникшей в результате выполнения сценария, запущенного на удаленной машине.

? FileSystemObject — дополнительный объект, обеспечивающий доступ к файловой системе компьютера.

Запуск произвольного ?В-скрипта (VBS)

В настоящее время очень распространены ?В-скрипты, которые пришли на замену пакетным файлам (bat). Очень часто возникает необходимость в запуске того или иного скрипта из системы "1C:Предприятие". Однако времени, а зачастую и возможности переводить код из одного языка программирования в другой, нет. Как раз для такой ситуации и используется

СОМ-объект — MSScriptControl, который позволяет запустить произвольный скрипт из контекста "1С:Предприятия". Объект Msscriptcontroi не входит в объектную модель WSH, но часто применяется в "скриптовых" языках.

Рассмотрим пример запуска ?В-скрипта и вывода его результата в окно сообщений системы "1С:Предприятие" (листинг 3.1).

Листинг 3.1. Запуск произвольного ?В-скрипта (VBS) для версии 8.0

// Произвольный скрипт ТекстСкрипта = "Function VBSFunctionО I GetDefaultPrinter = vbNullString

I Set objWMIService = GetObject(""winmgmts:"" & ""{impersonationLevel= impersonate}!\\.\root\cimv2""}

I Set colInstalledPrinters = objWMIService.ExecQuery('"’Select * from Win32_Printer"")

I For Each objPrinter in colInstalledPrinters

I If objPrinter.Attributes and 4 Then I VBSFunction=obj Printer .Name

I Exit For

I End If

I Next

End Function";

// Создание объекта

scrptCtrl = Новый СОМОбъект("MSScriptControl.ScriptControl"); scrptCtrl.Language="vbscript"; // Указание языка // Добавление исполняемого кода

scrptCtrl.AddCode(ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст());

// Запуск функции по имени и вывод результата

Сообщить(scrptCtrl.run("VBSFunction"));

На самом скрипте останавливаться не будем, т. к. это тема другой главы. Здесь только следует отметить, что он возвращает имя принтера, используемого в системе по умолчанию. Вообще в переменную ТекстСкрипта можно записать любую функцию на ?В-скрипте, а потом выполнить эту функцию, выполнив метод run объекта MSScriptControl. ScriptControl с указанием имени запускаемой функции.

Примечание

Рассмотренный выше код для версии 7.7 будет аналогичным, за исключением создания СОМ-объекта.

Выполнение операций с файловой системой

Для работы с файловой системой из сценариев WSH предназначен объект FiieSystemOb-ject. С помощью этого объекта можно выполнить следующие основные действия:

П создавать каталоги;

? создавать или открывать текстовые файлы;

П копировать или перемещать файлы и каталоги; а удалять файлы и каталоги;

П создавать объекты Drive, Folder и File для доступа к конкретному диску, каталогу или файлу соответственно.

С помощью свойств объектов Drive, Folder и File можно получить детальную информацию о тех элементах файловой системы, с которыми они ассоциированы. Объекты Folder и File также предоставляют методы манипулирования файлами и каталогами (создание, удаление, копирование, перемещение); эти методы в основном копируют соответствующие методы объекта FileSystemObject.

Кроме того, имеются три объекта-коллекции: Drives, Folders и Files. Коллекция Drives содержит объекты Drive для всех имеющихся в системе дисков, Folders — объекты Folder для всех подкаталогов заданного каталога, Files — объекты File для всех файлов, находящихся внутри определенного каталога.

Наконец, из сценария можно читать информацию текстовых файлов и записывать в них данные. Методы для этого предоставляет объект Textstream.

С помощью объекта FileSystemObject можно очень просто написать некое подобие файлового менеджера "Проводник". Рассмотрим основные операции с файловой системой.

Получение сведений о дисках

Для получения сведений об определенном диске предназначен объект Drive. Данный объект позволяет получить информацию о типе файловой системы, метки тома, общем объеме и количестве свободного места и т. д.

Сам объект Drive создается с помощью метода GetDrive объекта FileSystemObject. Приведем пример вывода всех доступных свойств диска (листинг 3.2).

Листинг 3.2. Вывод информации о диске ШтШШШШШШШШ
// Создаем массив типов дисков

ТипыДисков = Новый Массив();

ТипыДисков.Добавить("Неизвестно");

ТипыДисков.Добавить("Съемный");

ТипыДисков.Добавить("Постоянный");

ТипыДисков.Добавить("Сетевой");

ТипыДисков.Добавить("CD-ROM");

ТипыДисков.Добавить("RAM-диск");

// Создаем объект FileSystemObject

FS© = Новый СОМОбъект("Scripting.FileSystemObject");

// Получаем ссылку на объект Drive = t'SO.Get:.Drive("C") ;

// Выводим свойства диска

Сообщить("Информация о диске С:");

Сообщить("Метка диска: " + Drive.VolumeName);

Сообщить("Размер диска: " + Drive.TotalSize/1024 + " Кбайт");

Сообщить("Свободно: " + Drive.FreeSpace/1024 + " Кбайт");

Сообщить("Буква диска: " + Drive.DriveLetter);

Сообщить("Тип: " + ТипыДисков[Drive.DriveType]);

Сообщить("Файловая система: " + Drive.FileSystem);

Сообщить("Готов к чтению: " + Drive.IsReady);

Сообщить ( "Путь : " + Drive Path) ;

Сообщить("Начальная папка: " +Drive.RootFolder);

Сообщить("Серийный номер: " + Drive.SerialNumber);

Сообщить("Сетевое имя: " + Drive.ShareName);

// Изменяем метку диска

Drive.VolumeNarae = "";

Из всех используемых в коде свойств только VolumeName доступно как для чтения, так и для записи, т. е. с помощью этого свойства можно изменять метку диска.

Получение сведений о папках и файлах

Для получения сведений о папках и файлах используются объекты Foldei и File. Данные объекты позволяют определить дату создания или последнего обращения к папке или файлу, их размер, атрибуты и т. д. Сами объекты создаются С ПОМОЩЬЮ методов GetFolder И GetFile объекта FileSystemObject.

Рассмотрим пример вывода всех доступных свойств папки (листинг 3.3).

I Листинг 3.3. Получение сведений о папке

// Функция возвращает строку с атрибутами файла File.

// Вызывается из основного кода при получении сведений о папке или файле Функция ВернутьАтрибутыФайла(File)

Attr = ПереводИзІО(File,Attributes, 2);

// Функция ПереводИзЮ переводит число из 10 системы счисления

// в произвольную, в данном случае - двоичную.

Если Attr = 0 Тогда Возврат "Обычный";

КонецЕсли;

Стр =

Если (Сред(Attr,СтрДлина(Attr)-4, 1} = "1") и (Стройна (Attr) > 4)

Тогда Стр = Стр + "Папка " КонецЕсли;

Если (Сред (Attr, СтрДлина (Attr) , 1) = "1") и (Стройна (Attr) > 0)

Тогда Стр = Стр + "Только чтение КонецЕсли;

Если (Сред (Attr, СтрДлина (Attr) -і, і) ^ "1") и (Стройна (Attr) > 1)

Тогда Стр = Стр + "Скрытый " КонецЕсли;

Если (Сред (Attr,СтрДлина (Attr) -2,1) = "1") и (Строгана (Attr) > 2)

Тогда Стр = Стр + "Системный " КонецЕсли;

Если (Сред (Attr, СтрДлина (Attr)-3,1) = "1") и (Стройна (Attr) > 3)

Тогда Стр = Стр + "Метка " КонецЕсли;

Если (Сред (Attr, СтрДлина (Attr)-5, 1) = "1") и (Стройна (Attr) > 5)

Тогда Стр = Стр + "Архивный КонецЕсли;

Если (Сред{Attr,СтрДіина(Attr)-1C, 1) = "1") и (СтрДлина (Attr) > 10) Тогда Стр = Стр + "Синоним КонецЕсли;

Если (Сред (Attr, СтрДлина (Attr)-11, 1) = "1") и (Стройна (Attr) > 11) Тогда Стр = Стр + "Сжатый " КонецЕсли;

Возврат Стр;

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

// Основная часть кода.

// Создаем объект FileSystemObject

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

// Получаем ссылку на объект

Folder = FSO.GetFolder ("с: \Program Files\") ;

// Выводим свойства папки

Сообщить ("Информация о папке c:\ProgramFiles\");

Сообщить("Атрибуты: " + ВернутьАттрибутыФайла(Folder));

Сообщить("Дата создания: " + Folder.DateCreated);

Сообщить("Дата последнего доступа: " + Folder.DateLastAccessed) ; Сообщить("Дата последнего изменения: " + Folder.DateLastModified); Сообщить("Признак корневой папки: " + Folder.IsRootFolder);

Сообщить("Имя: " + Folder.Name); //!!

Сообщить("Родительская папка: " + Folder.ParentFolder);

Сообщить("Путь: " + Folder.Path);

Сообщить("Короткое имя: " + Folder.ShortName);

Сообщить("Короткий путь : " + Folder.ShortPath);

Сообщить("Размер: " + Folder.Size);

Сообщить("Доступ к дочерним папкам: " + Folder.SubFolders);

Сообщить("Туре: " + Folder.Туре);

Объект File имеет подобный набор свойств.

?_Примечание

Свойство Name доступно для записи, т. е. с помощью его можно переименовать файл или папку.

Отдельного внимания заслуживает свойство SubFolders, которое предоставляет доступ к дочерним папкам. Данное свойство возвращает коллекцию Folders, которая содержит объекты Folder. Элементы коллекции системы "ІС.'Предприятие" в версии 8.0 можно получить с помощью конструкции Для каждого...из...Цикл...КонеиЦикла. Для версии 7.7 это можно сделать только с помощью внешней компоненты или СОМ-объекта (пример такого СОМ-объекта был рассмотрен в главе 2).

104 _

Проверка существования определенного диска, каталога или файла

Для проверки существования определенного диска, каталога или файла предназначены методы DriveExists, FciderExists и FileExists объекта FileSystemObject.

Данные методы возвращают Истина (в версии 7.7 метод возвращает -1), если диск, папка или файл, переданный в качестве параметров найден, иначе — ложь (в версии 7.7 метод возвращает 0).

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

Приведем простой пример проверки наличия файла (листинг 3.4).

л* ДА ЛЗДУІТГСШТПІИЗТЯЯТУГОЩТТТПЯПНПИШИИИИ^ИИИИМИИИИЦЩІПІИИІІШИИІИШНВМЯИВІ **,міщц||ц|м|ймц

¦ Листинг 3.4. ' Проверка на наличие файла

L__:___:_____________________ ;

ИмяФайла = "c:\ProgramFiles\lcv8\bin\lcv8.exe";

FSO = Новый C0M06beKT("Scripting.FileSystem0bject");

Если FSO.FileExists(ИмяФайла) Тогда Сообщить("Файл существует!");

Иначе

Сообщить ("Файл не найден:'");

КонецЕсли;

Копирование файлов и папок

Для копирования файлов и папок предназначены методы copyFile и

CopyFolder объекта FileSystemObject, а также методы Fi і.е . Сору И Folder.Сору.

Рассмотрим простой пример копирования файла и папки (листинг 3.5).

Листинг 3.5

LSii

FSO = Новый СОМОбъект("Scripting.FileSystemObject") // Копирование файла

FSO.CopyFile("c:\Program Files\lCv77\ReadMe.txt", "с:\");

// Копирование папки

FSO.CopyFolder("c:\lc", "c:\2c");

Метод Copy File имеет важную особенность — в качестве первого параметра можно задавать маску копируемых файлов. Например, чтобы скопировать все файлы с расширением doc, необходимо вызвать метод следующим образом: CopyFile("с:\*.doc", "d:\").

Перемещение файлов и папок

Для перемещения файлов и папок предназначены методы Movefile и MoveFolder объекта FileSystemObject, ИЛИ МеТОДЫ File.Move И Folder.Move.

Рассмотрим пример перемещения файлов (листинг 3.6).

Г г "'¦¦¦’•"ГН-' П “' 1 д* Гf ’ ” ' ' г - " -- - — — -------1; -------------------,

..Листинг 3.6. Перемещение файлов

----------________..._____.......—____________ _______________________.;_________________________J

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

// Перемещение файлов

FSO.MoveFile("с:\Program Files\lcv8\*.htm", "c:\"J;

В приведенном коде перемещаются все файлы с расширением htm.

Удаление файлов и папок

Для удаления файлов и папок применяются методы DeieteFiie и DeleteFolder объекта FiieSystenObject, ИЛИ методы Fiіе.Delete И Folder.Delete.

Рассмотрим пример удаления файлов (листинг 3.7).

Листинг 3.7. Удаление файлов

и
FSO = Новый СОМОбъект("Scripting.FileSystemObject");

// Удаление файлов

FSO.DeieteFiie("с:\*.htm");

Приведенный выше код осуществляет удаление всех файлов с расширением htm.

Создание папок

Для создания папок предназначены методы FileSystemObject.CreateFolder и Folders.Add. Перед созданием вложенной папки необходимо удостовериться, что существует папка верхнего уровня, иначе появится ошибка. То есть данные методы не предназначены для создания группы вложенных папок.

Ниже приведен пример последовательного создания группы вложенных папок (листинг 3.8).

Листинг 3.8. Создание папок

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

Корень = "c:\testV; FSO.CreateFolder(Корень);

// Создаем группу папок Для Номі = 1 По 5 Цикл

FSO.CreateFolder(Корень + "folder" + Номі);

Для Ном2 = 1 По 5 Цикл

FSO. CreateFolder (Корень + "folder" + Номі + "\subfolder" + Номі + + Ном2) ;

КонецЦикла;

КонецЦикла;

Работа с текстовыми файлами

С помощью WSH можно создавать текстовые файлы. Для этого предусмотрены методы FileSystemObject. CreateTextFile И Folders . CreateTextFile. Данные методы возвращают ссылку на объект Text stream и имеют три параметра:

? Filename — ИМЯ файла;

О overwrite — признак замены существующего файла (параметр является не обязательным);

П Unicode — признак создания файла в формате Unicode, иначе создается в формате ANSI (параметр является не обязательным).

С помощью методов write Line и writeBiankLines полученного объекта Textstream можно добавлять строки в файл.

Рассмотрим пример создания файла в формате ANSI и записи в него нескольких строк (листинг 3.9).

ИИИИМ^МИИИЙЙШ I ШИП

кв н взяиі ЮНН Ц и k^rbbesr цииіі mm ¦¦¦¦ "лтд на

вп::': ' : 'Н?. . !

Листинг 3.9. Создание текстового файла

FSO = Новый СОМОбъект("Scripting.FileSysternObject") ;

// Получаем объект TextStream

File = FSO.CreateTextFiie("С:\Прігмер создания файла.txt", Истина, Ложь); File.WriteLine("Дата создания: " + РабочаяДата);

File.WriteBlankLines(2); // Добавляем 2 пустые строки

File.WriteLine("Добро пожаловать на сайт автора: ");

File.WriteLine("Copyright (С) Андрей Михайлов aka МА? 2004");

File.Close () ;

В WSH нельзя создавать файлы, отличные от текстовых.

Для открытия текстового файла, с целью чтения, записи или добавления НОВЫХ записей, Предназначены методы FileSysternObject, OpenTextFile И File.OpenTextStream. Данные методы имеют ряд параметров.

? Filename — ИМЯ файла.

О — режим открытия файла. Параметр может принимать следующие

значения:

• 1 — только для чтения;

• 2 — для записи;

• 8 — открытие файла и добавления строк в конец.

П Create — признак создания нового файла.

? Format — формат открываемого файла. Параметр может принимать следующие значения:

• -2 — используется формат, принятый по умолчанию в системе;

• -1 — Unicode;

• о - ASCII.

Для чтения всего текста из файла используется метод ReadAll () ¦ Для построчного чтения — ReadLineO. Рассмотрим пример открытия и чтения файла (листинг 3.10).

Листинг 3.10. Открытие и чтение текстового файла

ИмяФайла = "С:\Пример создания файла.txt”;

FSO = Новый СОМОбъект("Scripting.FileSysternObject");

// Проверяем, существует ли необходимый файл на диске

Если FSO.FileExists(ИмяФайла) Тогда

File = FSO.OpenTextFile(ИмяФайла, 1, Ложь, 0);

Сообщить(File.ReadAll());

Иначе

Сообщить("Файл не найден!");

КонецЕсли;

Получение списка всех доступных дисков, папок и файлов

Для получения списка всех доступных дисков у объекта FiieSystemObject существует коллекция Drives, содержащаяся В свойстве FiieSystemObject.Drives. Для папок, в этом случае, имеется коллекция Folders, содержащаяся в свойстве Folder.. Subfolders. Для файлов — коллекция Files, содержащаяся В свойстве Folder, Files.

Рассмотрим примеры вывода списка всех дисков (листинг 3.II) и списка всех файлов и папок (листинг 3.12).

сков

"Іистинг 3.11. Получение списка всех дос

—____________

FSO = Новый СОМОбъект("Scripting.FiieSystemObject");

// Выборка объектов из коллекции Drives Для каждого Диск Из FSO,Drives Цикл Стр = flncK.DriveLetter;

ЕслиflncK.DriveType= 3 Тогда

Стр Стр + - +flHCK.ShareName;

ИначеЕсли Диск.IsReady Тогда

Стр=Стр+ - +flncK.VolumeName; Иначе

Стр = Стр + - [Диск не найден]";

КонецЕсли;

Сообщить(Стр);

КонецЦикла;

Листинг 3.12. Получение списка всех дс

:папок и файлов

FSO = Новый СОМОбъект("Scripting.FiieSystemObject"); Folder = FSO.Get Folder("С:V);

// Выборка всех папок

Для каждого Папка Из Folder. SubFolciers Цикл Сообщить ("і" + ВРег (Папка. Name) + "j";;

КонецЦикла;

// Выборка всех файлов

Для каждого Файл Из Folder,Files Цикл Сообщить(НРег(Файл.Name));

КонецЦикла;

В листинге 3.12 приведен пример вывода списка только папок и файлов одного уровня, находящихся в корневом каталоге диска С:. Для построения дерева папок и файлов можно использовать данный пример, который должен находиться в функции, вызываемой рекурсивно.

Чтение свойств МРЗ-файлов

Как уже было показано ранее, с помощью объекта FiieSystem.object можно обращаться к файлам.

Рассмотрим следующую задачу. Допустим необходимо прочитать теги (Ш?і) МРЗ-файла. Тегами обычно называют свойства МРЗ-файла, включающими в себя информацию об авторе, названии, размере файла и т. п. Для решения данной задачи необходимо выполнить следующие действия:

1. Создать объект FileSystemObject для доступа к файлам.

2. Проверить наличие необходимого файла на диске.

3. Получить ссылку на объект File с помощью метода GetFile.

4. Прочитать размер файла с помощью метода File, size и проверить, чтобы он был не менее 128 байт.

5. Открыть файл для чтения. Метод File,Cper.AsTextstream(i) возвращает объект Stream.

6. Получить строку, содержащую последние 128 байт, в которых и хранятся теги МРЗ-файла.

7. Проверить наличие в начале полученной строки символов "TAG".

8. Выделить из строки нужные теги согласно спецификации МРЗ-файлов. Рассмотрим пример чтения тегов МРЗ-файла (листинг 3.13).

— -¦ ....................--г-ц”,. ; • -or —¦-г.........-...........-------------------: "ЛДГ

j Листинг 3.13. Чтение тегов МРЗ-файла

// Переменная ИмяФайла должна содержать строку, содержащую путь к MP3-файлу Если (ИмяФайла = Неопределено) или СокрЛП (ИмяФайла = "") Тогда Сообщить("Не указано имя файла!");

Возврат;

КонецЕсли;

// Создание объекта FileSystemObject Попытка

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

Исключение

Сообщить ("Ошибка создания объекта! ") ;

Возврат;

КонецПопытки;

// Проверка на наличие файла Если НЕ FSO.FileExists(ИмяФайла) Тогда Сообщить("Файл не найден!");

Возврат;

КонецЕсли;

// Получаем размер файла и проверяем, чтоб он был не менее минимально допустимого

File = FSO.GetFile(ИмяФайла);

FileLength = File,Size;

Если FileLength <= 128 Тогда

Сообщить("Файл малого размера!”);

Возврат;

КонецЕсли;

// Открываем файл для чтения (параметр = 1)

Попытка

Stream = File.OpenAsTextStream(1);

Исключение

Сообщить("Невозможно открыть файл!");

Возврат;

КонецПопыт ки;

// Считываем строку с информацией (ІОЗ?І)

Stream.Skip(FileLength - 128);

Попытка

Data = Stream.Read(128);

Использование скриптов WSH_

Исключение

Сообщить("Невозможно прочитать файл!");

Возврат,-КонецПопытки;

// Закрываем поток и удаляем объекты Stream.Close();

File = Неопределено;

FSO = Неопределено;

// Проверяем полученную строку на корректность Если рев (Data, 3) <> "TAG" Тогда

Сообщить ("Неверный формат файла! "> ;

Возврат.,-КонецЕсли,-

// Перечисляем все жанры, встречающиеся в спецификации к МРЗ-файлам Жанры = Новый Массив();

Жанры.Добавить("Blues");

Жанры.Добавить("Classic Rock");

// и

Жанры.Добавить("JPop");

Жанры.Добавить("Synth Pop");

// Выделяем из строки нужные поля Название = СокрЛЩСред{Dataг 4, 30));

Артист = СокрЛП(Сред(Data, 34, 30));

Альбом = СокрЛП(Сред(Data, 64, 30));

Год = СокрЛП(Сред(Data, 94, 4));

Комментарий = СокрЛП(Сред(Data, 98, 30));

Трек = КодСимвола(Сред(Data, 127, 1));

НомерЖанра = (Сред (Data, 128,

Если НомерЖанра < Жанры.Количество() Тогда Жанр = Жанры[НомерЖанра];

Иначе Жанр =

КонецЕсли;

// Выводим теги

Сообщить ("Название: ’’ + Название);

Сообщить("Артист: ' + Артист);

Сообщить ("Альбом: " + Альбом);

Сообщить ("Год: " + .Год) ;

Сообщить("Комментарий: " + Комментарий);

Сообщить("Трек: " + Трек);

Сообщить("Жанр: ” + Жанр);

Файлы МРЗ хранятся в формате Unicode. Однако, к сожалению, версия 7.7 системы "1C:Предприятие" не позволяет работать с такими форматами. В связи с этим, напрямую в версии 7.7 теги МРЗ-файлов прочитать не удается. Для чтения тегов в данном случае нужно использовать внешние компоненты или объект MSScriptControl, ScriptConrrol, вынося весь код в VB-скрипт.

Специальные папки

Бывают ситуации, когда необходимо записать какой-либо файл в специальную папку (на рабочий стол, в избранное, включить в автозагрузку и т. п.). В английской версии Windows существует папка Startup (Автозагрузка), и если вы, например, укажите путь C:\WINЕЮ\?8\Главное меню\Программы\ Автозагрузка, то эта запись сработает только в русской версии Windows и нигде больше. Чтобы избежать этих проблем, был создан список специальных папок. Чтобы получить доступ к какой-либо специальной папке, можно воспользоваться методом speciaiFoiders объекта wshshell. Данный метод имеет один параметр — строку, описывающую имя специальной папки. Рассмотрим возможные параметры метода SpeciaiFoiders:

П AiiusersDesktop — рабочий стол (для всех пользователей);

О AiiusersStartMenu — меню Старт (для всех пользователей);

? AiiusersPrograms — меню Программы (для всех пользователей);

? Allusers startup — Автозагрузка (для всех пользователей);

? Desktop — рабочий стол;

П Favorites — Избранное;

П Fonts — шрифты;

? MyDocuments — Мои документы;

О NetHood — папка NetHood;

О PrintHood — папка PrintHood;

П Programs — меню Программы;

О Recent — последние запуски;

П г : : — меню Отправить;

П startMenu — меню Старт;

П startup — Автозагрузка;

О Templates— шаблоны.

Рассмотрим пример вывода некоторых специальных папок в системе "1С:Предприятие" версии 7.7 (листинг 3.14).

Листинг 3.14. Вывод специальных папок в версии 7.7

—-Aver ‘... __I— -сіжсЗсІ л )ТдйизЯЗ.і.С _n __ _ _ пі^иййЯйиЯЯв

WSHShell = СоздатьОбъект("WScript.Shell");

Сообщить("Автозагрузка: " + WshShell.SpecialFolders("Startup")); Сообщить("Программы: " + WshShell.SpecialFolders("Programs")); Сообщить ("Мои документы: " + WshShell.SpecialFolders ("MyDocuments") ) ; Сообщить("Шрифты: '' + WshShell.SpecialFolders("Fonts"));

Сообщить("Меню ’Старт': " + WshShell.SpecialFolders("StartMenu"));

В версии 7.7 все довольно просто и прозрачно. А вот в 8.0, по непонятным причинам, данный код вызывает ошибку. Чтобы обойти эту ошибку, можно использовать объект MSScriptControl. Scrip-Control, в котором и получать путь, указывающий местоположение специальных папок, после чего возвращать их в контекст системы "IС:Предприятие". Рассмотрим пример получения специальных папок через ?В-скрипт (листинг 3.15).

End Function");

// Запускаем функцию SpecialFolders с параметром <Имя>

ИмяПапки = Ctrl.Run("SpecialFolders", Имя);

Исключение

// В случае неудачного выполнения возвращаем — Неопределено ИмяПапки = Неопределено,-

КонецПопытки;

Возврат ИмяПапки;

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

Сообщить("Рабочий стол: " + ПолучитьСистемнуюПапку("Desktop"));

Сообщить ("Мои документы: " + ПолучитьСистемнуюПапку ("MyDocuments") ) ;

Сообщить("Избранное: " + ПолучитьСистемнуюПапку("Recent"));

Работа с ярлыками Windows

С помощью WSH можно создавать ярлыки для файлов и адресов сайтов в Интернете (URL). Для этого используется объект Wshshell.

Создание ярлыков для файлов

Для создания ярлыка используется метод Createshortcut объекта Wshshell, который имеет единственный параметр — полное имя файла для ярлыка.

Приведем пример создания ярлыка для запуска системы SQL-версии ”1С:Предприятие 7.7" (листинг 3.16).

Листинг 3.16. Создание ярлыка для файла

Shell = Новый СОМОбъект("WScript.Shell");

DesktopPath = ПолучитьСистемнуюПапку("Desktop");

Link = Shell.GreateShorrcut(Desktop-Path + "\test.Ink"); Link.Arguments = ”1 2 3";

Link. Description = ''Тестовый пример” ;

Link.HotKev = "CTRL+ALTt-SHIFT+X";

Link,IconLocation = "lcvis.exe, 1”;

Link.TargetPath = "c:\ProgramFiles\lCv77\BIN\lcv7s.exe"; Link.WindowStyle = 3;

Link.WorkingDirectory = "c:\ProgramFiles\lCv77\BIN\”; Link.Save();

В данном примере метод Createshortcut возвращает ссылку на объект Link. Для описания параметров ярлыка сначала заполняются основные свойства объект Link. После этого он сохраняется с помощью метода save о .

Объект Link имеет следующие свойства:

П Arguments — описание параметров запуска файла;

О Description — текстовое описание к ярлыку;

П HotKey — комбинация клавиш для быстрого запуска ярлыка;

П iconLocation — файл с иконкой;

? TargetPath — полное имя запускаемого файла;

П windowstyle — способ запуска программы, причем свойство может принимать следующие значения:

• з — при запуске окно программы будет развернуто на весь экран;

• 4 — устанавливает стандартный размер окна;

• 7 — окно будет свернуто в значок на панели задач;

П WorkingDirectory — рабочая папка.

Копирование, перемещение и удаление ярлыков

Для копирования, перемещения и удаления ярлыков применяются такие же методы, что и для работы с файлами. А именно CopyFile, Move File и DeleteFile (листинг 3.17).

Листинг 3.17. Копирование, перемещение и удаление ярлыка

Shell = Новый СОМОбъект("WScript.Shell");

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

DesktopPath = ПолучитьСистеьшуюНапку("Desktop") + "\test.lnk";

NewPath =

// Копирование ярлыка

FSO.CopyFile(DesktopPath, NewPath); .

// Перемещение ярлыка

MyDocumentsPath = ПолучитьСистемнуюПапку("MyDccurnents”) + "\test.lnk”; FSO.MoveFile(NewPath, MyDocumentsPath);

// Удаление ярлыка

FSO.DeleteFile(MyDocumentsPath);

Создание ярлыков для URL-адресов

Помимо ярлыков для файлов, WSH позволяет создавать ярлыки для запуска Web-страниц. В этом случае применяется все тот же метод CreateShortcut, но в качестве аргумента необходимо использовать файл с расширением URL и в свойстве TargetPath указывать адрес интернет-страницы.

Рассмотрим пример создания на рабочем столе ярлыка для запуска форума, посвященного системе ”1С:Предприятие" (листинг 3.18).

! Листинг 3.18. Создание ярлыка для URL-адреса

5..........................................................................................-......................і.................................._f_J

Shell = Новый СОМОбъект("WScript.Shell");

DesktopPath = ПолучитьСистемнуюПапку("Desktop");

URL = Shell,CreateShortcut(DesktopPath + "\ERP Group.url");

URL.TargetPath = "";

URL.Save();

URL = Shell.CreateShortcut (DesktopPath + "\Batu форум.url") ;

URL.TargetPath = "";

URL.Save();

Работа с системным реестром Windows Понятие реестра

Реестр — это база данных операционной системы, содержащая данные о текущей конфигурации программных и аппаратных средств вычислительной системы. Физически вся информация реестра разбита на два файла: SYSTEM.DAT и USER.DAT, находящиеся в каталоге Windows.

Чему действительно необходимо уделить внимание, так это структуре реестра. Он содержит шесть корневых разделов (ветвей), на которых ниже остановимся подробнее. Каждый из них включает подразделы, отображаемые в левой части окна в виде значка папки. Конечным элементом дерева реестра являются ключи или параметры, делящиеся на три типа:

О строковые (например, "C:\Windows");

О двоичные (например, 10 82 АО 8F), причем максимальная длина такого ключа 16 Кбайт;

П типа DWORD, которые занимают по 4 байта и отображаются в шестнадцатеричном и в десятичном виде (например, 0x00000020 (32), причем в скобках указано десятичное значение ключа).

Рассмотрим корневые разделы раздела, точнее, какая информация в них содержится.

П HKEYSLASSES'_ROO/ В этом разделе содержится информация о зарегистрированных в Windows типах файлов, что позволяет открывать их по двойному щелчку мыши, а также информация об OLE-серверах (подробнее о технологии OLE см. в главе 4).

П HKEY_CURRENT_USIr:> Здесь содержатся настройки оболочки пользователя (например, "Рабочего стола", меню Пуск и т. п.), вошедшего в среду Windows. Они дублируют содержимое подраздела HKEY_USER\name, где name — имя пользователя, вошедшего в среду Windows. Если на компьютере работает один пользователь и используется обычный вход в среду операционной системы, то значения раздела берутся из подраздела HKEY_USERS\.DEFAULT.

О HKEYJ.OCAL JMCHIN. Этот раздел содержит информацию, относящуюся к компьютеру: драйверы, установленное программное обеспечение и его настройки.

П IIKEYUSERS Содержит настройки оболочки Windows для всех пользователей. Как было сказано выше, именно из этого раздела информация копируется в раздел HKEY CURRENT USER. Все изменения в HKCU (сокращенное название раздела HKEY_CURRENT_USER) автоматически переносятся в нки.

П HKEY_ сиRRENT_CONFl' В этом разделе содержится информация о конфигурации устройств Plug-and-Play и сведения о конфигурации компьютера с переменным составом аппаратных средств.

П HKEYDYN DAT/ Здесь хранятся динамические данные о состоянии различных устройств, установленных на компьютере. Именно сведения этой ветви отображаются в окне Система | Устройства | Свойства, вызываемого из Панели управления. Данные этого раздела изменяются самой операционной системой, так что редактировать что-либо вручную не желательно.

Запись, чтение и удаление ветвей реестра

С помощью Windows Script Host возможно в "невидимом" режиме добавлять какую-либо информацию в реестр. Также возможно считывать информацию, создавать и удалять разделы и параметры. Пользователь может даже не подозревать, что на его компьютере выполняются какие-то работы. Очевидно, что многим администраторам такая возможность придется по душе.

Для работы с реестром в WSI1 предусмотрены методы Regwrite, RegRead и RegDelete объекта Wshshell.

Метод Regwrite предназначен для создания ветвей реестра и записи в них параметров. Метод содержит три аргумента.

П Name — полное имя ветви или параметра. Если в конце имени стоит обратный слэш (\), то аргумент является ветвью, иначе — параметром;

П Value — значение параметра или значение по умолчанию в случае создания ветви;

? туре — тип значения (REG_SZ — строковый параметр, REG_EXPAND_SZ — расширяемый строковый параметр, reg_dword — числовой параметр, REG_BINARY - двоичный параметр).

Метод RegRead предназначен для чтения значения параметра и имеет один параметр — полное имя ветви или параметра реестра. В случае указания имени ветви (с обратным слэшем на конце) метод возвращает значения параметра по умолчанию.

Метод RegDelete предназначен для удаления ветви или параметра реестра и имеет один параметр — полное имя ветви или параметра.

Рассмотрим пример работы с системным реестром (листинг 3.19).

Г ' ----------------т ’— ---------------------------------—;—- --— .- —-------— ---- j

: Листинг3.19. Работа с системным реестром Windows

Shell = Новый СОМОбъект("WScript.Shell");

Key = "HKEY_CURRENT_USER\";

//Создание ветки HCU\TestKey\

Shell.RegWrite(Key + "TestKeyV, "testkeydefault");

// Создание строкового параметра stringl

Shell.RegWrite(Key + "TestKey\stringl", "testkeystring");

// Создание параметра типа DWORD

Shell.RegWrite (Key + "TestKey\int", 123, "REG_DWORD");

// Чтение созданных параметров

Сообщить(Shell.RegRead(Key + "TestKeyV)); Сообщить(Shell.RegRead(Key + "TestKeyVstringl")); Сообщить(Shell.RegRead(Key + "TestKey\int"));

// Удаление ветки HCU\TestKey\

Shell.RegDelete (Key + "TestKeyV) ;

Работа с сетевыми ресурсами

Для работы с сетевыми ресурсами в WSH предназначен объект wshNetwork. Данный объект позволяет решать такие задачи, как подключения к сети, инсталляцию принтеров, назначение буквенных обозначений сетевым дискам, получение информации об имени пользователя или компьютера и так далее.

Рассмотрим основные свойства объекта Ws hNetwork:

? ComputerName — возвращает имя компьютера;

П UserDomain — возвращает имя домена, в котором зарегистрирован пользователь;

? UserName — возвращает имя пользователя.

Рассмотрим основные методы объекта W shNetwork:

П MapNetworkDrive — присваивает назначенную пользователем букву сетевому диску;

П EnurnNetworkDrives — возвращает список подключенных сетевых дисков;

П RemoveNetworkDrive — отключает Сетевой ДИСК;

П AddWindowoPrinterConnection — позволяет установить новый принтер в Windows, т. е. указать путь к принтеру и инициировать установку драйверов;

П AddPrinterConnect ion — подключает сетевой принтер;

П RemovePrinterConnection — отключает сетевой принтер; ПЗебОеСаи^Ргіг^ег — задает принтер по умолчанию;

П EnumPrinterConnections — возвращает список подключенных принтеров.

Получение информации о сетевой идентификации

Для начала разберемся, как работают методы ComputerName, UserDomain

И UserName объекта WshNetwork.

Рассмотрим небольшой пример, в котором выводятся сведения об имени пользователя, имени компьютера и домене (листинг 3.20).

і Листинг 3^20. Вывод информации об имени пользователя, имени компьютера і и домене

____ - _—i-hi. .ЦгаХКыгаілІ — ¦ — — ИИ—?----------------------—-— — —

Network = Новый СОМОбъект("WScript.Network");

Сообщить("Имя пользователя: + Network,UserName;;

Сообщить ("Имя компьютера: " + Network.ComputerName);

Сообщить ("Имя домена: " + Network.UserDomain) ;

В данном примере использовались свойства объекта wshNetwork: userName, ComputerName И userDomain. С ИХ ПОМОЩЬЮ была Получена информация

0 подключившемся пользователе. Эта информация может понадобиться, например, если на компьютере работает несколько пользователей и им нужен доступ к разным сетевым дискам. Таким образом, можно обеспечить автоматическое подключение этих дисков в зависимости от того, какой пользователь сейчас работает.

Работа с сетевыми дисками

Перед тем как подключать какой-либо сетевой диск, необходимо сначала определить — подключен ли уже нужный диск или нет. Рассмотрим пример вывода информации о том, какие сетевые диски в данный момент времени уже подключены (листинг 3.21).

..... ¦ ..............¦ ''щнншкг——~~ТГТЩ|ННН1^В

Листинг 3.21. Вывод сііиска подключенных сетевых дисков

_______НЯНя__¦¦¦¦____ЯНННН________I___‘..і..._____1____ннпнннннв

Network = Новый СОМОбъект("WScript.Network");

// Получаем коллекцию сетевых дисков Drives = Network.EnumNetworkDrives();

Для каждого Диск Из Drives Цикл

Сообщить(Диск);

КонецЦикла;

Для подключения и отключения сетевых дисков существуют методы MapNetworkDrive И RemoveNetworkDrive соответственно. Рассмотрим пример подключения сетевого диска (листинг 3.22).

1 Листинг 3.22. Подключение сетевого диска

--------------і. ______, „_______________________________

Net = Новый СОМОбъект("WScript.Network");

Попытка

Net.MapNetworkDrive("M, "\\Server\DATA\CRM");

Исключение

Сообщить("Невозможно произвести подключение!");

КонецПопыт ки;

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

вателя. Четвертый и пятый параметры определяют имя пользователя и его пароль, с которыми может подключаться диск. Лучше организовать доступ к диску нужным пользователям на сервере средствами самой ОС. Тогда посторонние люди не смогут узнать пароль для работы с этим ресурсом.

При отключении сетевого диска используется метод RemoveNetworkDrive, который имеет три параметра. Обязателен только первый параметр — буква отключаемого диска. Второй параметр — отключает диск (если истина) даже если он в этот момент используется. Третий параметр сохраняет настройки для следующих входов пользователя.

Работа с сетевыми принтерами

В WshNetwork реализовано несколько методов сетевого доступа к принтерам. Чтобы явно установить связь принтера с портом, следует использовать метод AddPrinterConnection. Для соединения с принтерами в среде Windows (и автоматической установки драйверов на машинах с операционными системами Windows 2000/XP/NT и Server 2003) нужно применить метод AddWindowsPr interconnect ion, который представлен в листингах 3.23 и 3.24. Метод SetDefauitPrinter назначает компьютеру принтер, связь с которым устанавливается по умолчанию.

і Листинг 3.23. Подключение сетевого принтера в Windows NTOOOO/XP/Server 2003

Network = Новый СОМОбъект("WScript.Network");

Попытка

Network.AddWindowsPrinterConnection("\\ServerName\PrinterName"); Network.SetDefauitPrinter("\\ServerName\PrinterName");

Исключение

Сообщить("Невозможно произвести подключение!");

КонецПопытки;

Листинг 3.24. Подключение сетевого принтера в Windows 9х/МЕ

Network = Новый СОМОбъект("WScript.Network");

Попытка

Network.AddWindowsPrinterConnection("\\ServerName\

PrinterName", ” Lexmark Optra S 1650“');

Network.SetDefauitPrinter("\\ServerName\PrinterName");

Исключение

Сообщить("Невозможно произвести подключение!");

КонецПопытки;

Данные примеры подключают сетевой принтер с именем PrinterName, находящийся на сервере ServerName и устанавливают его в качестве принтера, используемого по умолчанию.

Для отключения сетевого принтера используется метод RemovePrinterConnection, который имеет три параметра:

? первый параметр — буква отключаемого диска;

П второй параметр — (если истина) отключает принтер, даже если он в этот момент времени используется;

П третий параметр — признак сохранения настройки для следующих входов пользователя.

Обязательным является только первый параметр.

Как и в случае с сетевыми дисками, объект wshNetwork позволяет определить список подключенных сетевых принтеров. Для этого используется метод EnumPrinterConnections, который возвращает коллекцию принтеров. Данную коллекцию, как и любую другую, в системе "ІС:Предпрпятие" 8.0 можно перебрать С ПОМОЩЬЮ КОНСТРУКЦИИ Для...каждого из...Цикл...КонецЦикла. В версии 7.7 системы "1C:Предприятие" — с помощью объекта coMServices.

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

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

? SendKeys (string) — имитируется нажатие клавиши или последовательности клавиш на клавиатуре, указанных в единственном параметре.

О AppActivate (Title) — активизирует приложение по заголовку окна или по идентификатору процесса.

П Run (Command, window-style, WaitOnReturn) — запускает Приложение ПО командной строке. Параметры функции имеют следующее назначение:

• первый параметр (command) — определяет запускаемое приложение;

• второй параметр (WindowStyle) — определяет стиль окна и может принимать значения:

О о — запускать программу в скрытом окне;

_Примечание_^

Если вы попытаетесь запустить приложение с таким значением второй переменной, то окно программы будет невидимым и кнопка на панели задач не будет создана. Удостовериться, что приложение действительно запустилось, можно в диспетчере задач, который вызывается по комбинации клавиш ++.

О 1 — запустить программу в оригинальном размере и положении окна;

О 2 — запустить программу минимизированной;

О з — запустить программу максимизированной (на полный экран);

О 4 — запустить программу с последним использованным размером и положением окна на экране;

О 5 — запустить программу с текущими размером и позицией окна на экране;

О б — запустить программу минимизированной (при этом активным будет следующее окно в последовательности окон активных приложений Windows);

• третий параметр (значения — истина или ложь) указывает на необходимость дождаться завершения выполнения приложения.

В качестве параметра метода sendKeуз можно указывать как алфавитноцифровые символы, так и символы специальных клавиш, например, , , ..., , , и т. п. В табл. 3.1 приведены специальные обозначения для этих клавиш.

Таблица 3.1. Обозначения специальных клавиш

Клавиша Обозначение

{BACKSPACE}, {BS}, или {BKSP} {BREAK}

{CAPSLOCK}

{DELETE} или {DEL}

{DOWN}

{END}

{ENTER} или ~

{ESC}

{HELP}

{HOME}

{INSERT} или {INS}

{LEFT}

{NUMLOCK}

{PGDN}

{PGUP}







или























Таблица 3.1 (окончание)

Клавиша

Обозначение

{PRTSC}

{RIGHT}

{SCROLLLOCK}

{TAB}

{UP}

{F1}

{F2}

{F3}

{F4}

{F5}

{F6}

{F7}

{F8}

{F9}

{F10}

{F11}

{F12}



















,







Для указания клавиш , , существуют специальные коды: ?

Я

Например, если вы хотите передать нажатие нескольких клавиш с нажатой клавишей , надо выполнять команду WshShell. SendKeys ("+ (ABC) ") , если только одной клавиши (первую, указанную в последовательности клавиш) — команду WshShell.SendKeys("+АВС") .

Примечание

Необходимо заметить, что такие символы, как "Л" и зарезервированы под обозначение специальных клавиш, так что просто так передать эти (и некоторые другие) символы не удастся. Для этого надо заключить их в фигурные скобки, например, "{+}", "{%}" и т. д. Вот полный список символов, которые необходимо заключать в фигурные скобки: +, Л, %, ~, (,), {,}, [, ].

Если вы хотите передать несколько нажатий подряд одной клавиши, то вовсе не обязательно все их набирать в скрипте. Можно просто указать количество повторений. Так, строка wshShell. sendKeys (" {А 100}'') эквивалентна сотне нажатий клавиши "А". Правда, есть ограничение на количество возможных повторений нажатия клавиш. Это значение лежит где-то между 8150 и 8180 раз. При превышении этого значения будет выдана ошибка.

Управление калькулятором

В листинге 3.25 приведен код, демонстрирующий, как запустить калькулятор и рассчитать значение произведения чисел 2 и 3.

ЛистингЗ.25. Управление калькулятором

WshShell = Новый СОМОбъект("WScript.Shell");

// Запускаем калькулятор

WshShell.Run("calc");

// Ждем пока калькулятор загрузится (для русской версии ОС)

Пока Не WshShell.AppActivate("Калькулятор") Цикл КонецЦикла;

// Эмулируем нажатие клавиш

WshShell.SendKeys("1{+}");

WshShell.SendKeys("2");

WshShell.SendKeys;

WshShell.SendKeys("*3");

WshShell.SendKeys;

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

Управление Microsoft Word

Рассмотрим еще один интересный пример, в котором запускается Microsoft Word и в нем печатается некоторый текст (листинг 3.26).

................................ ......................................................................................................................

Листинг 3.26. Управление Microsoft Word

WshShell = Новый СОМОбъект ("WScript.Shell") ;

Если WshShell.AppActivate("Word") Тогда

WshShell.SendKeys("Welcome to ");

WshShell.SendKeys() ; // Enter

WshShell.SendKeys("%") ; // Alt

// Спускаемся на 4 пункта вниз

WshShell.SendKeys("{DOWN}{DOWN}{DOWN}{DOWN}");

WshShell.SendKeys(); // Enter

WshShell.SendKeys("c:\test.doc") ;

WshShell.SendKeys("-") ; // Enter

Иначе

Сообщить ( "Microsoft Word не запушен'"';;

КонецЕсли;

Реализация примера подразумевает, что у вас уже запущен MS Word с пустой страницей. В результате выполнения в документе напечатается текст и будет сохранен под именем c:\test.doc, но только в том случае, если пункт меню Сохранить находится четвертым сверху.

Запуск встроенного калькулятора

В системе " 1C: Предприятие" (в версиях 7.7 и 8.0) существует встроенный калькулятор, который вызывается при нажатии комбинации клавиш + или через пункт меню Сервис | Калькулятор. С помощью метода SendKeys объекта WshShell можно программно вызвать встроенный калькулятор (листинг 3.27).

Листинг 3.27. Запуск встроенного калькулятора

WshShell = Новый СОМОбъект("WScript.Shell") ,

WshShell. SendKeys (,,A{F2}") ; // Ctrl+F2

Закрытие окна сообщений в системе "1 С:Предприятие"

В системе '"IС:Предприятие" (в версиях 7.7 и 8.0) при вызове оператора сообщить появляется окно сообщений. Часто бывает ситуация, когда необ-

ходимо программно закрыть это окно. Оно закрывается при нажатии комбинации клавиш < Ctrl>+< Shift>+. Приведем пример закрытия окна сообщений (листинг 3.28).

........¦¦¦КХШШ

Листинг 3.28. Закрытие окна сообщений

ШШШЯШИШШЯЯШШВПЯвйЯИЯШШШШШШШЯШІ__ЯДШИшИЯИШвШиЮІІшІДИИІ____I

// с помощью вывода текста показываем окно сообщений Для Ном = 1 По 100 Цикл

Сообщить("Текст " + Ном);

КонецЦйкла;

WshShell = Новый СОМОбъект("WScript.Shell");

// Закрываем окне сообщений

WshShell. SendKeys (,,л+ (z) ") ; // ++

WshShell.SendKeys("л+(я)"); // для русской раскладки





Глава 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, принимающее значение истина или ложь, указывает, демонстрируются ли слайды непрерывно до нажатия пользователем клавиши . Это свойство целесообразно применять, если свойство 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();

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

Свойство 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) появляется вопрос с просьбой подтвердить ее выполнение, при утвердительном ответе она выполняется.



Глава 5 Использование ADO

Понятие ADO

ADO (Microsoft ActiveX Data Objects) — это набор библиотек, содержащих COM-объекты. Основное их назначение — реализация прикладного программного интерфейса для доступа к базам данных и использование в клиентских приложениях. ADO использует библиотеки OLE DB, предоставляющие низкоуровневый интерфейс для доступа к данным. OLE DB, со своей стороны, обеспечивают доступ к данным с помощью СОМ-интерфейсов.

OLE DB и ADO являются частью универсального механизма доступа к данным Microsoft (Microsoft Universal Data Access), который обеспечивает высокопроизводительный доступ к различным источникам информации (включая реляционные и нереляционные базы данных), в том числе к данным, хранящимся на мэйнфреймах, данным электронной почты и файловой системы, текстовым, графическим и др. Для многих современных приложений, которые используют различную информацию, характерно подобное разнообразие ее источников. Более того, вполне очевидно, что могут появляться новые форматы данных и способы их хранения. Поэтому разумным требованием к универсальному механизму доступа к ним могла бы стать возможность поддержки не только существующих в настоящее время их форматов и источников, но и форматов данных, которые будут созданы в будущем.

Назначение универсального механизма доступа к данным фирмы Microsoft — предоставить доступ к перечисленным их источникам с помощью единой модели доступа.

Рассмотрим основные компоненты архитектуры универсального механизма доступа к данным Microsoft и обсудим их более детально.

О Microsoft ActiveX Data Objects (ADO) — представляет собой программный интерфейс для доступа к данным из приложений. С точки зрения программирования, ADO и его расширения являются упрощенным высокоуровневым объектно-ориентированным интерфейсом к OLE DB.

П OLE DB — это низкоуровневый интерфейс для доступа к данным. ADO применяет OLE DB, но можно использовать OLE DB и напрямую, минуя ADO.

? Open Database Connectivity (ODBC) — стандартный способ доступа к реляционным базам данных. Этот компонент универсального механизма доступа оставлен с целью обеспечения совместимости с прежними версиями программного обеспечения. В современных приложениях применению ODBC-драйверов предпочитают использование OLE DB-провайдеров.

Для доступа к источнику данных с помощью OLE DB требуется, чтобы на компьютере, где используется клиентское приложение, был установлен OLE DB-провайдер для данной СУБД. OLE DB-провайдер представляет собой динамическую библиотеку DLL, загружаемую в адресное пространство клиентского приложения и используемую для доступа к источнику данных. Для каждого типа СУБД нужен собственный OLE DB-провайдер, так как провайдеры базируются на функциях клиентских API (Application Programming Interface, программный интерфейс приложения), разных для различных СУБД.

ADO представляет собой высокоуровневый программный интерфейс для доступа к OLE DB-интерфейсам. Он позволяет манипулировать данными с помощью любых OLE DB-провайдеров, входящих как в состав Microsoft Data Access Components, так и в состав программных продуктов, разработанных сторонними производителями. ADO содержит набор объектов, используемых для соединения с источником информации с целью чтения, добавления, удаления или модификации предоставляемых им данных.

П Объект connection применяется для установки связи с источником данных. Он представляет единственную сессию. Этот объект позволяет изменить параметры соединения с базой данных, а также начать или завершить транзакцию. Используя объект connection, можно выполнять команды (например, SQL-запросы) с помощью метода Execute. Если команда возвращает набор данных, то автоматически создается объект Recordset, который возвращается в результате выполнения этого метода.

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

П Объект command представляет собой команду, которую можно выполнить в источнике данных. Команда может содержать SQL-предложение или вызов хранимой процедуры. В последнем случае для определения параметров процедуры может быть использована коллекция Parameters объекта Command.

П Объект Recordset — это набор записей, полученных из источника данных, и может быть использован для добавления, удаления, изменения, просмотра записей. Данный объект может быть открыт непосредственно ИЛИ создан С ПОМОЩЬЮ объектов Connection ИЛИ Command.

? Объект Field — это колонка в наборе данных, представленных объектом Recordset. Объект может быть использован для получения значений конкретного поля таблицы, его модификации, извлечения метаданных, таких как имя колонки и тип данных.

О Объект Record — представляет одну запись внутри объекта Recordset и может быть использован для работы с гетерогенными и иерархическими данными (добавлен в библиотеку ADO 2.5, являющуюся составной частью операционной системы Windows 2000).

? Объект stream представляет двоичные данные, связанные с объектом Record. Например, если объект Record представляет собой файл, то его объект stream должен содержать данные внутри этого файла (добавлен в ADO 2.5).

Соединение с источником данных

Для установки связи с источником данных используется объект Connection. Рассмотрим два варианта создания соединения — явного (листинг 5.1) и неявного (листинг 5.2).

Шинг 5.1. Создание явного соединения

// Создание объекта установки связи с источником данных Connection = Новый СОМОбъект("ADODB.Connection");

// Подключение к источнику данных Попытка

Connection.Open(СтрокаПодключения);

Исключение

Сообщить(ОписаниеОшибки()) ;

Возврат;

КонецПопытки;

// Создание объекта выполнения команды Command = Новый СОМОбъект("ADODB.Command");

// Указание активного соединения

Command.ActiveConnection = Connection,-

// Определение текста команды

Command.CommandText = "SELECT * FROM titles";

// Определение типа команды

Command.CommandType = 1;

// Создание объекта набора записей

RecordSet - Новый СОМОбъект("ADODB.RecordSet"};

// Выполнение и получение набора данных

RecordSet = Command.Execute();

// Перебор данных

Пока RecordSet.EOF() = 0 Цикл

Сообщить(RecordSet.Fields(0).Value);

RecordSet.MoveNext();

КонецЦикла; ¦

// После того как набор записей уже не нужен, его следует закрыть

RecordSet.Close();

Connection.Close();

і Листинг 5.2. Создание неявного соединения

// Создание объекта выполнения команды

Command = Новый СОМОбъект{"ADODB.Command");

// Указание активного соединения без использования объекта Connection

Command.ActiveConnection = СтрокаПодключения;

// Определение текста команды

Command. CommandText = "SELECT * FROM titles";

// Определение типа команд Command.CommandType = 1;

// Создание объекта набора записей

RecordSet = Новый СОМОбъект("ADODB.RecordSet");

/ / Выполнение и получение набора данных

RecordSet.Open(Command);

/ / Перебор данных

Пока RecordSet.EOF() = 0 Цикл

Сообщить(RecordSet.Fields(0).Value);

RecordSet.MoveNext();

КонецЦикла;

II После того как набор записей уже не нужен, его следует закрыть

RecordSet.Close () ;

Connection.Close();

Из приведенных примеров видно, что основное отличие явн о го соединения от неявного заключается в том, что в последнем случае не используется объект Connection. Для получения более структурированного и понятного кода рекомендуется использовать явное соединение.

В обоих примерах для описания источника данных использовалась строковая переменная Строкаподключения. Значение данной переменной можно формировать вручную, либо с помощью программы связи с данными. Программа связи с данными используется для создания и управления подключениями между локальным компьютером и хранилищами данных OLE DB. Запустить программу связи с данными можно двумя способами — вручную и программно.

Рис. Диалог программы связи сданными
Для ручного запуска достаточно создать пустой текстовый файл с расширением UDL и в любом файловом менеджере запустить его. Этом случае откроется диалог (рис. 5.1), в котором настраиваются параметры соединения, а после нажатия кнопки ОК сформировавшаяся строка соединения запишется в созданный UDL-файл.

Пример программного запуска утилиты настройки связи с данными приведен в листинге 5.3.

j Листинг 5.3. Запуск программы Ьвязи с данными |

// Программа для формирования и редактирования строки соединения

DataLinks = Новый СОМОбъект("DataLinks");

// Объекту Connection устанавливаем введенное значение строки соединения

Connection.Connectionstring = СтрокаПодключения,-// Открываем диалог программы связи с данными DataLinks.PromptEdit(Connection);

// Возвращаем новое значение строки соединения СтрокаПодключения = Connection.Connectionstring;

Сообщить(СтрокаПодключения);

Важно отметить, что при программном запуске утилиты связи с данными все манипуляции со строкой соединения происходят через объект Connection. Данная особенность еще раз говорит в пользу того, что лучше использовать явное соединение с источником данных (см. листинг 5.1).

Например, для доступа к базе данных Microsoft SQL Server строка соединения будет выглядеть следующим образом:

''Provider=SQLOLEDB.l; Password=erpg; Persist Security Info=True; User ID=mav; Initial Catalog=Northwind; Data Source=MAVCOMP"

Если же строка соединения записана во внешнем UDL-файле, то строка соединения будет выглядеть иначе:

"File Name=C:\DataLinks\MyDataLink.udl"

Рассмотрим основные свойства строки соединения.

П Provider — названия поставщика OLE DB.

? User ID — имя пользователя.

О Password — пароль пользователя.

О Persist Security Info — признак сохранения пароля в строке соединения (True/False).

? Initial Catalog — используемая база данных.

? Data Source — название источника данных (например, имя сервера, имя файла и т. п.);

П File Name — полное имя UDL-файла.

Все остальные свойства зависят от конкретного OLE DB-провайдера.

Продолжая рассматривать пример, приведенный в листинге 5,1, стоит остановиться на объекте connection. Это самый важный объект ADO, отвечающий за связь между приложением и базой данных. У него очень много методов и свойств, и одно из них, connectionstring, описанное ранее. Оно определяет собственно строку инициализации ODBC-соединения.

Рассмотрим основные свойства объекта Connection.

О connectionTimeout — задает время в секундах, в течение которого ожидается установление ODBC-соединения. По умолчанию равно 15. Конкретное значение имеет смысл устанавливать в том случае, когда сервер, вследствие своей загруженности или высокого трафика, не успевает обрабатывать запросы. Если установить значение равное 0, то сервер будет ждать установления соединения бесконечно долго.

П commandTimeout — задает время в секундах, в течение которого ожидается исполнение запросов. По умолчанию равно 30.

О Connectionstring — строка инициализации ODBC-соединения.

П DefaultDatabase — база данных по умолчанию для данного соединения.

П state — определяет состояние соединения (о — закрыто, 1 — открыто). Рассмотрим основные методы объекта Connection.

П open — метод открывает доступ к базе данных и имеет три необязательных параметра:

• Connectionstring — строка соединения с источником данных, причем если параметр connectionstring не задан, то используется свойство connection.Connectionstring;

• UserlD — имя пользователя;

• Password — пароль (обычноUserlD и Password задаются непосредственно в Connectionstring, поэтому их можно не задавать).

П close — разрывает связь с базой данных, при этом закрываются также все объекты типа Recordset, связанные с данным объектом, однако память, отведенная под объект connection, не освобождается, т. е. в дальнейшем можно снова выполнить команду open для повторного доступа к базе данных.

? Execute — метод исполняет SQL-запрос или хранимую процедуру и возвращает объект типа Recordset, причем возможно задание трех параметров:

• cominantText — строка, содержащая SQL-запрос, имя таблицы, хранимой процедуры или прочий исполняемый текст;

• RecordsAffected — переменная, в которую возвращается количество записей в результате исполнения запроса;

• options — определяет тип параметраCommandText (полезен для оптимизации исполнения запроса) и может иметь значения:

О 1 — SQL-запрос или другое текстовое выражение;

О 2 — таблица;

О 4 — хранимая процедура;

О 8 — тип параметра неизвестен.

Примечание

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

Выполнение SQL-запросов и хранимых процедур

Ранее было сказано, что выполнить SQL-запрос или хранимую процедуру можно с помощью метода Execute объекта Connection, но наиболее правильно для этих целей использовать специализированный объект — command. Это связано с тем, что объект command специально предназначен для обработки параметров SQL-операторов, а также хранимых процедур и при возврате объекта Recordset минимизирует количество информации, которой обмениваются поставщик данных и приложение.

Объект Command описывает команду (запрос или оператор), которая обрабатывается источником данных. Благодаря этому объекту обеспечивается простота и эффективность работы с запросами или хранимыми процедурами. С помощью объекта command можно определить SQL-строку, хранимую процедуру или имя таблицы.

Как и многие другие объекты модели ADO, объект command может быть создан либо с помощью объекта Connection (листинг 5.1), либо независимо от него (листинг 5.2).

После того как объект command будет создан и подключен к поставщику данных, его можно использовать для выполнения процедур и SQL-операторов, которые будут либо воздействовать на данные в источнике данных, либо возвращать объект Recordset.

193

Рассмотрим пример добавления новой записи в таблицу базы данных (листинг 5.4).

Листинг 5.4. Добавление новой записи в таблицу базы данных

НИНМННИИННННННННННИННННИННІЯНННЯЯНННННННІННЯННЯНННННННННІ

ТекстЗапроса'= "

I INSERT

I INTO Users(Parantld. IsFolder, FlCf Login, Password, Description)

I VALUES (" + 2 + "," + 1 + ", '" + Пользователь.Наименование + "','" + Пользователь.Логин + "','pass','Произвольное описание')";

Command = СоздатьОбъект("ADODB.Command");

Command.ActiveConnection = Connection;

Command.CommandText = ТекстЗапроса;

Command.CommandType = 1;

// Выполнение запроса

RecordSet = Command.Execute();

Примечание

Отдельно на тексте запроса останавливаться не будем, так как подразумевается, что читатель знаком с языком SQL

Рассмотрим основные свойства объекта Command.

? ActiveConnection — данное свойство определяет соединение, с которым работает объект Command, и содержит строку, описывающую соединение либо указывающую на открытый в данный момент объект connection. В первом случае создается новое соединение, предназначенное специально для объекта Command и объекта Recordset, который также создается.

? CommandText — это свойство определяет SQL-оператор, имя хранимой процедуры либо имя таблицы, с которой будет работать объект command. Как правило, оно содержит вы зовы хранимых процедур или SQL-операторов, кроме этого может включать и специфические команды, поддерживаемые поставщиком данных.

? Command Timeout — данное свойство предназначено для определения интервала времени ожидания объектом Command результатов обращения к поставщику данных. По истечении этого периода объект command отменяет попытку установить соединение и генерирует сообщение об ошибке. Стандартное значение данного свойства равно 30 секундам. Однако оно может быть и больше, если предполагается, что процесс загрузки данных поставщиком занимает много времени.

О commandType — данное свойство используется для оптимизации процесса обработки объекта command поставщиком данных. При указании конкретного типа команды, определенной свойством CommandText объекта command, поставщик данных освобождается от распознавания типа выполняемой команды. Аналогично аргументу Option метода Execute объекта connection, данное свойство может принимать следующие значения:

• 1 — SQL-запрос или прочее текстовое выражение;

• 2 — таблица;

• 4 — хранимая процедура;

• 8 — тип параметра неизвестен.

О state — свойство возвращает множество значений сумм одной или нескольких констант objectstateEnum. Эти константы описывают — является ли объект Command открыт, закрыт, в соединении и т. п. Возможные значения:

• о — объект закрыт;

• 1 — объект открыт;

• 2 — соединяется;

• 4 — выполняется;

• 8 — выбран.

Рассмотрим основные методы объекта command.

? Execute — метод исполняет SQL-запрос или хранимую процедуру. Возвращает объект типа Recordset.

? CreateParameter — данный метод используется для создания новых объектов Parameter, которые добавляются в семейство Parameters объекта command до того, как будет выполнен запрос. Объект Parameter описывает параметр, передаваемый в SQL-оператор или хранимую процедуру, которая указана В СВОЙСТВе CommandText объекта Command.

Рассмотрим более подробно использование параметров, передаваемых в хранимые процедуры. Для передачи параметров процедуре необходимо выполнить следующие действия.

1. Вызвать метод CreateParameter И создать новый объект Parameter.

2. Добавить Объект В семейство Parameters объекта Command.

3. Воспользовавшись методом Execute объекта command, получить объект Recordset.

Рассмотрим пример выполнения перечисленных действий (листинг 5.5).

і Листинг 5.5. Передача параметров хранимой процедуре

// Создание нового объекта Command Command = Новый СОМОбъект("ADODB.Command");

// Организация связи с поставщиком данных для объекта Command Command.ActiveConnection = Connection;

// Задание хранимой процедуры

Command.CommandText = "SP_GET_AUTHOR_INFO";

// Применение метода CreateParameter объекта Command для // создания нового объекта Parameter, который будет / / использован при выполнении хранимой процедуры.

Parameter = Command,CreateParameteri”@USERNAME", 200, 1, 12, "MAV");

// Добавление в семейство Parameters объекта Command нового параметра Command.Parameters.Append(Parameter);

// Получение объекта Recordset Recordset = Command.Execute();

Метод CreateParameter применяется следующим образом:

CreateParameter(Name, Type, Direction, Size, Value).

Рассмотрим параметры этого метода.

П Name — строковое значение, определяющее имя создаваемого параметра.

? Туре — тип параметра, передаваемого в объект command. Хотя тип значения параметра, передаваемого методу CreateParameter, является вариантным, включение этого необязательного аргумента часто влияет на операцию, выполняемую поставщиком данных. Все возможные значения перечислены в табл. 5.1.

О Direction — если вам не приходилось использовать хранимые процедуры, то вам не известен тот факт, что они могут как принимать параметры, так и возвращать их. Например, если применяется хранимая процедура для вычисления значений, получаемых при обмене валюты, она будет возвращать результат вычислений в выходном параметре. Данный аргумент определяет способ использования параметров хранимой процедуры: для ввода данных, для вывода значений, или же и для того и для другого. Все возможные значения перечислены в табл. 5.2.

П size — если объекту Parameter передаются данные переменной длины, то прежде чем добавить этот объект в семейство Parameters, нужно задать значение его свойства size, иначе произойдет ошибка.

? value — этим аргументом устанавливается значение параметра, передаваемого объекту Connection (ADO позволяет задавать для данного аргу-

мента длинные двоичные значения). Например, если требуется получить значение, возвращаемое хранимой процедурой — необходимо добавить параметр С именем Return: ReturnParameter =

Command. CreateParameter ( "Return", 3, 4 ) • Соответственно результат, возвращенный хранимой процедурой, будет находиться в свойстве BeturnParameter.Value.

Таблица 5.1. Типы параметров, используемые в объектах ADO

Константа ADO

adBiglnt

adBinary

adBoolean

adBSTR

adChar

adCurrency

adDate

adDBDate

adDBTime

adDBTimeStamp

adDecimal

adDouble

adEmpty

adError

adGUID

adIDispatch

adlnteger

adlUnknown

adLongVarBinary

adLongVarChar

Значение Описание

Таблица 5.1 (окончание)

Константа ADO Значение





















adVarBinary









Описание

Длинное строковое значение (только для объекта Parameter)

Десятичное число фиксированной точности

Значение одинарной точности с плавающей точкой

2-байтовое целое со знаком

1 -байтовое целое со знаком

8-байтовое целое без знака

4-байтовое целое без знака

2-байтовое целое без знака

1 -байтовое целое без знака

Переменная, определяемая пользователем

Двоичное значение (только для объекта Parameter)

Строковое значение (только для объекта Parameter)

Вариантная переменная OLE-автоматизации

Символьная строка Unicode, заканчивающаяся символом Null (только для объекта Parameter)

Символьная строка Unicode, заканчивающаяся символом Null

Таблица 5.2. Допустимые значения аргумента Direction метода Crea teParameter

КонстантаАРО Значение Описание

adParamUnknown 0

adParamlnput 1

adParamOutput

adParamlnputOutput 3

adParamReturnValue 4

Назначение параметра не определено

Входной параметр (по умолчанию) — используется для передачи информации в хранимую процедуру

Выходной параметр — применяется для получения данных из хранимой процедуры посредством SQL-параметра OUTPUT

Входной и выходной параметр — используется как для передачи информации в хранимую процедуру, так и для получения от нее значений

Возвращаемое значение — применяется для перехвата кода завершения хранимой процедуры

Обращение к результатам запроса

Ранее очень часто встречалось использование объекта Recordset. Объект типа Recordset представляет таблицу — результат запроса к базе данных. Экземпляр объекта создается командой:

Новый СОМОбъект("ADODB,RecordSet"> .

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

Для того чтобы определить список полей таблицы, используется коллекция Fields объекта Recordset. Каждый элемент коллекции представляет собой объект типа Field. Чтобы вывести список полей таблицы, можно использовать следующий код (листинг 5.6).

Листинг 5.6. Вывод списка полей, входящих в Recordset

...___________________................ ...... ____________________

// Создание объекта выполнения команды Command = Новый СОМОбъект("ADODB.Command");

// Указание активного соединения Command. ActiveConnection = Connection;

// Определение текста команды

Command.CommandText = "SELECT * FROM titles”;

// Определение типа команды

Command.CommandType = 1;

// Создание объекта набора записей RecordSet = Новый СОМОбъект ("ADODB. RecordSet") ; // Выполнение и получение набора данных RecordSet = Command.Execute ();

// Перебор полей RecordSet

Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл

Сообщить("Имя колонки” + RecordSet.Fields.Item(НомерКолонки).Name); КонецЦикла; .

Использовать данный прием очень удобно в том случае, когда заранее неизвестен состав полей выборки.

Рассмотрим следующий пример, в котором демонстрируется вывод всех значений полей всех записей, причем состав полей, как и в предыдущем примере, заранее неизвестен (листинг 5.7).

.kLiJ'-CLi

: Листинг 5.7. Выборка результата запроса

// Перебор записей выборки

Количествополей = RecordSet.Fields.Count;

Пока RecordSet,EOF О = 0 Цикл // Перебор полей выборки

Для ПомерКолонки = 0 По КоличествоПолей-1 Цикл

ИмяПоля = RecordSet.Fields.І1;ет.(НомерКол0нки) .Name; Значение = RecordSet.Fields(ИмяПоля).Value;

Сообщить("Поле: " + ИмяПоля + = + Значение);

КонецЦикла;

// Переводим курсор на следующую запись

RecordSet.MoveNext();

КонецЦикла;

Для большего понимания данного примера и возможностей объекта

RecordSet рассмотрим свойства данного объекта.

О ActiveConnection — объект типа Connection, к которому привязан данный Recordset.

О source — строка-источник запроса, т. е. SQL-выражение, имя таблицы или хранимой процедуры.

? Filter — фильтр, т. е. та часть SQL-запроса, которая находится в составе

WHERE.

П CursorType — тип курсора. Значениями свойства, которые можно изменять только до открытия объекта, могут быть:

• о — является значением по умолчанию (Forwardonly-курсор) и позволяет перемещаться только вперед по записям таблицы (является наиболее оптимальным в тех случаях, когда нужно провести лишь единственный проход по записям);

• — определяет подобие динамическому курсору (Keyset-курсор) за исключением того, что вы не можете видеть записи таблицы, добавленные другими пользователями базы данных;

• 2 — позволяет любые перемещения по таблице, а также добавление, изменение и удаление записей, которые видны всем пользователям базы данных (Динамический курсор);

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

О state — определяет состояние объекта:

• о — закрыт;

• 1 — открыт/

П BOF — логическая величина (истина или ложь). Определяет факт того, что курсор находится перед первой записью таблицы.

П EOF — логическая величина. Определяет, что курсор находится за последней записью таблицы.

П Edi.tMode — определяет состояние редактирования текущей записи (проведен ли метод update для сохранения текущих изменений). Свойство может принимать следующие значения:

• о — показывает, что редактирование не проводилось;

• 1 — показывает, что данные в текущей записи редактировались, но изменения еще не сохранены;

• 2 — показывает, что текущая запись добавлена с помощью метода AddNew, но до сих пор не сохранена.

П RecordCount — определяет количество записей в таблице (доступно, ТОЛЬКО еСЛИ CursorType = 3).

П AbsoiutePosition — перемещает курсор на новую запись под данным номером. Должен иметь значение в интервале от 1 до RecordCount (доступно, ТОЛЬКО еСЛИ CursorType = 3).

П Bookmark — закладка в виде числа. Никак не связана с номером записи.

_Примечание_^

Можно при сканировании по таблице запомнить значение Bookmark в некоторой временной переменной, а затем вернуться обратно на данную запись (доступно, только если CursorType = 3).

О Pagesize — задает число записей таб; іи цы на странице. По умолчанию равен (доступно, только если CursorType = з).

П Pagecount — определяет количество страниц. Автоматически пересчитывается при изменении Pagesize (доступно, только если CursorType з);

П AbsolutePage — перемещает курсор на начало данной страницы (доступно, только если CursorType = 3).

Помимо перечисленных свойств, объект Recordset имеет ряд методов.

Ш Open — исполняет запрос и открывает таблицу-результат. Общий формат вызова: RecordSet.Open;Scurse.- ActiveConnection, CursorType), причем необязательные параметры Source, ActiveConnection И CursorType здесь обозначают то же, что и соответствующие свойства объекта Recordset. Кроме того, параметр ActiveConnection может быть не только объектом типа Connection, но и просто строкой инициализации — ConnectionString.

О Close — закрывает объект.

О Requery — заново пересчитывает таблицу. Эквивалентен последовательному исполнению методов close и Open.

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

? MoveFirst, MoveLast, MoveNext, MovePrevious — перемещают курсор на первую, последнюю, следующую или предыдущую запись таблицы соответственно.

? Move — перемещает курсор на новое положение. Общий формат вызова: Recordset.Move(NumRecords, Start), причем NumRecords здесь — КОЛИчество записей, на которые нужно переместить курсор. Положительное значение означает перемещение вперед, отрицательное — назад по записям. Параметр start определяет точку отсчета, откуда нужно переместить курсор.

^ Примечание ^

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

? AddNew — добавляет запись. Можно сначала добавить запись, затем определить значение полей. А можно это сделать и одной командой: RecordSet.AddNew(Fields, Values). Здесь Fields — ИМЯ ИЛИ Массив имен полей, которые нужно определить, values — значение или массив значений этих полей (чтобы сохранить добавленную запись, необходимо ВЫПОЛНИТЬ МеТОД Update).

О Delete — удаляет текущую запись или группу записей в зависимости от параметра. Формат записи: Recordset,Delete(AffectRecords>, где параметр Af fectRecords может принимать одно из возможных значений:

• 1 — (значение по умолчанию) удаляет только текущую запись;

• 2 — удаляет записи, удовлетворяющие свойству Filter, которое должно быть задано заранее.

? update — сохраняет изменения в текущей записи. Изменения в записи можно произвести предварительно или непосредственно в команде: Recordset. Update (Fields, Values). Параметр Fields определяет здесь имя или массив имен полей, которые нужно определить, параметр values — значение или массив значений этих полей. Если курсор перемещен с добавленной или измененной записи, сервер автоматически выполнит метод Update.

П Cancel Update — отменяет любые изменения или добавления записей, проведенные до использования метода update.

Работа со структурой базы данных (ADOX)

Для работы со структурой базы данных существует технология ADO Extensions for Data Definition and Security (ADOX). ADOX — представляет собой набор объектов, позволяющих манипулировать метаданными в базах данных и управлять объектами, отвечающими за безопасность.

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

Примечание

Обратите внимание на то, что ADOX работает далеко не со всеми базами данных— его функциональность ограничена Microsoft Access и Microsoft SQL Server, а также несколькими другими СУБД.

ADOX обладает собственной объектной моделью, состоящей из следующих объектов:

П Catalog — представляет всю схему базы данных;

П Table — представляет таблицу в базе данных;

П Column — представляет колонку в таблице;

П index — представляет индекс внутри таблицы;

? Key — представляет первичный или внешний ключ;

П Group — представляет группу пользователей;

П user — представляет индивидуального пользователя базы данных внутри группы;

О Procedure — представляет хранимую процедуру внутри базы данных;

П view — является представлением (view) внутри базы данных.

Иерархия объектов ADOX начинается с объекта catalog. Этот объект содержит коллекции таблиц, представлений, процедур, пользователей и групп

203

и может быть использован для открытия существующей базы данных (с помощью объекта ADO Connection), а также для создания новой. Имея объект catalog, можно работать с таблицами, процедурами и представлениями. Например, просматривая коллекцию Tables, можно узнать, какие таблицы имеются в базе данных, а также получить более детальные сведения о таблицах, изучив коллекции Columns, indexes и Keys объекта Table. Изучая свойства объектов базы данных, можно получить сведения о метаданных и, в частности, сохранить их в отдельном файле или куда-либо перенести. Используя коллекции users и Groups, можно манипулировать правилами доступа к данным, создавая отдельных пользователей или группы пользователей базы данных.

Чтение структуры базы данных

Рассмотрим пример вывода информации о таблицах, представлениях и процедурах базы данных (листинг 5.8).

’Листинг 5.8. Вывод информации о таблицах, представлениях и хранимых процедурах

// Начальная инициализация

Catalog = Новый СОМОбъект("ADOX.Catalog");

Catalog.ActiveConnection = СтрокаПодключения;

// Выводим таблицы

Дл.^р^ерТаблицы = 0 По Catalog.Tables.Count-1 Цикл ИмяТаблицы = Catalog.Tables.Item(НомерТаблииы).Name;

Сообщить("Таблица: " + ИмяТаблицы);

КонецЦикла;

// Проверка текущего источника данных на поддержку коллекции Views Попытка

КоличествоПредставлений = Catalog.Views.Count;

ПредставленияДоступны = Истина;

Исключение

ПредставленияДоступны = Ложь;

КонецПопытки;

Если ПредставленияДоступны Тогда // Выводим представления

Для НомерПредставления = 0 По Catalog.Views.Count-1 Цикл

ИмяПредставления = Catalog.Views.ІДет(НомерПредставления).Name; Сообщить("Представление: " + ИмяПредставления);

КонецЦикла;

КонецЕсли;

// Выводим процедуры

Для НомерПроцедуры = 0 По Catalog.Procedures.Count-1 Цикл ИмяПроцедуры = Catalog.Procedures.Item(НомерПроцедуры).Name;

Сообщить("Процедура: " + ИмяПроцедуры);

КонецЦикла;

В приведенном примере имеются три цикла для просмотра коллекций Tables, views и Procedures объекта Catalog. Отметим, что перед циклом просмотра коллекции views следует выполнить проверку того, доступны ли представления для текущего источника данных с помощью конструкции Попытка...Исключение...КонецПопытки. Это делается, чтобы избежать ошибок и исключительных ситуаций, которые могут возникнуть, если ADOX не поддерживает коллекцию views для текущего источника данных.

Коллекция Tables содержит один или более объектов Table, свойствами которых являются коллекции columns, indexes и Keys, и их также следует просмотреть (листинг 5.9).

Листинг 5,9. Вывод информации о полях, индексах и ключах таблиц

// Начальная инициализация

Catalog = Новый СОМОбъект("ADOX.Catalog");

Catalog.ActiveConnection = СтрокаПодключения;

// Выводим таблицы

Для НомерТаблииы = 0 По Catalog.Tables.Count-1 Цикл Table = Catalog.Tables.Item(НомерТаблицы);

ИмяТаблицы = Table. Name;

Сообщить("Таблица: " + ИмяТаблицы);

// Выводим поля таблицы

Если Table.Columns.Count > 0 Тогда

Для НомерПоля = 0 По Table. Columns. Count-1 Цикл Column = Table.Columns.Item(НомерПоля);

ИмяПоля = Column.Name;

ТипПоля = Column. Type;

ДлинаПоля = Column,DefinedSize;

Сообщить ("Имя поля; " + ИмяПоля) ;

Сообщить ("Тип поля: " + ТипПоля) ;

Сообщить("Длина поля: " + ДлинаПоля);

КонецЦикла;

КонецЕсли;

// Выводим индексы таблицы

Если Table.Indexes.Count > 0 Тогда

Для НомерИндекса = 0 По Table.Indexes.Count-1 Цикл Index = Table.Indexes.Item(НомерИндекса);

ИмяИндекса = Index.Name;

Сообщить ("Имя индекса: " + ИмяИндекса)

КонецЦикла;

КонецЕсли;

//. Выводим ключи таблицы

Если Table.Keys.Count > 0 Тогда

Для НомерКлюча = 0 По Table.Keys.Count-1 Цикл Key = Table.Keys.ІРет(НомерКлюча) ;

ИмяКлюча = Key.Name;

Сообщить("Имя ключа: " + ИмяКлюча);

КонецЦикла;

КонецЕсли;

КонецЦикла;

В данном примере в цикле выборки полей таблицы свойство column.туре возвращает число, соответствующее типу, определенному в табл. 5.1. Ниже будет приведен полный список свойств объекта column.

? Attributes — содержит характеристики поля.

? DefinedSize — содержит максимальный размер поля.

? NumericScale — содержит сведения о положении десятичной точки для числового поля.

О Parentcatalog — указывает на имя каталога, к которому принадлежит поле. П Precision — содержит максимальную точность данных в поле.

? RelatedCoiumn — для ключевых полей содержит имя связанного поля.

П Sortorder — указывает порядок сортировки в данных для поля.

? туре — содержит тип данных, хранящихся в поле.

Объект index содержит следующие свойства.

? clustered — указывает, является ли индекс кластерным.

О indexNuiis — указывает, как обрабатываются значения Null.

D PrirnaryKey — указывает, реализует ли данный индекс первичный ключ.

П unique — указывает, должен ли быть уникальным ключ, реализованный в данном индексе.

И наконец, рассмотрим список свойств объекта Key.

В DeleteRule — указывает, каким образом обрабатывается удаление записи, содержащей первичный ключ.

? RelatedTable — для внешнего ключа указывает имя связанной таблицы.

О туре - содержит тип ключа.

О UpdateRule — указывает, как производится обновление записи, содержащей первичный ключ.

Создание баз данных и их объектов

Первый шаг при создании новой базы данных — создание нового экземпляра объекта Catalog. Это позволяет определить не только тип создаваемой базы данных (с помощью OLE DB-провайдера), но и местоположение файла базы данных. В листинге 5.10 показано, как это можно сделать для базы данных Microsoft Access.

; Листинг 5.10. Создание новой базы данных

207

Следующий пример (листинг 5.11) показывает, как можно реализовать эту последовательность действий.

Листинг 5.11. Создание новых полей в базе данных

// Создать новый экземпляр объекта Table Table = Новый СОМОбъект("ADOX.Table");

// Имя новой таблицы

ИмяТаблицы = "NewTable" ;

Table.Мате = ИмяТаблицы;

Добавление новой таблицы Catalog.Tables.Append(Table);

// Создать новый экземпляр объекта Column // Имя новой колонки

ИмяПоля = "NewColumn";

// Добавление нового поля (3-adlnteger)

Catalog.Tables(ИмяТаблицы).Columns.Append(ИмяПоля, 3);

Теперь рассмотрим работу с индексами и ключами. Для того чтобы создать ключ, используется объект ADOX.Key. Под объектами Key подразумеваются первичные (Primary key) И внешние (Foreign key) КЛЮЧИ.

Приведем пример созданий внешнего ключа (листинг 5.12).

Листинг 5.12. Создание внешнего ключа

НННМНВВН___яШШШШ_____________ВШИ___IlilfflllM!___ИИННІ___I_____ШшШШВЯЛ

ForeignKey = Новый СОМОбъект("ADOX.Key");

ForeignKey.Name = "CustOrder";

ForeignKey.Type = 1; // adKeyForeign

// Далее указывается ссылка на связанную таблицу

ForeignKey. RelatedTable = "Customers";

// Определяем имя ключевого поля

ForeignKey.Columns.Append("CustomerId");

// Определяем имя поля в связанной таблице

ForeignKey.Columns("CustomerId").RelatedColumn = "Customerld";

// Определяем правила контроля за каскадными обновлениями

ForeignKey.UpdateRule = adRICascade;

// Добавляем ключ в коллекцию ключей

Catalog.Tables("NewTable").Keys.Append(ForeignKey);\

В данном примере свойство ForeignKey, Туре может принимать следующие значения:

? 1 (adKeyPrimary) — первичный ключ;

? 2 (adKeyForeign) — внешний КЛЮЧ;

? 3 (adKeyUnique) — уникальный КЛЮЧ.

Свойство ForeignKey.UpdateRule может принимать следующие значения:

? о (acRiNone) — никаких действий каскадно не производится (используется по умолчанию);

? 1 (adRiCascade) — произвести каскадное обновление поля;

О 2 (adRiSet-.Nu-l) — значение внешнего ключевого поля выставляется в Null;

? з (adP.iSetDefault) — значение внешнего ключевого поля выставляется в значение по умолчанию.

Подобным же образом осуществляется работа с управлением индексами.

Примечание_

Можно особо отметить следующую особенность — у таблицы есть коллекция индексов, а уже у каждого индекса есть коллекция полей, входящих в этот индекс. Для простых индексов, состоящих из одного поля, в коллекции колонок содержится одна колонка, для составных индексов в коллекции колонок индекса содержатся колонки, входящие в этот индекс.

Приведем пример добавления к таблице составного индекса, состоящего из двух полей: Fieldl И Filed2 (ЛИСТИНГ 5.13).

.....

«ВІЯ

ИІЗІШ

мнп|—нмншшншнмнинвтгатгмш—ИИНИЮЯД—

Листинг 5.13. Создание составного индекса

. ... .... . . —' ....:—, .. .. Ш '

Index = Новый СОМОбъект("ADOX.Index");

// Зададим параметры индекса

Index.Name = "Indexl"

Index.Columns.Append("Fieldl") Index. Columns. Append (" Field2 ") // Добавляем индекс в коллекцию

Catalog.Tables("NewTable").Indexes.Append(Index);

Удаление объектов базы данных

Для удаления объектов базы данных используется метод Delete. Приведем пример удаления индекса, ключа, поля и таблицы (листинг 5.14).

Листинг 5.14. Удаление объектов базы данных

ИмяТаблицы = "NewTable";

// Удаление индекса

Catalog.Tables(ИмяТаблицы).Indexes.Delete(ИмяИндекса); // Удаление ключа

Catalog.Tables(ИмяТаблицы).Keys.Delete(ИмяКлюча);

// Удаление поля

Catalog.Tables(ИмяТаблицы).Columns.Delete(ИмяПоля);

// Удаление таблицы Попытка

Catalog.Tables.Delete(ИмяТаблицы);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

В данном примере удаление таблицы взято в операторные скобки попытка... Исключение...КонецПопытки для исключения системных ошибок, связанных с невозможностью удаления таблицы. Подобная ошибка может появиться при попытке удалить таблицу, содержащую внешний ключ. Вообще говоря, удаление любых объектов баз данных рекомендуется обрамлять конструкцией Попытка...Исключение...КонецПопытки.

Доступ к данным Microsoft Excel через OLE DB

Достаточно часто требуется сформировать отчет и вывести его не только на печать, но и выгрузить в таблицу Microsoft Excel. Также иногда возникает необходимость импортировать данные Excel в систему "1С:Предприятие". Этого можно добиться двумя способами, либо используя технологию OLE Automation, описание и примеры использования которой рассматривались в главе 4, либо через объекты ADO.

Использование технологии ADO, при работе с таблицами Microsoft Excel, практически ничем не отличается от доступа к другим источникам данных. Для подключения к Excel можно использовать код:

Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=C:\file.xls;

Extended Properties="Excel 8.0;HDR=NO;".

Параметр HDR здесь обозначает наличие заголовка в первой строке таблицы, причем YES — определяет присутствует заголовока; NO — нет.

Для выгрузки данных в таблицы Microsoft Excel необходимо создать файл с расширением XLS. Это можно сделать вручную, либо программно с помощью технологии ADOX. Рассмотрим пример создания файла Microsoft Excel через объекты ADOX (листинг 5.15).

1Л

—аящяяя гта др f г ¦у *у у rt у

StaUSiS

Листинг 5.15. Создание MS Excel файла средствами ADOX

. , —. НЯНЯН і -----------------, ij.LlL.i ...Н^вНВЕ& tUu Л,

// Определение имени файла и строки соединения

ИмяФайла = "C:\ExcelDemoFile.xls",-

СтрокаПодключения = "Provider=Microsoft, Jet. 0LED3. 4 . ОData Source=" a

Extended Properties=""Excel 8.0;HDR=NO;.

ИмяФайла +

// Начальная инициализация

Catalog = Новый СОМОбъект("ADOX.Catalog") ;

Catalog.ActiveConnection = СтрокаПодключения;

// Создание новой таблицы

Table = Новый СОМОбъект("ADOX.Table");

// Имя таблицы

Table,Name = "TestTable";

Для Ном = 1 По 5 Цикл

// Создание новой колонки

Column = Новый СОМОбъект("ADOX.Column");

// Имя колонки

Column. Name = "Col" + Ном;

// Тип данных колонки Если Ном = 2 Тогда

Column.Туре = 202; // adVarWChar

Иначе

Column,Туре =5; // adDouble КонецЕсли;

// Присоединение колонки к таблице

Table.Columns.Append(Column);

Column = Неопределено;

КонецЦикла;

// Присоединение созданной таблицы (листа) к книге Excel

Catalog.Tables.Append(Table);

В данном примере создается файл C:\ExcelDemoFile.xls, в который добавляется лист с именем TestTable и инициализируются пять колонок. Свойство Туре объекта column определяет тип колонки. Для источника данных Microsoft Excel это свойство может принимать всего шесть значений, описанных в табл. 5.3.

Таблица 5.3. Допустимые значения свойства туре объекта column для MS Excel
Константа ADO Значение Описание
adDouble 5 Значение с плавающей точкой двойной точности
adDate 7 Дата
adCurrency 6 Денежная сумма (8-байтовое целое со знаком, кратное 10 000)
adBoolean 11 Булево значение
adVarWChar 202 Символьная строка Unicode, заканчивающаяся СИМВОЛОМ Null
adLongVarWChar 203 Длинное строковое значение
После того как файл Excel создан, можно выполнять действия по добавлению данных в какой-либо лист книги Excel. Данные действия можно выполнять двумя способами, либо через метод AddNew объекта Recordset (листинг 5.16), либо через SQL-запросы, используя конструкцию INSERT (листинг 5.17).

щ| птннншщ

Листинг 5.16. Запись данных в лист MS Excel средствами ADO

_ ______________________________— — .............................................—...................

// Создание соединения ADO для работы с книгой Excel

ConnectionExcel = Новый СОМОбъект("ADODB.Connection");

ConnectionExcel.Open(СтрокаПодключения);

// Создание объекта набора записей

RecordsetExcel = Новый СОМОбъект("ADODB.Recordset”);

RecordsetExcel.Open("Select * from TestTabie", ConnectionExcel, 1, 3);

Для Ном = 1 По 10 Цикл

// Добавление новой записи

RecordsetExcel.AddNew();

RecordsetExcel.Fields(0).Value = 11;

RecordsetExcel.Fields(1).Value = "Строка №" + Ном;

RecordsetExcel.Fields(2).Value = 2.30; RecordsetExcel.Fields(3).Value = Ном; RecordsetExcel.Fields(4).Value = Ном * 2.2;

/ / Обновление изменений в книге Excel

RecordsetExcel.UpDate();

КонецЦикла;

// За крыв а ем сое дин ени е

ConnectionExcel.Close();

ConnectionExcel = Неопределено;

В данном примере метод AddNew добавляет очередную строку в лист Excel. Важно отметить, что в один лист невозможно добавить более 65 000 строк — это ограничение приложения Microsoft Excel. Еще одна важная особенность добавления информации в ячейки листа заключается в том, что Excel не поддерживает автопреобразование типов значений ячеек. То есть, если с помощью свойства туре объекта Column для колонки соответствующей ячейки был определен числовой тип, то при попытке записать в эту ячейку строку — возникнет ошибка. Так же нельзя использовать для записи колонки, которые не были созданы, т. е. если было создано всего пять колонок, то можно записывать информацию только в первые пять колонок, хотя при открытии таблицы в приложении Microsoft Excel пользователю будут видны большое количество колонок.

Рассмотрим пример добавления записей, используя SQL-запросы (листинг 5.17).

Г-------------------т,.......у........................ г~--,-------------------„-------------------------—--------,

Листинг 5.17. Запись данных в лист MS Excel через SQL-запросы

// Создание объекта установки связи с источником данных Connection = Новый СОМОбъект("ADODB.Connection");

// Подключение к источнику данных Попытка

Connection.Open(СтрокаПодключения)

Исключение

Сообщить(ОписаниеОшибки()) ; Возврат;

КонецПопытки;

// Создание объекта выполнения команды

Command = Новый СОМОбъект("ADODB.Command");

// Указание активного соединения

Command.ActiveConnection = Connection;

// Определение текста команды

Command.CommandText = "INSERT INTO TestTable VALUES (20, 'Новая строка',

33.3, 44.4, 55.5)";

// Определение типа команды

Command.CommandType = 1;

// Выполнение запроса

Command.Execute();

// Закрываем соединение

Connection.Close(); Command = Неопределенен

Данный пример аналогичен примеру, приведенному в листинге 5.4, за исключением того, что в конструкции запроса INSERT нельзя указать имена колонок.

Для чтения данных из листа Excel необходимо выполнить ряд стандартных действий. Пример такой выборки приведен в листинге 5.18.

,1 Листинг 5.18. Чтение данных MS Excel средствами ADO

_... .. ..._ ...... .___________________

// Чтение данных

// Создание объекта установки связи с источником данных

Connection = Новый СОМОбъект("ADODB.Connection");

// Подключение к источнику данных Попытка

Connection.Open(СтрокаПодключения);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

// Создание объекта выполнения команды Command = Новый СОМОбъект("ADODB.Command"); // Указание активного соединения

Command.ActiveConnection = Connection;

// Определение текста команды

Command.CommandText = "select * from TestTable";

// Определение типа команды

Command.CommandType = 1;

// Создание объекта набора записей

RecordSet = Новый СОМОбъект("ADODB.RecordSet");

// Выполнение и получение набора данных RecordSet = Command.Execute () ;

// Перебор данных

Пока RecordSet.EOF() = 0 Цикл

Сообщить("Строка: " + Recordset.Fields(1).Value);

Сообщить("Число: " + Recordset.Fields(4).Value);

RecordSet.MoveNext();

КонецЦикла;

// После того как набор записей уже не нужен, его следует закрыть

RecordSet.Close();

Connection.Close () ;

Доступ к данным Microsoft Project через OLE DB

Для доступа к данным Microsoft Project можно использовать объекты ADO. Общие принципы, применяемые для доступа к данным MS Project, такие же, что и для других источников данных, но есть некоторые особенности и ограничения.

Некоторые аспекты использования средства доступа OLE DB для Microsoft Project уникальны и должны быть приняты во внимание во избежание нежелательных результатов.

Существует четыре типа данных:

• text — текстовый;

• number - ЧИСЛОВОЙ;

• boolean — логический;

• date — дата-время (в том виде, как они отображаются в интерфейсе, например 27.12.1999 10:30).

П Поля длительности возвращают число минут, умноженное на 10 (например, 8 часов — это 4800), а поля трудозатрат — число минут, умноженное на 1000 (8 часам соответствует 480 000).

? Даты, отображающиеся в интерфейсе как NA (нет данных), возвращаются как значение о.

П Формула в настраиваемом поле, которая в интерфейсе привела бы к результату # error, возвращает значение по умолчанию для данного поля.

П Настраиваемое поле, для которого не установлено никакого значения, возвращает значение, принимаемое по умолчанию.

П Поле индикатора настраиваемого поля в случае, когда индикатор не установлен, возвращает значение -1,

П Значения трудозатрат для материальных ресурсов выражаются в единицах, определенных в интерфейсе, а не числом минут, умноженным на 1000.

О Оператор SELECT без предложения WHERE возвращает пустые строки таблиц ресурсов и задач. Если задать предложение WHERE, эти строки уже не будут возвращены, даже если они подходят по всем остальным условиям.

В реализации средства доступа OLE DB для Microsoft Project 2002 действует

ряд ограничений.

П Не поддерживается доступ для чтения и записи.

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

П Доступ к OLE DB осуществляется с помощью курсоров (наборов записей) последовательного доступа. Наборы записей с последовательным доступом не поддерживают такие методы, как MovePrevious, MoveFirst или MoveLast. Кроме того, наборы записей с последовательным доступом не поддерживают использование свойства Recordcount.

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

П Не поддерживаются операторы — ANY, LIKE и NOT.

П Не поддерживаются статистические функции — Sum, Avg, міп, мах, count И StDev.

П Средство доступа OLE DB снабжено механизмом контроля времени, который сигнализирует, когда следует выгружать файлы, но делает это не раньше, чем произойдет событие загрузки. Если в поле TirneBeforeUnload установлено значение 1, то не проверяется — имеется ли открытый файл,

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

Среда ADO обеспечивает доступ к OLE DB с использованием набора объектов, событий, методов и свойств. Возможны два способа использования ADO:

? доступ к поставщику данных на локальном компьютере;

? доступ к поставщику с сервера Microsoft Project Server.

В листинге 5.19 показан доступ к файлу Microsoft Project на локальном компьютере, а также отображаются некоторые сведения о проекте.

Листинг 5.19. Подключение к проекту и вывод его свойств

// Определение параметров соединения Провайдер = "Microsoft.Project.OLEDB.10.0";

ИмяФайла = "C:\example.mpp";

// Если файл не защищен, то в строке подключения параметры

// User ID (пользователь) и Password (пароль) указывать не обязательно

Пользователь = :г,!;

Пароль = "";

// Установка соединения с проектом Попытка

Connection = Новый СОМОбъект("ADODB.Connection") ;

Connection.Open("Provider=" + СокрЛП(Провайдер) +

Project Kame“” + СокрЛП (ИмяФайла) +

";rJserID=” + СскрЛП (Пользователь ) +

";Password=" + СокрЛП(Пароль));

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

// Запрос к проекту

Command = Новый СОМОбъект("ADODB.Command"); .

Command.ActiveConnection = Connection;

Command. CommandText = "SELECT * FROM Project";

RecordSet = Новый СОМОбъект ("ADODB.RecordSet");

RecordSet = Command.Execute();

// Получение свойств проекта

Название = RecordSet.Fields("ProjectTitle").Value;

ДатаНачала = RecordSet.Fields("ProjectStartDate").Value;

ДатаКонца = RecordSet.Fields("ProjectFinishDate").Value;

// Вывод свойств проекта

Сообщить ("Название проекта: " + Название) ;

Сообщить ("Дата начала: " + ДатаНачала) ;

Сообщить("Дата завершения: " + ДатаКонца);

В данном примере происходит подключение к файлу проекта C:\example.mpp и выводится название проекта, даты начала и завершения проекта из таблицы Project (проект). Эта таблица обеспечивает доступ к параметрам уровня проекта.

Таблица Project имеет большое количество полей. Основные из них приведены в табл. 5.4.

Таблица 5.4. Основные поля таблицы Project

Имя поля

Тип Описание данных

Project (Проект) text Название проекта, отображаемое как путь к

его расположению на диске, например C:\example.mpp

ProjectUniqueiD number Уникальный идентификатор проекта

(Уникальный идентификатор проекта)

Proj ectAuthor

(Автор)
text
Proj ectCompany

(Организация)
text
ProjectCreationDate (Дата создания) date
ProjectStartDate (Дата начала) date
ProjectFinishDate (Дата окончания) date
Имя автора проекта. Используется для группировки аналогичных проектов

Название организации, создавшей проект; используется для группировки аналогичных проектов

Дата создания проекта

Дата и время запланированного начала проекта

Дата и время запланированного завершения проекта

Таблица 5.4 ( окончание)

Имя поля

Тип Описание

данных

date Дата последнего сохранения проекта

text Руководитель проекта. Используется для

группировки проектов, имеющих одного руко

водителя

text Текущий номер версии файла проекта

text Тема проекта. Используется для группировки аналогичных проектов

text Название проекта. Используется для группировки аналогичных проектов

ProjectLastSaved

(Дата сохранения)

ProjectManager

(Руководитель)

ProjectRevision

(Версия)

ProjectSubject

(Тема)

ProjectTitle

(Название)

Все остальные поля таблицы Project и их типы можно вывести с помощью объектов ADOX (листинг 5.20).

Листинг 5.20. Вывод всех полей таблицы Project

// Определение параметров соединения Провайдер = "Microsoft.Project.OLEDB.10.0";

ИмяФайла = "C:\exair.ple.mpp”;

// Начальная инициализация Catalog = Новый СОМОбъект("ADOX.Catalog") ;

Catalog.ActiveConnection = "Provider=" + СокрЛП(Провайдер) + "/Project Name=" + СокрЛП (ИмяФайла) ; . ¦

Table = Catalog.Tables.Item("Project");

// Выводим поля таблицы Если Table.Columns.Count > 0 Тогда

Для НомерПоля = 0 По Table.Columns.Count-1 Цикл Column = Table.Columns.Item(НомерПоля);

ИмяПоля = Column. Name;

ТипПоля = Column.Type;

ДлинаПоля = Column.DefinedSize;

Сообщить ("Имя поля: " + ИмяПоля) ;

Сообщить("Тип поля: " + ТипПоля);

Сообщить("Длина поля: " + ДлинаПоля); КонецЦикла;

КонецЕсли;

Основная таблица, в которой хранятся сведения о задачах, включенных в проект, имеет идентификатор — Tasks, основные поля которой перечислены в табл. 5.5.

Таблица 5.5. Основные поля таблицы Tasks

Имя поля Тип Описание

данных

TaskUniquelD

(Уникальный

идентификатор)

TaskActualStart (Фактическое начало)

TaskActualFinish

(Фактическое

окончание)

TaskActualWork

(Фактические

трудозатраты)

TaskStart

(Начало)

TaskContact (Контактное лицо)

number Уникальный идентификатор задачи

date Дата и время фактического начала задачи

date Дата и время фактического завершения задачи

number Объем трудозатрат, которые уже выполнены назначенными задаче ресурсами

date Дата и время запланированного начала выполнения задачи вычисляется автоматически, если у задачи есть предшественник. TaskFinish — дата и время запланированного завершения выполнения задачи

text Имя человека, являющегося ответственным за выполнение задачи

Название задачи Введенные заметки о задаче

TaskName (Название) text TaskNotes (Заметки) text

TaskOutlineLevel

(Уровень структуры)

number Число, определяющее уровень задачи в иерархической структуре проекта

TaskOutlineNumber text

(Номер в структуре)

Точная позиция задачи в структуре. Например, номер 7.2 означает, что данная задача является второй подзадачей седьмой суммарной задачи верхнего уровня

TaskPercentComplete number Текущее состояние задачи, выраженное в виде (Процент завершения) завершенной части работы в процентах по от

ношению к общей длительности задачи

К задачам обычно привязан один или несколько ресурсов. В таблице Assignments содержатся данные о необходимых ресурсах для выполнения всех задач. Основные поля таблицы Assignments приведены в табл. 5.6.

Таблица 5.6. Основные поля таблицы Assignments

Имя поля Тип Описание

данных

TaskUniquelD (Уникальный number идентификатор задачи)

AssignmentUniquelD number

(Уникальный идентификатор)

AssignmentResourcelD number

(Идентификатор ресурса)

AssignmentActualStart date

(Фактическое начало)

AssignmentActualFinish date

(Фактическое окончание)

AssignmentActualWork number

(Фактические трудозатраты)

Assignment St art (Начало) date

AssignmentFinish date

(Окончание)

AssignmentFinishVariance number

(Отклонение окончания)

AssignmentNotes (Заметки) text AssignmentUnits (Единицы) number

Указатель на действительный идентификатор в таблице Tasks

Уникальный идентификатор назначения

Указатель на действительный идентификатор в таблице Resources

Дата и время фактического начала назначения

Дата и время фактического завершения назначения

Объем работы, которая уже выполнена ресурсом задачи

Запланированная дата и время начала работы назначенного ресурса

Запланированная дата и время завершения использования ресурса по задаче

Разница между датой окончания назначения по базовому плану и запланированной датой окончания

Заметки о назначении

Число единиц,' на которое ресурс назначается задаче. Выражается в процентах от максимального числа единиц ресурса

Общий запланированный объем трудозатрат, которые ресурс должен выполнить по задаче

Название ресурса, связанного с назначением

Тип ресурса: 0 — трудовой (люди и оборудование, назначается по умолчанию); 1 — материальный (расходные материалы, например, сталь, бетон или грунт)

Л s я L g rime n t W о r k numbe r

(Трудозатраты)

AssignmentResourceName text

(Название ресурса)

AssignmentResourceType number

(Тип ресурса)

Рассмотрим пример вывода дерева задач с указанием использованных ресурсов для системы "1С:Предприятие” версии 8.0 (листинг 5.21).

Листинг 5.21. Вывод дерева задач с указанием использованных ресурсоЕ I для версии 8.0

// Переводит номер задачи из формата ххх.хх.х в ххх,хх Функция ПолучитьКодРодителя(Знач НомерЗадачи)

ЧислоВхождений = СтрЧислоВхождений(НомерЗадачи, ".");

Поз = 0:

Если ЧислоВхождений = 0 Тогда Возврат "О";

Иначе

Для Ном = 1 По ЧислоВхождений Цикл

Поз -- Поз + Найти (Сред (НомерЗадачи, Поз f 1), ".")

КонецЦикла;

Возврат Лев(НомерЗадачи, Поз - 1);

КонецЕсли;

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

// Формирует дерево задач Процедура СформироватьДерево()

Провайдер = "Microsoft.Project.OLEDB.10.0" ИмяФайла = ”C:\example.rnpp";

Пароль =

Состояние("Соединение с проектом. Пожалуйста ждите...");

Попытка

Connection = Новый СОМОбъект("ADODB.Connection") ; Connection.Open("Provider=" + СокрЛП Провайдер) +

Project Na.me=” + СскрЛП (ИмяФайла) + ".¦Password”" + СокрЛП(Пароль));

Исключение

Сообщить(ОписаниеОшибки()); Возврат;

КонецПопытки;

// Запрос к задачам

Command = Новый СОМОбъект("ADODB.Command");

Command-ActiveConnection = Connection,-Command.CommandText = " select

TaskName,TaskType,TaskUniquelD,TaskOutlineLevel,TaskOutlineNumber, TaskStart,TaskFinish,TaskPercentComplete from Tasks” ;

RecordSet = Новый СОМОбъект("ADODB.RecordSet");

Recordset = Command.Execute();

// Перебор данных

Пока RecordSet. EOF' (> = 0 Цикл

// Тип записи: 1-группа, 0-задача

ТипЗадачи = RecordSet.Fields("TaskType").Value;

// Имя задачи или группы

ИмяЗадачи = RecordSet.Fields("TaskName").Value; .

// Уникальный идентификатор задачи или группы

ИдентификаторЗадачи = RecordSet.Fields("TaskUniquelD").Value;

// Уровень задачи

УровеньЗадачи = RecordSet.Fields("TaskOutlineLevel").Value;

// Номер задачи в формате хх.х.х

НомерЗадачи = RecordSet.Fields("TaskOutlineNumber").Value; ДатаНачала = RecordSet.Fields("TaskStart").Value;

ДатаКонца = RecordSet.Fields("TaskFinish").Value; ПроцентВыполнения = RecordSet.Fields("TaskPercentComplete").Value;

Если НомерЗадачи = 0 Тогда

СтрокаТПБазовая = ТабличноеПоле;

Иначе

// Поиск родительской задачи Результат =

ТабличноеПоле.Строки.Найти(ПолучитьКодРодителя(НомерЗадачи), "Ид", Истина);

Если Результат = Неопределено Тогда СтрокаТПБазовая .= ТабличноеПоле;

Иначе

СтрокаТПБазовая = Результат;

КонецЕсли;

КонецЕсли;

// Добавляем параметры задачи в дерево

СтрокаТП = СтрокаТПБазовая.Строки.Добавить();

СтрокаТП.Ид = НомерЗадачи;

СтрокаТП.Задача = ИмяЗадачх;

СтрокаТП.ДатаНачала = ДатаНачала;

СтрокаТП.ДатаКонца = ДатаКонца;

Ресурсы =

Если ТипЗадачи = 0 Тогда // Это задача // Запрос по ресурсам

Command = Новый СОМОбъект("ADODB.Command");

Command.ActiveConnection = Connection;

Command.CommandText = "SELECT AssignmentUnits,

AssignmentResourceName FROM Assignments WHERE AssignmentResourcelD > 0 AND TaskUniquelD = " + ИдентификаторЗадачи;

RecordSetResource = Новый СОМОбъект("ADODB.RecordSet"); RecordSetResource = Command.Execute();

// Перебор данных

0 Цикл

Пока RecordSetResource.EOF()

ИмяРесурса =

RecordSetResource.Fields("AssignmentResourceName"). Value; ПроцентЗагрузки =

RecordSetResource.Fields("AssignmentUnits"). Value * 100;

Ресурсы = Ресурсы + ?(Ресурсы^-"","","; ")

СокрЛП(ИмяРесурса) + " (" + ПроцентЗагрузки + "%)";

RecordSetResource.MoveNextО;

КонецЦикла;,

RecordSetResource.Close();

КонецЕсли;

СтрокаТП.Ресурсы = Ресурсы;

// Переход к следующей задачи

RecordSet.MoveNext О;

КонецЦикла;

RecordSet.Close ();

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

В данном примере подразумевается, что на форме обработки имеется элемент — табличное поле с идентификатором табличноеполе. Это табличное поле имеет четыре созданных на форме текстовых поля:

а ид — скрытое поле, предназначенное для хранения идентификатора задачи;

О задача — название задачи;

П датаНачала — запланированная дата начала выполнения задачи;

П датакониа — запланированная дата окончания задачи;

П Ресурсы — строка, содержащая список используемых ресурсов и их загрузку.

Результат вывода дерева задач произвольного проекта показан на рис. 5.2.

Рис. 5.2. Результат вывода дерева задач проекта
Помимо основных, ранее описанных таблиц (project, Tasks и Assignments), существуют и другие, не менее важные таблицы, подробное описание которых в данной книге приводиться не будет. Рассмотрим их состав и назначение.

П Availability — таблица обычно используется вместе с таблицей для получения сведений о доступности ресурсов.

П BaselineTaskSplits — в этой таблице сохраняются базовые сведения о прерывании для конкретной задачи.

П CalendarData и CalendarExceptions — в этих таблицах хранятся все КЯЛСП-

дарные данные, имеющиеся в средстве доступа Microsoft Project OLE DB.

П Calendars — календари, используются для определения стандартного рабочего и нерабочего времени. В проекте необходимо иметь один базовый

календарь. У задач и ресурсов могут быть свои собственные календари, но все они должны строиться на основе базового календаря. В этой таблице хранятся основные календарные данные.

О CostRates — таблица обычно используется вместе с таблицей Resources для отображения содержимого таблиц норм затрат, относящихся к ресурсу. Кроме того, данную таблицу можно использовать совместно с таблицей Assignments для получения сведений о таблице норм затрат, используемой назначением.

П CustomFieidGraphicalindicators — таблица обычно используется вместе с таблицей CustomFieids для получения параметров настраиваемых полей, для которых предусмотрены графические индикаторы.

П CustomFieids (настраиваемые поля) — данная таблица используется для получения всех параметров настраиваемого поля. Для изменения этих полей необходимо извлечь глобальный корпоративный шаблон.

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

О CustomOutiineCodeFieids (поля кодов структуры) — в этой таблице содержится маска для каждой таблицы подстановки настраиваемого кода структуры.

П (таблицы подстановки) — таблица дан

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

П Predecessors (предшественники) — таблица обычно используется вместе с таблицей Tasks для отображения подробных сведений о задачах-предшественниках.

П Resources — в этой таблице содержатся сведения, относящиеся к ресурсам.

П Successors — таблица обычно используется вместе с таблицей Tasks для отображения подробных сведений о задачах-последователях.

П TaskSplits — в этой таблице хранятся даты начала и окончания прерывания задачи.

П (структурная декомпозиция работ) — в этой таблице хранятся определения кода СДР, а также параметры кода СДР для проекта.



Глава 6 Использование SQL-DMO

Понятие SQL-DMO

SQL-DMO (SQL Distributed Management Objects) — это предоставляемая Microsoft SQL Server объектная модель, которая основана на СОМ-технологии.

SQL-DMO скрывает детали структуры языка Transact-SQL и используется при написании административных приложений и сценариев для Microsoft SQL Server. Поставляемые с Microsoft SQL Server графические средства администрирования написаны с применением именно SQL-DMO, которая не является моделью интерфейса данных и не применяется для написания стандартных приложений баз данных.

SQL-DMO позволяет клиентскому приложению манипулировать такими объектами базы данных, как таблицы, процедуры и свойства сервера через интерфейс СОМ. Модель предоставляет приложению следующие возможности:

П управление таблицами (просмотр, создание, удаление, модификация);

П управление списком доступных серверов;

? управление правами доступа к серверам;

G управление списком баз данных на каждом сервере;

? управление сценариями таблиц базы данных;

? создание SQL-скриптов (таблиц, представлений, хранимых процедур, пользователей и их ролей);

? выполнение SQL-запросов.

Для того чтобы объекты SQL-DMO можно было использовать на конкретном компьютере, необходимо установить на нем клиентскую часть Microsoft SQL Server, который устанавливает библиотеку Microsoft SQL OLE Object Library. Данная библиотека представляет собой ActiveX-интерфейс к объектам SQL-DMO. Посредством SQL-DMO можно получать данные из таблиц SQL Server.

Особенно эффективно данную модель могут применять разработчики, использующие Microsoft SQL Server Desktop Engine (MSDE), который поставляется вместе с Access 2000. Этот сервер баз данных представляет собой промежуточный вариант SQL Server и был создан специально для сопряжения с более ранними версиями SQL Server. Хотя MSDE обладает меньшими возможностями, чем SQL Server, он поставляется бесплатно в составе Microsoft Office 2000. Однако версия MSDE, которая поставляется вместе с Microsoft Office 2000, не включает Enterprise Manager. В результате пользователи MSDE не могут оценить все преимущества графического интерфейса при управлении объектами базы данных.

В этой главе будут рассмотрены некоторые подходы к организации работы с объектами SQL Server (далее — SQL-сервер) при помощи SQL-DMO.

Получение списка доступных серверов

Для получения атрибутов SQL-сервера предназначен объект SQLDMO. SQLServer^ В листинге 6.1 приведен пример вывода списка доступных серверов.

Г--Т---------------------------------- -----------------------------------.---:--------------- --------------

Листинг 6,1. Получение списка доступных серверов.....

ПЯНК................г.................._________________________________________o.x.jxl

Попытка

// Создаем объект SQLServer^

// SQLServer2 - предназначен для получения атрибутов MS SQL Server

oSQLServer2 = СоздатьОбъект("SQLDMO.SQLServer2");

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-

КонецПопыт ки;

oSQLServer2.LoginTimeout = 10; oSQLServer2.ODBCPrefix = 0;

// Вывод имен общих SQL-серверов

ServerNameList = oSQLServer2 .Application. ListAvailableSQLServers () Для Ном = 1 По ServerNameList. Count Цикл Сообщить(ServerNameList.Item(Ном));

КонецЦикла;

// Вывод локальных общих SQL-серверов

InstanceNameList = oSQLServer2.Listlnstalledlnstances();

229_

Для Ном = 1 По InstanceNameList.Count Цикл Сообщить(InstanceNameList.Item(Ном));

КонецЦикла;

В приведенном примере свойство oSQLServer2 . LoginTimeout предназначено для определения числа секунд, во время которого будут происходить попытки подключиться. Свойство oSQLServer2.0DBCPrefix управляет выводом ошибок.

Перечисление спецификаций баз данных

Для того чтобы работать с объектами SQL-DMO, необходимо подключиться к выбранному серверу (листинг 6.2).

; Листинг 6.2. Подключение к объекту sqldmo. SQLServer

_ _______________¦ .........¦ . . I. . . .... ' •' : " ¦ ¦¦ ¦ •

// Создаем экземпляр объекта сервера и подсоединиться к нему SQLServer = СоздатьОбъект("SQLDMO.SQLServer");

SQLServer.LoginTimeout = -1;

Попытка

Если ИспользоватьЫТАвторизацию = 1 Тогда // Использовать авторизацию WinMT SQLServer.LoginSecure = 1;

// При разрыве соединения - автоматически повторно не соединяться

SQLServer.AutoReConnect = 0;

// Подключение к серверу

SQLServer.Connect(ИмяСервера); ¦

Иначе

// Использовать SQL Server авторизацию

SQLServer.LoginSecure = 0;

// При разрыве соединения - автоматически повторно не соединяться

SQLServer.AutoReConnect = 0;

// Подключиться с использованием SQL Security

SQLServer.Connect(ИмяСервера, СокрЛП(Пользователь), СокрЛП(Пароль)); КонецЕсли;

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-

КонецПопытки;

В приведенном примере после объявления объекта SQLServer, из библиотеки SQL-DMO, программа генерирует экземпляр этого объекта и подсоединяет его к серверу КмяСеовера. В листинге 6.2 приведена программа, реализующая два варианта подключения к SQL-серверу — с помощью NT авторизации, и без нее. Для соединения с SQL-сервером используется метод connect, в который передается имя сервера, а в случае подключения с помощью SQL Security, еще имя и пароль пользователя. Как правило, при разработке с применением SQL-DMO необходимо пользоваться именем пользователя и паролем, которые предоставляют широкие полномочия, поскольку SQL-DMO используется для программирования административных функций.

При определении времени подключения к серверу в свойстве SQLServer.LoginTimeout установлено значение -1, которое обозначает стандартное время завершения по истечении 60 секунд.

После того как произошло соединение, можно вывести спецификации всех существующих на сервере баз данных (листинг 6.3).

шшммшиц——нпнпншитп№випшнвннв|

Листинг 6.3. ' Перечисление спецификаций баз данных

. ......./МяВИЯшШШЯЯШві’^——— — --^ЯНВЯВЩЯНшНЯННЯннВнННЯННІ

Для iCount = 1 По SQLServer.Databases.Count Цикл // Выводим только НЕ системные БД

Если SQLServer.Databases.Item(iCount).SvstemObject = 0 Тогда БазаДанных = SQLServer.Databases.Item(iCount);

Сообщить ("База данных: " + БазаДанных.Name);

Сообщить("Дата создания:" + БазаДанных.CreateDate);

Сообщить("Количество таблиц:" + БазаДанных.Tables.Count);

Сообщить("Количество представлений:" + БазаДанных.Views.Count); Сообщить("Количество процедур:" + БазаДанных.StoredProcedures.Count); КонецЕсли;

КонецЦикла;

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

Получение списка таблиц и спецификаций полей

Чтобы получить доступ к спецификации каждой таблицы базы данных, необходимо создать объект sqldmo.Table, который позволяет манипулиро-

вать со структурой конкретной таблицы. Элементы типа Table содержатся в коллекции Database.Tables. Для того чтобы перебрать все элементы коллекции, существует два способа. Первый — в цикле, с помощью метода item, получать элементы коллекции, указывая в параметре порядковый номер таблицы (листинг 6.4). Свойство Database.Tables.Count возвращает количество таблиц в базе данных. Второй — с помощью конструкции для каждого...из...Цикл...конецЦикла, которую можно использовать только в версии 8.0 системы "1С:Предприятие".

Листинг 6.4. Получение списка таблиц

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database"); Database = SQLServer.Databases(ИмяБазыДаных);

Для Ном = 1 По Database,Tables.Count Цикл // Выводим только НЕ системные таблицы

Если Database.Tables.Item(Ном),SystemObject = 0 Тогда Сообщить(Database.Tables.Item(Ном).Name);

КонецЕсли;

КонецЦикла;

В программном коде, показанном в листинге 6.4, выводятся имена всех таблиц базы данных. С помощью свойства Systemobject объекта Table отсекаются системные таблицы.

Зная имена таблиц, можно получить спецификацию каждого ее поля — имя, тип, длина поля, признак первичного ключа, признак возможности содержать пустые значения. Для этих целей у объекта Table существует коллекция columns, которая содержит сведения о каждом поле таблицы.

Рассмотрим пример, в котором, помимо имен таблиц, выводятся названия полей и их спецификация (листинг 6.5).

Листинг 6.5. Получение спецификации полей таблиц .....

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазыДаных);

// Объект таблица

Table = СоздатьОбъект("SQLDMO.Table")

Для Ном = 1 По Database.Tables.Count Цикл // Выводим только НЕ системные таблицы Если Database.Tables.Item(Ном).SystemObject = 0 Тогда // Выводим имя таблицы

ИмяТаблицы = Database.Tables.Item (Ном).Name; Сообщить("Имя таблицы:" + ИмяТаблицы)

Table = Database.Tables(ИмяТаблицы);

/ / Цикл по полям

Для НомерПоля = 1 По Table,Columns.Count Цикл Column = Table.Columns.Item(НомерПоля);

Сообщить("Имя поля: + Column.Name);

Сообщить("Тип данных: " + Column.DataType);

Сообщить ("Длина данных: " + Column. Length) ;

Сообщить ("Это первичный ключ: " + ? (Column.InPrimaryKey = -1, "Да", "Нет"));

Сообщить("Может принимать пустые значения: " + ?

(Column.AllowNulls = -1, "Да", "Нет"));

КонецЦикла;

КонецЕсли;

КонецЦикла;

Листинг 6.5 демонстрирует, как производится выборка элементов коллекции таблиц Tables внутри базы данных. Объекты Table, в свою очередь, обладают иерархически организованными коллекциями объектов и отдельными объектами. Каждая таблица обязательно имеет коллекцию столбцов Columns, но у любой таблицы может иметься единственный объект PrimaryKey, соответствующий первичному ключу. Коллекция Keys ключей таблицы содержит ссылки на все ограничения первичного ключа таблицы и внешних ее ключей.

Объект Column имеет следующие основные свойства:

О Name - ИМЯ ПОЛЯ;

О DataType — строковое представление типа значений для поля (например, varchar, int И Т. П.);

О Length — максимально допустимая длина значения;

InPrimaryKey — признак первичного ключа — обозначает, что данное поле является первичным ключом, о — нет);

П AllowNulls — признак возможности содержать пустые значения (-1 — поле может принимать пустые значения, о — не может).

Получение списка представлений

С помощью коллекции views объекта Database можно получить доступ к представлениям, которые определены в базе данных. Для обхода элементов коллекции views можно воспользоваться все тем же свойством count, которое возвращает общее количество представлений, и методом item, который получает объект view (представление) по его номеру (листинг 6.6). Так же допустим просмотр элементов коллекции с помощью конструкции Для каждого...из...Цикл...КонецЦикла.

........................................................................т .......-1”".......

Листинг 6.6. Получение, списка представлений

ТМіі_________________....___.......

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database"); Database = SQLServer.Databases(ИмяБазьЩаных);

Для Ном = 1 По Database,Views.Count Цикл

// Выводим только НЕ системные представления Если Database.Views.Item(Ном).SystemObject = 0 Тогда Сообщить(Database.Views.Item(HoM).Name);

КонецЕсли;

КонецЦикла,-

Данный пример выводит список имен всех представлений базы данных.

Получение списка хранимых процедур

Получение списка хранимых процедур производится методом аналогичным тому, который использовался и для таблиц. Исключением здесь является то, что коллекция, которая содержит элементы свойств хранимых процедур, называется storedProcedures (листинг 6.7).

Листинг 6.7. Получение списка хранимых процедур

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазьЩаных);

Для Ном = 1 По Database.StoredProcedures.Count Цикл // Выводим только НЕ системные процедуры

Если Database.StoredProcedures.Item!Ном) .SystemObject = О Тогда

// Выводим имя хранимой процедуры

Сообщить(Database.StoredProcedures.Item(Ном).Name);
КонецЕсли;

КонецЦикла;

Изменение структуры баз данных

Создание и удаление баз данных

Для добавления новой базы данных на SQL-сервер предназначен все тот же объект sqldmo. Database. При этом затрагиваются еще два дополнительных объекта:

? sqldmo. DBFile — объект физического файла базы данных;

? sqldmo.LogFile — объект физического файла транзакций.

Для регистрации новой базы данных на сервере необходимо сначала создать физический файл базы данных и файл транзакции.

Рассмотрим пример создания новой базы данных с именем NewDB (листинг 6.8).

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект файла базы данных

DBFileData = СоздатьОбъект("SQLDMO.DBFile");

// Объект файла транзакций

LogFile = СоздатьОбъект("SQLDMO.LogFile");
// Имя новой БД

ИмяНовойБазыДанных = "NewDB";

// Установить имя новой БД Database.Name = ИмяНовойБазыДанных;

// Определяем свойства файла БД DBFileData.Name = ИмяНовойБазыДанных;

DBFileData.PhysicalName = SQLServer.Registry.SQLDataRoot + "\DATA\" +

ИмяНовойБазыДанных + ".тсНУ5;

DBFileData.PrimaryFile = 1;

DBFileData.Size = 2;

DBFileData.FileGrowth = 1;

// Добавим файл базы данных

Database.FileGroups("PRIMARY").DBFiles.Add(DBFileData);

// Определяем свойства файла транзакций

LogFile.Name = ИмяНовойБазыДанньк + "Log";

LogFile.PhysicalName = SQLServer.Registry.SQLDataRoot + "\DATA\" +

LogFile.Name+ ".ldf";

LogFile.Size = 2;

// Добавим файл транзакций базы данных

Database.TransactionLog.LogFiles.Add(LogFile);

// Создадим БД Попытка

SQLServer.Databases.Add(Database);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Из приведенного выше кода видно, что сначала создаются объекты базы данных Database, физического файла DBFileData и файла транзакций LogFile. Затем, С ПОМОЩЬЮ СВОЙСТВ Database. FileGroups ( "PRIMARY" ) . DBFiles И Database . TransactionLog , LogFiles, добавляются соответственно объекты файла базы данных и файла транзакций. Только после этого база данных регистрируется на сервере.

Рассмотрим основные свойства объекта DBFile.

О Name — имя файла.

О PhysicalName — физическое местонахождение файла.

П PrimaryFile — признак основного файла базы данных.

? Size — начальный размер файла в мегабайтах (необязательное свойство).

? FileGrowth — признак, определяющий, что необходимо хранить в базе данных (таблицу, индекс, или регистрационные данные).

Рассмотрим основные свойства объекта LogFile.

G Name — ИМЯ файла.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

Для определения типа данных и максимальной длины значения каждого столбца используются соответственно свойства Datatype и Length. В коде, представленном в листинге 6.9, например, столбец Prod ID относится к типу целочисленных данных int; столбец ProdName — к символьному типу данных переменной длины varchar.

Доступные типы данных представлены в табл. 6.1.

Таблица 6.1. Типы данных полей, доступные в SQL-DMO

Идентификатор Описание

bigint

int

smallint

tinyint

bit

decimal

numeric

money

smallmoney

float

real

datetime

smalldatetime

char

Table.FileGroup = "PRIMARY”;

// Создаем колонки

// Добавить целочисленный тип данных

Columnl = СоздатьОбъект("SQLDMO.Column"); Column! . Name = "ProcilD";

Columnl.Datatype = "int";

Table.Columns.Add(Columnl);

// Добавить тип данных символьной строки

Column2 = СоздатьОбъект("SQLDMO.Column"); Column2.Name = "ProdName";

Column2.DataType = "varchar";

Column2.Length = 25;

Table.Columns.Add(Column2);

// Добавить еще один целочисленный тип данных

СоІитпЗ = СоздатьОбъект("SQLDMO.Column"); Column3.Name = "Price";

СоІитпЗ. DataType = "money";

Table.Columns.Add(СоІитпЗ);

// Добавить десятичный тип данных

Column4 = СоздатьОбъект("SQLDMO.Column"); Column!.Name = "ProdWeight";

Column4 . DataType = "decimal”;

Column4.NumericPrecision = 9;

Column4.NumericScale = 5;

Table.Columns.Add(Column4);

// Очистить объекты Columnl =

Column2 = "" ; СоІитпЗ =

Column4 =

// Перед добавлением новой таблицы в назначенную базу данных // удалить предыдущую версию таблицы, если она существует

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

Для определения типа данных и максимальной длины значения каждого столбца используются соответственно свойства Datatype и Length. В коде, представленном в листинге 6.9, например, столбец Prod ID относится к типу целочисленных данных int; столбец ProdName — к символьному типу данных переменной длины varchar.

Доступные типы данных представлены в табл. 6.1.

Таблица 6.1, Типы данных полей, доступные в SQL-DMO

Идентификатор Описание

Целочисленный тип, от -263(-9 223372 036854 775808) до 263 (9 223372 036854 775807)

Целочисленный тип, от -231 (-2147483 648)до23’ (2147483 647)

Целочисленный тип, от 215 (-32 768) до 215 (32 767)

Целочисленный тип, от 0 до 255

Целочисленный тип, 0 или 1

Тип с фиксированной точностью, от до 1038

Эквивалентно типу decimal

Денежный тип, от -263 (-922 337 203 685 477.5808) до 263 (+922 337 203 685 477.5807)

Монетный тип, от -214 748.3648 до +214 748.3647

Числовой тип с плавающей запятой, до по 1.79Е+308

Числовой тип с плавающей запятой, от -3.40Е+38 до 3.40Е+38

Дата и время, начиная с 1 января 1753 по 31 декабря 9999 с точностью до 3.33 миллисекунд

Дата и время, начиная с 1 января 1900 по 6 июля 2079 с точностью до одной минуты

Строка фиксированной длины (не Unicode), максимально допустимая длина — 8000 символов

bigint

int

smallint

tinyint

bit

decimal

numeric

money
real

float
datetime
char
Таблица 6.1 (окончание)
Идентификатор Описание
varchar

Строка переменной длины (не Unicode), максимально допустимая длина — 8000 символов
Строка переменной длины (не Unicode), максимально допустимая длина — 231 (2 147483 647) символов

text

nchar

nvarchar

ntext

binary

varbinary

image

cursor

sql_variant

table

timestamp

uniqueidentifier

Строка фиксированной длины (Unicode), максимально допустимая длина — 4000 символов

Строка переменной длины (Unicode), максимально допустимая длина — 4000 символов

Строка переменной длины (Unicode), максимально допустимая длина — 230 (1 073 741 823) символов

Двоичные данные фиксированной длины до 8000 байт

Двоичные данные переменной длины до 8000 байт

Двоичные данные переменной длины до 231 (2 1 47 483 647) байт

Ссылка на курсор

Любой тип данных, поддерживаемый SQL Server

Специальный тип данных, используемый в качестве хранилища результата обработки данных

Уникальный номер в пределах базы данных

Глобальный уникальный идентификатор (GUID)

Как видно из приведенного примера, определение столбцов таблицы реализуется в три этапа.

На первом этапе необходимо создать экземпляр столбца.

На втором — код должен настроить этот столбец, присвоив значения таким его свойствам, как название Name и тип данных DataType. Определяемые свойства могут меняться в зависимости от типа данных столбца. К примеру, для столбца, принадлежащего целочисленному типу данных int, достаточно настроить всего два свойства — имя и тип данных. В то же время столбец, относящийся к типу данных varchar, требует определения значений как минимум трех свойств — названия (Name), типа данных (DataType) и длины (Length).

Третий этап создания столбца предусматривает инициирование метода добавления Add, который и добавит созданный столбец в коллекцию столбцов Columns рассматриваемой таблицы.

С помощью метода Database. Tables. Add происходит добавление таблицы к подключенной базе данных. До начала добавления таблицы метод Remove

удаляет из базы данных все ранние версии этой таблицы. После этого код вычищает все дочерние объекты.

Часть программного кода, отвечающая за установление соединения с сервером, на котором будет размещена база данных, в примере не показана, так как подразумевается, что подключение было совершено ранее, по аналогии с кодом, приведенном в листинге 6.2.

Теперь рассмотрим пример создания таблицы заказов Orders (листинг 6.10). У этой таблицы имеется первичный ключ, построенный по столбцу с активизированным свойством идентичности identity. Приведенный пример кода во многом напоминает код из листинга 6.9, за исключением перевода свойства AllowNulis третьего столбца в состояние -1.

Листинг 6.10. Создание таблицы заказов Orders

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект новой таблицы

Table = СоздатьОбъект("SQLDMO.Table");

// Имя базы данных

ИмяБазыДанных = "TestDB"

// Имя новой таблицы

ИмяТаблицы = "Orders";

Database = SQLServer.Databases(ИмяБазыДанных); Table.Каше = ИмяТаблицы;

Table.FileGroup = "PRIMARY",-

// Создаем колонки

// Добавить целочисленный тип данных Columnl = СоздатьОбъект("SQLDMO.Column"); Columnl.Name = "OrderlD";

Columnl.Datatype = "int";

Coluinnl.AllowNulls = 0;

Columnl.Identity = -1;

Columnl.IdentitySeed = 1000;

Columnl.IdentityIncrement = 10;

Table.Columns.Add(Columnl);

// Добавить столбец со свойством Identity, который будет служить перппчкым ключом таблицы

Кеуі = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "OrdersPK"; ¦

Keyl.Type = 1 ;

Keyl.Clustered = -1;

Keyl.KeyColumns.Add(Columnl.Name);

Table.Keys.Add(Keyl);

// Добавить временной тип данных datetime Column2 = СоздатьОбъект("SQLDMO.Column");

Column2.Name = "OrderDate";

Column2 . DataType = "datetime";

Table.Columns.Add(Column2);

// Добавить тип данных datetime, допускающий неопределенные значения

СоІитпЗ = СоздатьОбъект("SQLDMO.Column");

СоІитпЗ.Name = "ShippedDate";

СоІитпЗ . DataType = "datetime" ;

СоІитпЗ.AllowNulls = -1;

Table.Columns.Add(СоІитпЗ);

// Перед добавлением новой таблицы в назначенную // базу данных удалить предыдущую версию таблицы,

// если она существует.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу •

Database.Tables.Add(Table);

// Очистить объекты Columnl =

Column2 =

СоІитпЗ =

Код, приведенный в листинге 6.10, создает таблицу заказов с именем Orders. Таблица orders содержит столбец идентификатора заказа OrderiD; столбец orderDate, в который заносится дата ввода заказа, а также столбец shippeciDate, в который записывается дата отправки заказа. Столбец Order id служит первичным ключом таблицы, а столбец ShippedDate может содержать неопределенные значения NULL. Чтобы заставить SQL Server автоматически формировать значения первичного ключа для новых строк, процедура активизирует свойство identity, присваивая ему значение -1 (истина или True). При этом исходное значение равно 1000, а приращение составляет После добавления в проект таблицы столбца со свойством identity создается экземпляр кеуі ключевого объекта Key. Затем присваиваются значения свойствам Name и туре объекта Кеуі, которые содержат соответственно название и тип данных. Все возможные значения свойства туре объекта Key приведены в табл. 6.2.

Таблица 6.2. Типы ключей SQL-DMO
Константа SQL-DMO Значение Описание
SQLDMOKey Foreign 3 Внешний ключ
syr. оно Key Primary 1 Первичный ключ
SQLDMOKey Unique 2 Уникальное поле, не допускающее значение

NULL
SQLDMOKey Unknown. О Ошибочное значение
Свойству Clustered объекта Key 1 присваивается значение -1 (истина или True). В результате уникальный индекс первичного ключа строится в виде кластеризованного индекса для всей таблицы Orders. Прежде чем добавить ключ Кеуі в коллекцию ключей Keys таблицы Orders, необходимо указать хотя бы один объект из класса столбцов, который будет поставлен в соответствие первичному ключу. В приведенном примере в этой роли выступает столбец OrderiD, у которого активизировано свойство identity.

Во все столбцы (листинг 6.9) и в два первых столбца (листинг 6.10) необходимо вводить определенные значения. Иное дело третий столбец — ShippedDate (листинге 6.10). В нем могут находиться неопределенные значения NULL, поскольку дата фактической отправки заказа неизвестна на момент ввода сведений о заказе. Она вводится в столбец shippedDate позднее, когда заказ уже отправлен. Поэтому в третьем столбце присваивается значение -1 свойству AllowNuiis, после чего можно помещать в него неопределенные значения. По умолчанию значение этого свойства равно о (ложь или False),

Таблица товаров Products (листинг 6.9) и таблица заказов orders (листинг 6.10) связаны между собой отношением "миогие-ко-мшогим". Такое

отношение имеет место потому, что один и тот же товар может войти в один или несколько заказов, а каждый заказ может включать многие товары. Чтобы отразить такое отношение в разрабатываемом проекте базы данных, необходимо внести в него два изменения. Во-первых, нужно переделать проект таблицы товаров Products таким образом, чтобы у нее тоже появился первичный ключ. Во-вторых, необходимо добавить в базу данных новую таблицу, которая свяжет таблицы Products и orders. В этой таблице будут храниться общие данные доменов обеих таблиц. К примеру, в ней можно хранить количество определенного товара, которое указывается в отдельной строке заказа. Новую таблицу, которая связывает таблицы Products И Orders, назовем OrderDetails.

В листинге 6.11 приведен пример создания таблицы связей OrderDetails. У этой таблицы имеются внешние ключи, которые ссылаются на таблицы

Orders И Products.

[ Листинг 6.11. Создание таблицы с подробными сведениями о заказах : OrderDetails S

UrU.i :_________________________._______________!____________________'______..........----... . ¦ ............. ..-------1 ,.. ... . .:. L_

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект новой таблицы

Table = СоздатьОбъект("SQLDMO.Table");

// Имя базы данных

ИмяБазыДанных = "TestDB";

// Имя новой таблицы

ИмяТаблицы = "OrderDetails";

Database = SQLServer.Databases(ИмяБазыДанных); Table.Name = ИмяТаблицы;

Table.FHeGroup = "PRIMARY" ;

//Создаем колонки

// Добавить целочисленный тип данных

Columnl = СоздатьОбъект("SQLDMO.Column"); Column!.Name = "OrderID";

Columnl.Datatype = "int";

Table.Columns.Add(Columnl);

// Добавить целочисленный тип данных

Со1итп2 = СоздатьОбъект("SQLDMO.Column");

Column2 . Name = "ProdlD";

Column2. DataType = "int",

Table.Columns.Add(Column2);

// Добавить внешний ключ, указывающий на таблицу Orders

Keyl = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "OrderTDFK";

Keyl.Type = 3 ;

Keyl.KeyColumns.Add(Columnl.Name);

Keyl.ReferencedTable = "Orders",-Keyl.ReferencedColumns.Add("OrderlD");

Table.Keys.Add(Keyl);

// Добавить внешний ключ, указывающий на таблицу Products Кеу2 = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "ProdIDt’K";

Key!.Type = 3 -

Key2.KeyColumns.Add(Column2.Name);

Key2 . ReferencedTable = " Products" -

Key2.ReferencedColumns.Add("ProdID");

Table.Keys.Add(Key2);

// Добавить первичный ключ, состоящий из двух столбцов КеуЗ = СоздатьОбъект("SQLDMO.Key");

Key3.Name = "OrderlDAndProdlDPK";

КеуЗ.Type =

КеуЗ.Clustered = -1,

КеуЗ.KeyColumns.Add(Columnl.Name);

КеуЗ.KeyColumns.Add(Column2.Name);

Table.Keys.Add(КеуЗ) ;

// Добавить целочисленный тип данных

СоІитпЗ = СоздатьОбъект("SQLDMO.Column");

Column3.Name = "Quantity";

СоІитпЗ.DataType = "int";

Table.Columns.Add(СоІитпЗ);

// Перед добавлением новой таблицы в назначенную // базу данных удалить предыдущую версию таблицы,

// если она существует.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

// Очистить объекты

Columnl =

Column2 =

СоІитпЗ =

Код, приведенный в листинге 6.1 I, показывает также синтаксис, применяемый при построении первичного ключа на основе нескольких столбцов. Код, создающий внешний ключ, начинается с генерации экземпляра объекта ключа Key. После присвоения имени этому объекту, его свойству туре присваивается признак внешнего ключа (значение з). Вслед за этим добавляется свойство Name объекта Key, содержащее название этого столбца, в принадлежащую ключу коллекцию названий ключевых столбцов KeyColumns. В соответствии со спецификацией столбец OrderiD таблицы orderDetails назначается локальным столбцом внешнего ключа. Затем происходит назначение таблицы orders и ее столбца Order id соответственно таблицей и столбцом, на которые будут формироваться ссылки. После настройки всех этих свойств программный код, формирующий первый внешний ключ, завершает свою работу добавлением созданного ключа в коллекцию ключей Keys таблицы orderDetails. После этого создается внешний ключ, который будет указывать на столбец идентификатора товара Р rod id в таблице товаров Products ИЗ столбца ProdID таблицы OrderDetails.

Часть кода, в которой описан объект кеуЗ, демонстрирует синтаксис, применяемый для формирования первичного ключа из нескольких столбцов таблицы. Этот блок операторов очень похож на те, в которых определяются внешние ключи таблицы.

Для того чтобы удалить поле таблицы, необходимо воспользоваться методом Column. Remove где идентификатор Column является объектом удаляемого поля.

Создание SQL-скриптов

В листинге 6.4 был приведен пример получения списка таблиц, имеющихся в базе данных. Аналогичным образом, через объект Database. Tables, можно сгенерировать SQL-скрипт, который можно использовать для создания таблиц в другой базе или на другом сервере.

В листинге 6.12 приведен пример генерации SQL-скрипта для создания таблицы customers, находящейся в базе данных Northwind, входящий в поставку продукта Microsoft SQL Server 7.0/2000.

L-скрипта создания таблицы Customers

Листинг 6.12. Генерация SQ базы данных Northwind

-------• .. --------і----

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases("Northwind");

// Выводим скрипт

Сообщить(Database.Tables.Item("Customers").Script())

SQL-скрипт, созданный в результате выполнения приведенного выше кода, представлен в листинге 6.!3.

! Листинг 6.13. SQL-скрипт создания таблицы customers

CREATE TABLE [Customers] (

[CustomerlD] [nchar] (5) COLLATE Cyrillic_General_CI_AS NOT NULL , [CompanyNamej [nvarchar] (40) COLLATE Cyrillic_General_CI AS NOT NULL [ContactName] [nvarchar] (30) COLLATE Cyrillic_General_CI_AS NULL , [ContactTitle] [nvarchar] (3 0) COLLATE Cyrillic_General_CI_AS NULL , [Address] [nvarchar] (60) COLLATE Cyrillic_General_CI_AS NULL ,

[City] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,

[Region] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL , [PostalCode] [nvarchar] (10) COLLATE Cyrillic_General_CI_AS NULL , [Country] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,

[Phone] [nvarchar] (24) COLLATE Cyrillic^General_CI_AS NULL ,

[Fax] [nvarchar] (24) COLLATE NULL ,

CONSTRAINT [ PK_ Customers] PRIMARY KEY CLUSTERED

(

[CustomerlD]

) ON [PRIMARY]

) ON [PRIMARY]

GO

В листинге 6.12 показано, что получить ссылку на объект таблицы можно не только по его номеру, как это было показано в листинге 6.4, но и по имени.

Метод script возвращает строковое выражение скрипта соответствующего объекта. В листинге 6.14 приведен пример генерации полного SQL-скрипта создания базы данных, включающий:

? сценарий создания таблиц;

П сценарий создания представлений;

О сценарий создания хранимых процедур;

О сценарии создания пользователей;

О сценарии создания ролей.

Листинг 6.14, Генерация полного SQL-скрипта создания базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазыДанных);

СтрокаСценария =

Попытка

// Сценарий создания таблиц

Для Ном = 1 По Database.Tables.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Tables.Item(Ном).Script();

КонецЦикла;

// Сценарий создания представлений

Для Ном = 1 По Database.Views.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Views.Item(Ном).Script(); КонецЦикла;

// Сценарий создания хранимых процедур

Для Ном = 1 По Database.Stc-redProcedures.Count Цикл

СтрокаСценария = СтрокаСценария + Database .StoredProcedures.Item(Ном).Script();

КонецЦикла;

// Сценарии создания пользователей

Для Ном По Database.Users.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Users.Item(Ном).Script();

КонецЦикла;

// Сценарии создания ролей

Для Ном = 1 По Database.DatabaseRoles.Count Цикл

СтрокаСценария = СтрокаСценария +

Database.DatabaseRoles.Item(Ном).Script();

КонецЦикла;

Текст = СоздатьОбъект("Текст");

Текст.ДобавитьСтроку(СтрокаСценария);

Текст.Показать("Полный скрипт создания базы данных",);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Выполнение SQL-запросов

В SQL-DMO, помимо административных задач, можно получать выборки данных с помощью SQL-запросов. Для данных целей предназначен метод ExecuteWithResults объекта Database. Метод ExecuteWithResults имеет единственный параметр — строку SQL-запроса и возвращает объект типа

QueryResults.

Рассмотрим основные свойства объекта QueryResults.

П ROWS — возвращает количество записей в результирующей таблице запроса;

О Columns — возвращает количество полей в результирующей таблице запроса;

? Column Туре (номерКолонки) — возвращает тип соответствующего поля (все возможные типы перечислены в табл. 6.3);

О ColumnName (НомерКолонки) — возвращает имя соответствующего поля.

Таблица 6.3. Типы полей объекта QueryResults
Константа SQL-DMO Значение Описание
SQLDMO DTypeBigint -5 Целочисленный тип bigint
SQLDMO DTypeBinary -2 Двоичный тип фиксированной длины
SQLDMO_DTypeBit -7 Положительный целочисленный тип
SQLDMO DTypeChar 1 Строковый тип фиксированной длины
Таблица 6.3 (окончание)

























SQLDMO DtypeSQLVariant -150













Специальный тип ODBC —

SQL TIMESTAMP STRUCT

Специальный тип ODBC —

SQL TIMESTAMP STRUCT

Числовой тип с плавающей запятой (4 байта)

Числовой тип с плавающей запятой (8 байт)

Глобальный уникальный идентификатор (GUID)

Двоичный тип переменной длины

Положительный числовой тип (1 байт)

Числовой тип со знаком (2 байта)

Числовой тип со знаком (4 байта)

Денежный тип

Расширенный денежный тип

Расширенный строковый тип (Unicode)

Любой тип данных, поддерживаемый SQL Server

Расширенный строковый тип

Строковый тип фиксированной длины (Unicode)

Ошибочный тип

Строковый тип переменной длины (Unicode)

Двоичный тип переменной длины Строковый тип переменной длины

Основной метод GetColumnString объекта QueryRe.su.lts позволяет получить значение результата запроса, находящееся в определенной строке и поле. Метод GetColumnString имеет два параметра — номер строки и номер колонки (поля).

В листинге 6.15 приведен пример выполнения SQL-запроса и вывода результата на экран в виде таблицы значений.

Листинг 6.15. Общий алгоритм выполнения SQL-запросов

Попытка

ИмяБазыДанных = "Northwind";

СтрокаЗапрсса = "SELECT FROM Customers Т3_3апроса = СоздатьОбъект("ТаблицаЗначений"); .

Состояние("Выполнение запроса

QueryResults = SQLServer.Databases(ИмяБазыДанных).ExecuteWithResults (СтрокаЗапроса);

Состояние("Преобразование данных...;

// Заполняем таблицу, перебирая результаты запроса по строкам

Для НомерСтроки = 1 по QueryResults.Rows Цикл Если НомерСтроки = 1 Тогда

// Формируем колонки в таблице с именами,

// взятыми из результатов запроса и соответствующего типа

Для НомерКолонки = 1 по QueryResults,Columns Цикл // Вставляем колонку

ТЗ_Запроса.ВставитьКолонку(QueryResults.ColumnName (НомерКолонки), НомерКолонки, "Строка",,,

QueryResults.ColumnName (НомерКолонки),15,);

КонецЦикла;

Коне дЕ ели;

// Добавляем строчку

ТЗ_Запроса.НоваяСтрока();

// Поколоночно пишем в таблицу данные

Для НомерКолонки = 1 по QueryResults.Columns Цикл

ТЗ_Запроса.УстановитьЗначение(НомерСтроки, НомерКолонки, QueryResults.GetColumnString(НомерСтроки,НомерКолонки));

КонецЦикла;

КонецЦикла;

// Показать таблицу

ТЗ_Запроса.ВыбратьСтроку();

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Данный пример является универсальным, т. е. в переменную Строказапроса можно поместить произвольный текст запроса, и при этом по-прежнему будет корректно выводиться результат выполнения запроса. Это достигается благодаря наличию свойств ROWS, columns и CoiumnName у объекта Query Re suit .5. В результате обработки объекта QueryRe suits получаем таблицу значений, содержащую результаты выполнения запроса.

Таким образом, как следует из данного примера, общий алгоритм выполнения произвольного запроса следующий:

1. С ПОМОЩЬЮ метода ExecuteWithResults объекта Database Получаем объект QueryResults, содержащий результат выполнения запроса.

2. Для инициализации колонок результирующей таблицы значений обходим все поля объекта QueryResuits, с помощью свойства CoiumnName получаем имена полей, после чего создаем одноименные колонки в таблице значений. Количество полей определяется свойством columns.

3. Построчно обходим все записи объекта QueryResuits. Количество записей определяется свойством ROWS.

4. Для каждой записи обходим все поля объекта QueryResuits, с помощью метода GetCoiu-nnstrine получаем значения соответствующих ячеек и помещаем их в результирующую таблицу значений.

Резервирование и восстановление базы данных

Для создания резервной копии базы данных предназначен объект Backup. Рассмотрим основные свойства этого объекта.

? Action — свойство, определяющее, по отношению к чему выполнять действия резервирования данных (возможные значения свойства перечислены в табл. 6.4);

П Database — имя резервируемой базы данных;

П Files — имя файла резервных данных;

О MediaName — дополнительное описание, помогающее в идентификации резервной копии;

? BackupSetDescription — основное описание резервной копии;

П BackupSetName — идентификатор резервной копии.

Метод 3QL3sckup объекта Backup предназначен для создания резервной копии и, имеет один параметр — ссылку на объект SQLServer.

Таблица 6.4. Возможные значения свойства Action объекта Backup

SQLDMOBackup_Database

SQLDMOBackup_Files

SQLDMOBackup Incremental

SQLDMOBackup Log

Резервирование всей базы данных

Резервирование только определенных файлов

Дифференциальное резервирование, т. е. копируются файлы, созданные или измененные с момента последнего резервирования

Резервирование только файла транзакций

В листинге 6.16 приведен пример полного резервирования базы данных Northwind в файл C:\BACKUP\Northwind.bak.

F................... ..............—----------------------------------- ------------------------ Л........ .....................Р

і Листинг 6.16. Создание резервной копии базы данных Northwind

Backup = СоздатьОбъект("SQLDMO.Backup");

Backup.Act ion = 0;

Backup.Database = "Northwind";

Backup.Files = "C:\BACKUP\Northwind.bak";

Backup.MediaName = "Northwind.bak " + РабочаяДата() + " " +

ТекущееВремя ();

Backup.BackupSetName = "Northwind";

Backup. BackupSetDescr-iption = "Резервная копия";

Backup.SQLBackup(SQLServer);

Для восстановления созданной ранее резервной копии предназначен объект Restore.

Рассмотрим основные свойства этого объекта.

О Action — описывает по отношению к чему выполнять восстановление данных (возможные значения свойства перечислены в табл. 6.5);

? Database — имя базы данных, для которой восстанавливаются данные;

П Files — имя файла резервной копии;

? FiieNumber — порядковый номер записи резервной копии;

П RepiaceDatabase — признак замены резервного образа базы данных (свойство может принимать значение -1 — истина и о — ложь);

? LastRestore — признак восстановления последних записей файла транзакций (свойство может принимать значение -1 — истина и о — ложь).

Использование SQL-DMO,

Таблица 6.5. Возможные значения свойства Action объекта Restore
Константа SQL-DMO Значение Описание
SQLDMORestore Database 0 Восстановление всей базы данных
SQLDMORestore Files 1 Восстановление только определенных файлов
SQLDMORestore_Log 2 Восстановление только файла транзакций
.253

В листинге 6.17 приведен пример восстановления базы данных North wind из ранее созданного резервного файла C:\BACKUP\Northwind.bak.

| Листинг Восстановление базы данных Northwind из резервной копии

ВННпНИЯВ?ВІв8

Restore = СоздатьОбъект("SQLDMO.Restore"); Restore.Action = 0;

Restore.Database = "Northwind";

Restore.Files = "C:\BACKUP\Northwind.bak"; Restore.FileNumber = 1;

Restore.ReplaceDatabase = -1;

Restore.LastRestore = -1;

Restore.SQLRestore(SQLServer);

Настройка ограничений доступа к данным

Для настройки офаничений доступа к базе данных в SQL-DMO существует три объекта:

? Login — предназначен для управления параметрами аутентификации для контроля доступа к SQL-серверу;

? DatabaseRole — предназначен для управления списком ролей базы данных;

? user — предназначен для управления списком пользователей базы данных.

Объект Login используется для создания или модификации регистрационных имен пользователей SQL Server и их атрибутов. Объект Login имеет следующие свойства.

CD Name — ИМЯ пользователя В формате "Имя домена?Имя пользователя";

? туре — тип пользователя (возможные значения свойства перечислены в табл. 6.6);

П DenyNTLogin — признак запрета Windows NT авторизации пользователя.

Примечание

Если свойство DenyNTLogin установлено в -1 (Истина), то любая попытка Windows NT авторизации при подключении к SQL-серверу отвергается им. Если свойство установлено в 0 (Ложь) — Windows NT авторизация разрешена.

Таблица 6.6. Возможные значения свойства туре объекта Login

Константа SQL-DMO Значение Описание

SQLDMOLogin_NTGroup 1 Имя пользователя SQL Server ссылается

на группу пользователей, определенную в Windows

SQLDMOLogin_NTUser О Имя пользователя SQL Server ссылается

на пользователя, созданного в Windows

SQLDMOLogin_Standard 2 Стандартный пользователь с SQL Server

авторизацией

В листинге 6.18 приведен пример создания нового пользователя SQL Server с именем "MAVCOMP\mav" и Windows NT авторизацией.

Листйиг6.18. Создание регистрационного имени пользователя

ННІІ^^ИІ^ННННЯНИнНІНЦІ^ВН^^Н^?ИН^ННННПИН^НІННННННПНІИННВІН^?НННІНННН—ИИ___ННІ—НННІ—I—

Login = Co3flaTb06beKT("SQLDM0.Login");

Login.Name = "MAVCOMPVnav";

Login.Type =

SQLServer.Logins.Add(Login) ;

Как следует из приведенного примера, добавление нового пользователя ПРОИЗВОДИТСЯ С ПОМОЩЬЮ Метода Add КОЛЛеКЦИИ Logins Объекта SQLServer.

Если свойство туре имеет значение 2 (SQLDMOLogin_Standard), то для пользователя можно установить пароль с помощью метода setPassword. Общий синтаксис данного метода следующий:

Login. SetPassword( "старый пароль ", "новый пароль").

_Примечание

Если ранее пароль не вводился, то в первом параметре указывается пустая строка.

Для удаления пользователя SQL-сервера в SQL-DMO предназначен метод Remove объекта User. Для удаления ранее созданного пользователя достаточно выполнить команду:

SQLServer.Logins("MAVCOMP\mav"),Remove().

Второй рассматриваемый объект DatabaseRole. Он предназначен для управления списком ролей базы данных. Microsoft SQL Server имеет ряд стандартных ролей, описанных в табл. 6.7.

Таблица 6.7. Список стандартных ролей Microsoft SQL Server

Имя роли

Db_owner

Db_accessadmin

Db_datareader

Db_datawriter

Db_ddladmin

Db_securityadmin

Db_ba ckupoperator Backs up the database

Db_denydatareader

Db_denydatawriter

Описание

Разрешены любые действия над базой данных

Разрешено добавление и удаление пользователей базы данных

Разрешено чтение любых таблиц

Разрешено вносить изменения в записи таблиц

Разрешен запуск DDL (Data Definition Language — язык определения данных) команд

Разрешена модификация прав и изменение ролей

Разрешено выполнение резервного копирования базы данных

Запрещено любое чтение данных из таблиц

Запрещено любое добавление, изменение или удаление записей в таблицах или представлениях

Помимо стандартных ролей SQL-сервер может иметь и роли приложений (Application Roles), которые в SQL-DMO можно создавать с помощью объекта DatabaseRoie.

Рассмотрим основные свойства объекта DatabaseRoie.

? Name — ИМЯ роли.

? AppRole — признак роли приложения. Свойство может принимать значение -1 (Истина) и о (Ложь).

Примечание_

Если свойство установлено в -1 (Истина), то для роли необходимо заполнить свойство Password.

? Password — пароль.

В листинге 6.19 приведен пример создания новой роли базы данных.

Листинг 6.19. Создание новой роли базы' данных Northwind

DbRole = СоздатьОбъект("SQLDMO.DatabaseRole”);

DbRole.Name = "AppRole";

DbRole.AppRole = -1;

DbRole.Password = "erpg_ru";

SQLServer.Databases("Northwind").DatabaseRoles.Add(DbRole);

Добавление новой роли производится с помощью метода Add коллекции DatabaseRoles объекта Database. Удаление роли происходит при помощи метода Remove объекта DatabaseRcie. Для удаления ранее созданной роли достаточно выполнить команду:

SQLServer.Databases("Northwind") .DatabaseRoles("AppRole”).Remove().

Для создания нового пользователя базы данных в SQL-DMO предназначен объект user. Объект user имеет следующие свойства:

П Name — имя пользователя;

? Login — регистрационное имя пользователя SQL Server;

П Role — имя роли пользователя.

В листинге 6.20 приведен пример создания нового пользователя с именем "МА?" базы Данных Northwind.

Листинг 6.20. Создание нового пользователя базы данных Northwind

-W-. ..ш . . ¦ ..LL’H’HH-- :________’.-..L 1 ... 1. : . | .' J

DbUser = СоздатьОбъект("SQLDMO.User");

DbUser.Name = "MAV" ;

DbUser.Login = "MAVCOMPVnav";

SQLServer.Databases("Northwind").Users.Add(DbUser);

Для удаления пользователя базы данных предназначен метод Remove объекта user. Для удаления ранее созданного пользователя достаточно выполнить команду:

SQLServer. Databases("Northwind") . Users("MAV") . Remove() .

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

В листинге 6.21 приведен пример установки прав для пользователя "ма?".

Листинг 6.21. Определение прав пользователя мма?" для базы данных Northwind

Database = SQLServer.Databases("Northwind");

// Установить права к базе данных Northwind

Database.Grant(128, "MAV");

// Установить права к таблице Customers

Database.Tables("Customers").Grant(63, "MAV");

// Установить права к представлению Invoices

Database.Views("Invoices").Grant(63, "MAV");

// Установить права к хранимой процедуре CustOrdersOrders

Database.StoredProcedures("CustOrdersOrders").Grant(16, "MAV");

В приведенном примере устанавливаются права доступа к таблице Customers, к представлению invoices, к хранимой процедуре CustOrdersOrders и к базе данных Northwind. Результат установки полного доступа к таблице customers для пользователя "ма?" приведен на рис. 6.1.

Рис. Установка полного доступа к таблице Customers

9 Зак. 722

Как видно из примера, приведенного в листинге 6.21, метод Grant имеет два параметра:

? номер разрешенных действий;

О имя пользователя базы данных.

Для разных объектов набор разрешенных действий различен.

В табл. 6.8 перечислены значения первого параметра метода Grant объекта Database.

Таблица 6.8. Возможные значения разрешенныхдействий

ДЛЯ объекта Da tabase

Константа SQL-DMO Значение Описание

SQLDKOPriv AllDatabasePrivs 130944

SQLDMOPrivCreateDatabase 256

SQLDMOPriv CreateDefault 4096

Разрешены любые действия пользователя над базой данных

Пользователю разрешено создание баз данных

Пользователю разрешено создание объекта default и выполнение команды CREATE DEFAULT

Разрешено создание пользовательских функций

Разрешено создание хранимых процедур

Разрешено создание ролей

Разрешено создание таблиц

Разрешено создание представлений

Разрешено создание резервных копий базы данных

Оставлено для совместимости с ранними версиями SQL-DMO

Разрешено создание резервных копий файла транзакций

65366

1024

16384

128

512

2048

32768

8192

SQLDMOPriv CreateFunction

SQLDMOPriv CreateProcedure

SQLDMOPriv_CreateRule

SQLDMOPriv_CreateTable SQLDMOPriv CreateView

SQLDMOPriv_DumpDatabase

SQLDMOPriv_DumpTable

SQLDMOPriv^DumpTransaction

В табл. 6.9 перечислены возможные значения разрешенных действий для объектов Table И View.

Таблица 6.9. Возможные значения разрешенных действий

для объектов Table И View

Константа SQL-DMO Значение Описание

SQLDM0Priv_A110bjectPrivs 63

SQLDMOPriv_Delete 3

SQLDMOPriv_Insert SQLDMOPriv References 32

SQLDMOPriv Select

SQLDMOPriv Update

Разрешены любые действия пользователя над таблицей или представлением

Разрешено удаление записей и использование оператора DELETE

Разрешена вставка записей и использование оператора INSERT

Разрешено создание связей между таблицами с помощью внешних ключей

Разрешена выборка данных с помощью оператора SELECT

Разрешено использование оператора UPDATE

В табл. 6.10 перечислены возможные значения разрешенных действий для объекта StoredProcedure.

Таблица 6.10. Возможные значения разрешенных действий

ДЛЯ объекта StoredProcedure
Константа SQL-DMO Значение Описание
SQLDMOPriv_A110bjectPrivs 63 Разрешены любые действия пользователя над хранимой процедурой
SQLDMOPriv Execute 16 Разрешен запуск хранимой процедуры
Для того чтобы отключить соответствующее право в SQL-DMO, предназначен метод Revoke, который по синтаксису аналогичен методу Grant.

В листинге 6.22 приведен программный код, отменяющий все установленные ранее (листинг 6.21) права.

f : pi, у: •. . •. X_ v . • ... . - gy . ' _ • -

I Листинг 6.22. Отмена установленных прав пользователя
:, ;р
і для базы данных Northwind
Database = SQLServer.Databases("Northwind") ;

// Отмена прав к базе данных Northwind

Database.Revoke(128, "MAV");

// Отмена прав к таблице Customers

Database.Tables("Customers").Revoke(63, "MAV");

// Отмена прав к представлению Invoices

Database.Views("Invoices").Revoke(63, "MAV");

// Отмена прав к хранимой процедуре CustOrdersOrders

Database.StoredProcedures("CustOrdersOrders").Revoke(16, "MAV");



Глава 7 Команды управления Windows, использующие rundll32

Понятие rundll32

Microsoft Windows имеет в своем составе утилиту командной строки Rundll32.exe, которая позволяет запускать некоторые команды, заложенные в DLL-файлах.

Данная утилита была разработана для внутреннего пользования программистами Microsoft. Однако богатые возможности этой программы дают повод использовать ее обычными программистами при разработке собственных приложений. Список команд, реализуемых Rundll32.exe, слишком обширен. Поэтому в данной главе будут приведены только наиболее значимые.

Для использования команд данной утилиты во встроенном языке системы "ІС:Предприятие" достаточно вызвать оператор запуститьПриложение, в параметре которого указать необходимую команду. Например, для открытия панели управления необходимо вызвать следующую команду:

ЗапуститьПриложение ("RunDLL32.EXE shell32.dll,Control_RunDLL").

При использовании команд l'lindll 32 следует учитывать следующие особенности.

? В разных версиях операционных систем имеется свой набор доступных команд, поэтому в данной главе, при указании команды, будут перечислены операционные системы, в которых она доступна.

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

? Почти все команды должны вводиться с учетом регистра.

Запуск элементов панели управления

С помощью утилиты і'ііпсПШ можно запускать элементы панели управления. Все команды, отвечающие за их запуск, находятся в модуле Control_RunDLL библиотеки sheU32.dlL

В табл. 7.1 приведены наиболее значимые команды, запускающие элементы панели управления.

Таблица 7.1. Команды rundll32, запускающие элементы панели управления

Описание команды Команда

RunDLL32 . EXE shell32.dll,Control_ RunDLL

RunDLL32. EXE shell32.dll,Control_ RunDLL access . c.pl , , 5

RunDLL32.EXE shel!32.dll,Control_ RunDLL access.cpl,,1

RunDLL32 . EXE shell32.dll,Control_ RunDLL

RunDLL32. EXE

shell32 . dll, Control RunDLL access.cpl,,2

Открывает диалог Специальные возможности на закладке Экран.

Доступна

в Windows 95/Э8/МE/NT4/2000/ХР/2003

Открывает диалог Специальные возможности на закладке Общие.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003

Открывает диалог Специальные возможности на закладке Клавиатура.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Открывает диалог Специальные возможности на закладке Мышь.

Доступна

в Windows 95/98/M E/NT4/2000/ХР/2003

Открывает диалог Специальные возможности на закладке Звук.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Открывает диалог Установка и удаление RundlL32 . EXE

программ на закладке Замена и удаление shell32 .dll, Control программ. RunDLL appwiz.cpl,,О

Доступна в Windows ХР/2003

Открывает диалог Установка и удаление RunDLL32. EXE программ на закладке Установка новой shell32. dll, Control_ программы. RunDLL appwiz. cpl,, 1

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Таблица 7.1 (продолжение)
Описание команды Команда
Открывает диалог Установка и удаление RunDL L32. EXE

программ на закладке Выбор программ по SheM32.dll, Control_

умолчанию. RunDLL appwiz.cpl,,3
Доступна в Windows XP

Открывает диалог Установка и удаление программ на закладке Добавление и удаление компонентов Windows.

Доступна

в Windows 95/98/M E/NT4/2000/ХР/2003

RunDLL32.ЕХЕ shell32. dll, Control_ RunDLL appwi z . cpl,,2

Установка панели управления из резервной

копии.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003

RunDLL32.EXE shell32.dll,Control FillCache RunDLL

Открыть Панель управления.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

RunDLL32.EXE shell32.dll,Control

ryUllUJJ JU

Открывает диалог Экран на закладке

Оформление.

Доступна в Windows 95/98/M E/NT4/2000/XP

Открывает диалог Экран на закладке Фон. Доступна в Windows 95/98/ME/NT4/2000/XP

RunDLL32.ЕХЕ shell32.dll,Control RunDLL desk, cpl , ,2

Открывает диалог Экран на закладке

Заставка.

Доступна

в Windows 95/98/M E/NT4/2000/ХР/2003

RunDLL32.EXE shell32.dll, Control RunDLL desk.cpl,,0

RunDLL32.EXE shell32.dll,Control RunDLL desk.cpl,,1

Открывает диалог Экран на закладке

Настройка.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003

RunDLL32.EXE

she1132.dll,Control

RunDLL desk.cpl,,3

Открывает диалог Экран на закладке Темы. Доступна в Windows 2003.........................

RunDLL32.EXE shell32.dll, Control RunDLL desk.cpl

Открывает диалог Экран на закладке Темы. Доступна в Windows XP

RunDLL32.EXE shell32. dllrControl RunDLL desk.cpl,,-1

ОТКРЫТЬ папку Шрифты.

Доступна

в Windows 95/98/ME/NT4/2000/ХР/2003
RunDLL32 . EXE

SHELL32.DLL,SHHelpShortcuts RunDLL FontsFolder
Таблица 7.1 (продолжение)
Описание команды Команда
Открыть папку Шрифты.

Доступна в Windows 95/98/МЕ
RunDLL32 . ЕХЕ shell32.dll,Control

RunDLL main . cpl @3
Открывает диалог Игровые устройства на закладке Контроллеры.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003
RunDLL32. EXE shell32.dll,Control

RunDLL joy. cpl
Открывает диалог Свойства системы на закладке Общие.

Доступна в Windows 95/98/ME/NT/2000/XP
RunDLL32.EXE shell32.dll,Control

RunDLL sysdm.cpl 01
Открывает программу Диспетчер устройств. Доступна в Windows 2000/XP/2003 RunDLL32.EXE devmgr.dll DeviceManager Execute
Открывает диалог Свойства обозревателя. Доступна

в Windows 95/98/M E/NT4/2000/XP/2003
RunDLL32 . EXE shell32.dll,Control

:cpl. cpl, , tt
Открывает диалог Свойства обозревателя RunDLL32 . EXE

назакладкеОбщие. shell32. dll, Control

л. RunDLL inetcpl. cpl, .O

Доступна ^ ’

в Windows 95/98/M E/NT4/2000/XP/2003
Открывает диалог Свойства обозревателя на закладке Конфиденциальность.

Доступна в Windows NT4/2000/XP/2003
RunDLL32.EXE shell32.dll, Control . unDLL inetcpl. cpl,,^
Открывает диалог Свойства обозревателя на закладке Безопасность.

Доступна в Windows NT4/2000/XP/2003
RunDLL32.EXE shell32.dll,Control

RunDLL inetcpl.cpl,,1
Открывает диалог Клавиатура на закладке

Я зыки и раскладки.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE shell32.dll,Control

RunDLL main.cpl @1,1
Открывает диалог Клавиатура на закладке

Скорость

Доступна в Windows 2000/XP/2003
RunDLL32.EXE shell32.dll,Control

RunDLL main.cpl @L
Открывает диалог Телефон и модем на закладке Модемы.

в Windows 95/98/M E/NT4/2000/XP/2003
RunDLL32.EXE

SHELL32 . DLL, Control_

RunDLL modem, cpl, , add

RunDLL32.EXE shell32.dll,Control

RunDLL modem.cpl
RunDLL32.EXE

SysDM.cpl,InstallDevice_

RunDLL Modem
Таблица 7.1 (продолжение)
Описание команды Команда
Открывает диалог Свойства мыши на закладке Кнопки мыши.

Доступна в Windows ШПГ/'ХРДООЗ
RunDLL32.EXE shell32.dll,Control_

RunDLL @0,0
Открывает диалог Свойства мыши на закладке Оборудование.

Доступна в Windows XP/2003
RunDLL32,EXE shell32.dll, Control

RunDLL main. cpl @0,4
Открывает диалог Свойства мыши на закладке Опции.

Доступна в Windows XP/2003
RunDLL32.EXE shell32 . dll, Control

RunDLL main.cpl @0,2
Открывает диалог Свойства мыши на закладке Указатели.

Доступна в Windows XP/2003
RunDLL32.EXE

shell32 . dll, Control

RunDLL main.cpl @0,1
Открывает диалог Свойства мыши на закладке Действия.

Доступна в Windows XP/2003
RunDLL32.EXE shel!32.dll,Control_

RunDLL main.cpl @0,3
Открывает диалог Звуки и мультимедиа на закладкеЗвуки.

Доступна в Windows 95/98/M E/NT4/2000
RunDLL32. EXE shell32.dll,Control

RunDLL mrnsys • cpl,, О
Открывает диалог Звуки и мультимедиа на закладке CD-ROM.

Доступна в Windows 95/98/M E/NT4
RunDLL32. EXE shell32 . dll, Control

RunDLL mmsys.cpl,,3
Открывает диалог Звуки и мультимедиа на закладке Устройства.

Доступна в Windows 95/98/M E/NT4
RuriDLL32 . EXE she 1132.dll,Control_

RunDLL mmsys.cpl, , 4
Открывает диалог Звуки и мультимедиа на закладке MIDI.

Доступна в Windows 95/98/M E/NT4
RunDLL32.EXE shell32.dll,Control_

RunDLL mmsys. cpl,, 2
Открывает диалог Звуки и мультимедиа на закладке Аудио.

Доступна в Windows 95/98/ME/NT4/2000
RunDLL32, EXE shell32.dll,Control_

~ isys . cpl, , 1
Открывает диалог Сетевые свойства.

Доступна в Windows 95/98/М Е
RunDLL32 - EXE shell32. vriJJ, J@ontrol_

RunDLL netcpl cpl
Открывает диалог Настройки ODBC источников данных.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003
RunDLL32.EXE shel.132 . dll, Control_

RunDLL odbccp32.cpl
Таблица7.1 (продолжение)
Описание команды Команда
Открывает диалог Пароли.

Доступна в Windows 95/98/М Е
RunDLL32.EXE =hell32. dll, Control-RunDLL password.cpI
Открывает диалог Свойства PCMCIA. Доступна в Windows 95/98/МЕ RunDLL32 . EXE shell32,dll, Control

RunDLL main.cpl @4
Открывает диалог Управление питанием

на закладке Схемы.

Доступна в Windows 95/98/ME/NT4/2000/XP
RunDLL32 . EXE

132. dll, Control

RunDLL powercfg.cpl
Открывает диалог Электропитание

на закладке Схемы.

Доступна в Windows NT4/2000/XP
RunDLL32.EXE shell32.dll,Control_ tunDLL ups.cpl
Открывает диалог Языки и стандарты на закладке Денежная единица.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003
RunDLL32.EXE shell32. dll, Control^

RunDLL inti.cpl,,2
Открывает диалог Язык и и стандарты на закладке Дата.

Доступна в Windows 95/98/M E/NT4/2000
RunDLL32.EXE shell32.dll,Control unDLL inti.cpl,,4
Открывает диалог Языки и стандарты на закладке Общие.

Доступна в Windows 95/98/ME/NT4/2000
RunDLL32.EXE shell32.dll,Control

RunDLL cpl, , О
Открывает диалог Языки и стандарты

на закладке Языки и раскладки.

Доступна в Windows 95/98/ME/NT4/2000
RunDLL32.EXE shell32.dll,Control_

RunDLL 5
Открывает диалог Языки и стандарты на закладке Числа.

Доступна

в Windows 95/98/ME/NT4/2000XP/2003
RunDLL32.EXE shell32.dll,Control

RunDLL inti.cpl,,i
Открывает диалог Языки и стандарты на закладке Время.

Доступна в Windows 95/98/M E/NT4/2000
RunDLL32.EXE shell32.dll, Control

RunDLL 3
Открывает диалог Звуки и мультимедиа. Доступна в Windows 95/98/M E/NT4 RunDLL32.EXE shell32 .dll, Control—

RunDLLitimsys . cpl @1
Открывает диалог Звуки и аудиоустройства

на з акл адке Аудио.

Доступна в Windows ХР/2003
RunDLL3 2 . EXE shell32.dll,Control

RunDLL itimsys. cpl,, 2
Команды управления Windows, использующие 267
Таблица 7.1 (продолжение)
Описание команды Команда
Открывает диалог Звуки и аудиоустройства на закладке Оборудование.

Доступна в Windows XP/2003
RunDLL32. EXE shell32 . dll, Control_ RunDLL ramsys.cpl,,4
Открывает диалог Звуки и аудиоустройства назакладкеЗвуки.

Доступна в Windows XP/2003
RunDLL32.EXE shell32.dll,Control RunDLL rnrnsys.cpl, , 1
Открывает диалог Звуки и аудиоустройства

на закладке Речь.

Доступна в Windows XP/2003
RunDLL32.EXE shell32.dll,Control_ RunDLL irntisys . cpl, , 3
Открывает диалог Звуки и аудиоустройства на закладке Громкость.

Доступна в Windows XP/200
RunDLL32.EXE shell32. dll, Control||jg RunDLL mmsys . cpl, , 0
Открывает диалог Свойства системы на закладке Дополнительно.

Доступна в Windows XP/2003
RunDLL32.EXE shell32 - dll, Control

RunDLL sysdm.cpl,,3
Открывает диалог Свойства системы на закладке Восстановление системы.

Доступна в Windows XP/2003
RunDLL32.EXE shell32.dll,Control^ RunDLL
Открывает диалог Свойства системы на закладке Автоматическое обновление.

Доступна в Windows XP
RunDLL32.EXE shell32. dll, Control-^ RunDLL sysdm.cpl,, 5
Открывает диалог Свойства системы на закладке Имя компьютера.

Доступна в Windows XP/2003
RunDLL32.EXE shell32. dll, Control . RunDLL sysdm.cpl,,1
Открывает диалог Свойства системы на закладке Общие.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003
RunDLL32. EXE shell32, dll, Control RunDLL sysdm. cpl,, 0
Открывает диалог Свойства системы на закладке Оборудование.

Доступна в Windows NT4/2000/XP/2003
RunDLL32.EXE shell32, dll, Controls RunDLL sysdm.cpi,,z
Открывает диалог Свойства системы на закладке Сетевая идентификация.

Доступна в Windows NT4/2000
RunDLL32.EXE shell32 . dll, Control . RunDLL sysdm.cpl,, 1
Открывает диалог Свойства системы на закладке Удаленное использование.

Доступна в Windows XP
RunDLL32 . EXE

shell32. dll, Control_ RunDLL sysdm.cpl,,6
Таблица 7.1 (окончание)
Описание команды Команда
Открывает диалог Свойства системы на закладке Удаленное использование.

Доступна в Windows 2003
RunDLL32.EXE shell32 .dll,Control

RunDLL sysdm.cpl,,5
Открывает диалог Свойства системы на закладке Дополнительно.

Доступна в Windows 2000/XP
RunDLL32.EXE shell32.dll, Control

RunDLL sysdm.cpl,,4
Открывает диалог Свойства системы на закладке Профили пользователей.

Доступна в Windows 95/98/M E/NT4/2000/XP
RunDLL32.EXE shell32 . dll, Control

RunDLL sysdm.cpl,,^
Открывает диалог Телефон и модем. Доступна

BWindows95/98/ME/NT4/2000/XP/2003
RunDLL32.EXE shell32.dll,Control

Lephon.cpl
Открывает диалог Темы в Windows 95/98 при установке Windows Plus.

Доступна в Windows 95/98/М Е
RunDLL32.EXE shell32.dll,Control

RunDLL themes.cpl
Открывает диалог Дата и время.

Доступна

в Windows 95/98/M E/NT4/2000/ХР/2003

Открывает диалог Дата и время на закладке Часовой пояс.

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003
RunDLL32. EXE shell32.dll,Control

RunDLL timeda cpr

RunDLL32.EXE shell32.dll,Control

RunDLL timedate.cpl,,/f
Открытие папки Сеть и Удаленный доступ к сети.

Доступна в Windows NT4/2000/XP/2003
RunDLL32.EXE shell32.dll,Control

RunDLL cpl
Как видно из табл. 7.1, многие команды имеют два параметра, разделенные запятой. Первый параметр обычно указывает на внутренний параметр модуля Control RunDLL, второй — номер закладки, которую необходимо открыть при открытии соответствующего элемента панели управления. Последний параметр можно опустить, при этом будет открыта закладка, использующаяся в диалоге по умолчанию.

В листинге 7.1 приведено несколько примеров запуска элементов панели управления.

пей япяд окаю №п вы

.......

Листинг 7.1. Запуск элементов панели управления

// Открывает диалог "Свойства системы" на закладке "Дополнительно"

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,Control_RunDLL sysdm.cpl,,4")

// Открываем диалог "Свойства системы" на закладке по умолчанию

ЗапуститьПриложение("RunDLL32.EXE shell32.dll,Control_RunDLL sysdm.cpl");

// Открывает диалог "Дата и время"

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,Control_RunDLL timedate.cpl"); ' ,

// Открывает диалог "Дата и время" на закладке "Часовой пояс"

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,Control_

RunDLL timedate.cpl,,/f");

// Открывает диалог "Свойства мыши"

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,Control_RunDLL main.cpl @0") ;

// Открывает диалог "Клавиатура”

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,Control_RunDLL main.cpl @1") ;

Запуск мастеров

При работе с операционной системой Microsoft Windows доступно множество мастеров, позволяющих облегчить выполнение различных действий, например, создание нового Dial-Up соединения, подключение сетевых дисков или настройка сети. Все доступные мастера находятся в различных библиотеках, поэтому общего правила их вызовов не существует.

В табл. 7.2 приведены команды запуска основных мастеров.

Таблица 7.2. Команды rundl!32, запускающие мастеров выполнения

различных действий
Описание команды Команда
Запуск мастера очистки рабочего стола. Доступна в Windows XP RunDLL32.EXE

FLDRCLNR.DLL,Wizard RunDLL
Запуск мастера создания нового Dial-Up-соединения. RunDLL32.EXE

RNAUI.DLL,RnaWiza rd
Доступна

в Windows 95/98/ME/NT4/2000XP
Запуск мастера установки сканера или цифровой камеры.

Доступна в Windows 95/98/МЕ/ХР
RunDLL32.EXE

SysDM.cpl,InstallDevice_

RunDLL

wiashext.dll,AddDeviceWasChosen
Таблица 7.2 (окончание)
Описание команды Команда
Запуск мастера добавления в сетевое окружение.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE

netplwiz.dll,AddNetPlaceRunDll
Запуск мастера подключения сетевых дисков.

Доступна в Windows 95/98/МЕ
RunDLL32.EXE

USER.DLL,wnetconnectdialog
Запуск мастера подключения сетевых дисков.

Доступна в Windows NT4/2000/XP/2003
RunDLL32.EXE

shell32.dll,SHHelpShortcuts

RunDLL Connect
Запуск мастера сетевой идентификации. Доступна в Windows 2000 RunDLL32.EXE

netplwiz.dll,NetAccWizRunDll
Запуск мастера настройки сети.

Доступна в Windows XP
RunDLL32.EXE hnet -

wiz.dll,HomeNetWizardRunDll
Запуск мастера новых подключений. Доступна в Windows XP/2003 RunDLL32.EXE net-shell .dll,StartNCW
Запуск мастера установки нового принтера. Доступна

в Windows 95/98/ME/NT4/2000/XP
RunDLL32.EXE

SHELL32.DLL,SHHelpShortcuts

RunDLL AddPrinter
RunDLL32.EXE RunDLL32

SysDM.cpl,InstallDevice

RunDLL Printer,,0
Запуск мастера добавления стандартного TCP/IP-порта принтеров. RunDLL32.EXE tcpmo-nui.dll,LocalAddPortUI
Доступна в Windows 2000
В листинге 7.2 приведено несколько примеров запуска различных ма-стеров.

¦ниинмишннпи

Листинг 7.2. Запуск мастеров

L.- ----------------.—....------.к...

// Запуск мастера создания нового Dial-Up-соеданения ЗапуститьПриложение("RunDLL32.EXE RNAUI.DLL,RnaWizard");

// Запуск мастера новых подключений

ЗапуститьПриложение("RunDLL32.EXE netshell.dll,StartNCW");

// Запуск мастера установки нового принтера

ЗапуститьПриложение("RunDLL32.EXE SHELL32.DLL,SHHelpShortcuts RunDLL AddPrinter");

Работа с сетью И нтернет

В операционной системе Microsoft Windows существуют множество возможностей работы с сетью Интернет, небольшую часть которых можно использовать через утилиту ітіікі1132.

В табл. 7.3 приведены команды, работающие с интернет-технологиями.

Таблица 7.3. Команды rundll32, работающие с интернет-технологиями

Описание команды Команда

RunDLL32.EXE Rnaui.dll,RnaDial ConnectionName

Установка соединения с Dial-Up-соединением, с именем, указанным в параметре ConnectionName.

Доступна в Windows 95/98/M E/NT4/2000/XP

Открывает специальные интернет-каналы, где RunDLL3 2 . EXE

параметр %1 — полный путь к файлу CDF. cdfview.dll,OpenChannel %1

Доступна

в Windows 95/98/M E/NT4/2000/XP/2003

RunDLL32.EXE

"%ProgramFiles%\

Internet Explorer\

hmmapi.dll",OpenlnboxHandler

Открывает Internet Explorer на странице авторизации почтового ящика HotMail.

Доступна

в Windows 95/98/M E/NT4/2000/ХР/2003

Открывает диалог Восстановления настроек

Internet Explorer. Поддерживается в Internet Explorer версий 5 и 6.

Доступна в Windows 95/98/M E/NT4/2000/XP

RunDLL32.EXE setupwbv.dll, IE5Maintenance "С:\

Program FilesXInternet Explorer\setup\

SETUP.EXE" /д "%SystemRoot%\ IE

Открывает подписку на специальный интер- BunDLL32 , EXE

нет-канал, путь к СВА-файлу которого опре- cdfview. dll, Subscribe %1

деляется в параметре

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Создание нового письма адресату, указан- RunDLL32 . EXE url. dll, ному в параметре %1. При этом запускается MailToProtocolHandler %1

почтовая программа, используемая в системе по умолчанию.

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Открытие программы чтения групп новостей, RunDLL32.EXE url .dll, имя сервера указывается в параметре %1. NewsProtocolHandler %і

Доступна

в Windows 95/98/ME/NT4/2000/XP/2003

Таблица 7.3 (окончание)

Описание команды Команда

Запуск интернет-ресурса с адресом, RunDLL32.EXE url.dll,

указанном в параметре FileProtocolHandler %1

Доступна

в Windows 95/98/МE/NT4/20Q0/XP/2003

RunDLL32.EXE mshtinl.dll, PrintHTML

"HtmlFileNameAndPath"

Открытие диалога печати HTML-документа с именем HtmlFileNameAndPath.

Доступна

в Windows 95/98/М E/NT4/2000/ХР/2003

Установить соединение по Telnet-адресу, Run DLL 3 2 . EXE ur 1. dl 1,

указанному в параметре %1. TelnetProtocolHandler %\

Доступна

в Windows 95/98/М E/NT4/2000/ХР/2003

В листинге 7.3 приведено несколько примеров использования интернет-технологий.

ІЩЩ1Р1ЩІІРЩ

Листинг 7.3.

L—-----------------------

--------------.---т'-тт-'.тг.ттп’------.т-р.—-.¦ртр-т-."—-------------- •

шянпшинм

Работа с

Интернетом

// Создание нового письма автору

ЗапуститьПриложение("RunDLL32.EXE url.dll,MailToProtocolHandler ");

// Запуск интернет-страницы автора

ЗапуститьПриложение("RunDLL32.EXE url.dll,FileProtocolHandler ");

// Распечатать заглавную страницу форума автора

Запустить Приложение ("RunDLL32 . ЕХЕ mshtml. dll, PrintHTML """"");

Установка и удаление принтера

С помощью шпсІІШ можно автоматически установить или удалить принтер. Для этих целей используется команда:

rundll32 printui.dll,PrintUIEntry [параметры] [@командный файл].

Примечание

Данная команда доступна только в операционных системах Windows 2000/ХР/2003,

Рассмотрим возможные параметры данной команды.

П /а [файл] — имя двоичного файла;

О /Ь[имя] — основное имя принтера;

П /с [имя] — UNC-имя компьютера, где выполняется команда;

П /dl — удаление локального принтера;

П /dn — удаление подключения к сетевому принтеру;

П /dd — удаление драйвера принтера;

П /е — вывод параметров настройки печати;

П /Цфайл] — информационный или выходной файл;

/да — добавление подключений компьютеров к принтеру;

П /де — перечисление подключений компьютеров к принтеру;

П /gd — удаление подключений компьютеров к принтеру;

П /h[apx] — архитектура драйвераAlpha|Intel|Mips|PowerPC;

П іа — установка драйвера принтера с помощью информационного файла;

П /id — установка драйвера принтера с помощью мастера установки драйверов принтеров;

П /if — установка принтера с помощью информационного файла;

П /ii — установка принтера с помощью мастера установки принтеров и информационного файла;

П — установка принтера с помощью мастера установки принтеров;

П /in — добавление подключения к принтеру;

О /j [имя] — имя системы печати;

П /к — печать пробной страницы на выбранном принтере (не может использоваться с другими командами установки принтера);

Л /1 [путь] — путь к исходному размещению драйвера принтера;

П /т [модель ] — имя модели драйвера принтера;

П /п[имя] — имя принтера;

О /о — показать очередь заданий на печать;

П /р — отображение свойств принтера;

П /q — скрытый режим без вывода сообщений об ошибках;

П /г [порт] — имя порта;

П /s — показать свойства сервера;

П /ss — запись параметров принтера в файл;

П /sr — чтение параметров принтера из файла, при этом флаги, используемые при записи или чтении параметров принтера и помещаемые в конце команды, могут принимать значения:

• с — профиль цвета;

• d — данные принтера;

• s — дескриптор безопасности;

• g — глобальный режим;

• — минимальный набор параметров;

• и — пользовательский режим;

• г — разрешить конфликты имен;

• f — принудительное использование имени;

• р — сопоставить порт;

? /и — использовать существующий драйвер принтера, если он установлен; О [номер] — номер начальной страницы (с нуля);

П /?[ версия] —версия драйвера;

П /w — запрос драйвера у пользователя, если драйвер не найден в INF-файле; П /у назначить принтер используемым по умолчанию;

П /хд — получить параметры принтера;

П — установить параметры принтера;

П /z — не разрешать автоматический общий доступ к этому принтеру;

0 /z — общий доступ к принтеру, используется только вместе с параметром / if. П @ командный файл — файл аргументов командной строки.

В листинге 7.4 приведено несколько примеров работы с принтером.

: "'ш; д* ......... “"wjSSri

1 Листинг 7.4. Работа с принтером.,, г.: ?,:-.НН:і:;!іИ'Ші ?гФ j

ЁЁйлд^шііім^Інгй&жбиівдІЛНВИНІПБЛІНІІ^ИЯВюЛкібБйШ! Us Ш 1 Si JIl if- sSsfinSy j_—-. ...-a. jJkJ— // З апуск свойств сервера

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /s /tl /nWmachine") ;

// З апуск свойств принтера

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /p /n\\mach±ne\printer");

// Локальный запуск мастера установки принтеров

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /іі");

// Запуск мастера установки принтеров на компьютере \\ma chine

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /il /c\\machine") ;

// Запуск показа очереди

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /о /n\\machine\printer") ;

// Запуск установки с помощью информационного файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /if / b ""Test Printer"" /f %windir%\inf\ntprint.inf /r ""lptl:"" / m ""AGFA-AccuSet v52.3""");

n Запуск мастера установки принтеров с помощью информационного файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /іі /f %windir%\inf\ntprint.inf");

// Добавление подключений компьютеров к принтеру

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /да /cWmachine /n\\machine\printer /j""LanMan Print Services""");

// Удаление подключений компьютеров к принтеру

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /gd /cWmachine /n\\machine\printer");

// Перечисление подключений компьютеров к принтеру

ЗапуститьПриложение("rundll32 printui.dll, PrintUIEntry /ge /cWmachine");

// Добавление драйвера принтера с помощью информационного файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /ia /cWmachine /m ""AGFA-AccuSet v52.3"" /h ""Intel"" /v ""Windows 2000"" /f %win-dir%\inf\ntprint.inf");

// Удаление драйвера принтера

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /dd /cWmachine /m ""AGFA-AccuSet v52.3"" /h ""Intel"" /v ""Windows 2000""");

// Назначение принтера используемым по умолчанию

ЗапуститьПриложение("rundll32 printui.dll, PrintUIEntry /у /n ""printer""");

// Указание описания принтера

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Xs /n ""printer""

comment ""My Cool Printer......

// Получение параметров принтера

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Xg /n ""printer""");

// Получение параметров принтера и запись их в файл

ЗапуститьПриложение("rundl132 printui.dll, PrintUIEntry /f ""results.txt"" /Xg /n ""printer""");

// Справка об установке параметров принтера:

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Xs /n ""printer"" ?") ;

// Запись всех параметров принтера в файл

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Ss /n ""printer"" /a ""file.dat""");

// Чтение всех параметров принтера из файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUI /Sr /п ""printer"" /а ""file.dat""");

// Запись сведений принтера уровня 2 в файл

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Ss /n ""printer"" /a ""file.dat"" 2");

// Восстановление дескриптора безопасности из файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Sr /n ""printer"" /a ""file.dat"" s");

// Восстановление глобального devmode и данных принтера из файла

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Sr /n ""printer"" /a ""file.dat"" g d");

// Восстановление набора параметров из файла и разрешение имени порта

ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry /Sr /n ""printer"" /a ""file.dat"" m p");

// Выполнение команды, описанной во внешнем файле coinmand.txt ЗапуститьПриложение("rundll32 printui.dll,PrintUIEntry @command.txt");

Прочие команды

Помимо перечисленных ранее команд в Windows существуют и другие, которые не поддаются классификации. Например, команды, отвечающие за работу с папкой Портфель, команды открытия файлов, блокировки компьютера и др. Команды этого типа перечислены в табл. 7.4.

Таблица 7.4. Прочие команды rundll32

Описание команды Команда

Установить каскадное расположение окон RunDLL3 2 . EXE приложений на рабочем столе. USER. DLL, cascadechild

Доступна в Windows 95/98/ME

Установить расположение окон приложе- RunDLL32 . ЕХЕ ний на рабочем столе в виде заголовков. USER. DLL, tilechild

Доступна в Windows 95/98/ME

Создать новую папку Портфель, если эта RunDLL32. ЕХЕ

функция установлена в системе. SYNCUI . DLL, Briefcase_create

Доступна

в Windows 95/98/ME/NT4/2000/XP

RunDLL32.ЕХЕ

syncui.dll,Briefcase_Intro

Запустить заглавную страницу папки

Портфель.

Доступна

вWindows95/98/ME/NT4/2000/XP

Таблица 7.4 (продолжение)
Описание команды Команда
Открыть окно Порты панели управления. Доступна в Windows NT4 RunDLL32.EXE shell32.dll,Control_

RunDLL ports.cpl
Переключить разрешение экрана. Параметры:

RunDLL32.EXE DESKCP16.DLL,QUICKRES

RUNDLLENTRY HxVxR
н — горизонтальное разрешение, например, 640, 800 и т. п.;

? — вертикальное разрешение, например, 480, 600 и т. п.;

R — глубина цвета, например,

8 (256 цветов), 16, 32 и т. п.

Доступна в Windows 95/98/МЕ

Запуск программы копирования дискет.

Доступна

в Windows 95/98/ME/NT4/2000/XP

RunDLL32.EXE

DISKCOPY.DLL,DiskCopyRunDll

Запуск программы форматирования RunDLL32 . EXE

дискеты. SHELL32.DLL,SHFormatDrive

Доступна

в Windows 95/98/ME/NT4/2000/XP

Перерисовка (обновление) экрана. Доступна в Windows 95/98/ME

Открытие DUN-сервера.

Доступна в Windows 95/98/МЕ

RunDLL32 . EXE

USER. DLL, repaintscreen

RunDLL32.EXE rnaserv.dll,CallerAccess

Запуск программы быстрого поиска RunDLL32 , EXE

(еслиустановлена). shell32 . dll, Control_

_ RunDLL findfast.cpl

Доступна

вWindows 95/98/M E/NT4/2000/XP

Запуск диалога открытия файла с именем RunDLL32 . EXE FileName. SHELL32.DLL,OpenAs

RunDLL FileName

Доступна

в Windows 95/98/M E/NT4/2000/XP/2003
Открывает диалог Отключение и извлечение аппаратного устройства.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE shell32. dll, Control_

RunDLL hotplug.dll
Открывает диалог Упорядочить избранное. Доступна

в Windows 95/98/ME/NT4/2000/XP/2003
RunDLL32.EXE

shdocvw.dll,DoOrganizeFavDlg
Таблица 7.4 (продолжение)
Описание команды Команда
Отключение клавиатуры.

Доступна в Windows 95/98/М Е
RunDLL32.EXE KEYBOARD, disable
Открывает Microsoft Exchange профиль. flocTyAWAdowsQAe/ME

RunDLL32.EXE зЬе1132.dll,Control RunDLL ralctg32.cpl
Открывает Microsoft Postoffice Workgroup Admin

RunDLL32.EXE shell32.dll,Control RunDLL wgpocpl ,cpl _

Доступна в Windows 95/98/ME

Установка времени двойного щелчка мыши. RunDLL32.EXE USER. DLL, Значение Value указывается SetDoubleClickTime Value

в миллисекундах.

Доступна в Windows 95/98/ME

Переключает левую и правую кнопки мыши. RunDLL32 . ЕХЕ

Доступна в Windows 95/98/ME USER . DLL, SwapMouseButton

Переключает левую и правую кнопки мыши. RunDLL32 . ЕХЕ

Доступна в Windows NT4 UcukcL . DLL ,SwapMouseButton

Запуск диалога отключения RunDLL32.EXE EFSER.DLL,

отприсоединенного сетевого диска. wnetdisconnectdialog

Доступна в Windows 95/98/ME

RunDLL32.EXE shell32.dll, SHHelpShortcuts_

RunDLL Disconnect

RunDLL32.EXE shell32.dll,Control RunDLL srvmgr.cpl

Запуск диалога отключения от присоединенного сетевого диска. Доступна в Windows NT4/2000/XP/2003

Запустить программу "Управление сервером".

Доступна в Windows NT4

Открыть диалог создания нового общего RunDLL32 . EXE

ресурса. NTLANUI. DLL, ShareCreate

Доступна в Windows NT4/2000/XP/2003

Открыть диалог общих папок. RunDLL32 . EXE

Доступна в Windows NT4/2000/XP/2003 NTLANUI. DLL, ShareManage

Открытие диалога создания ярлыка для RunDLL32.EXE AppWiz . Cpl, файла, указанного в параметре 41. NewLinkHere %1

Доступна

в Windows 95/98/М Е/NT4/2000/Х Р/2003

Запуск программы TweakEFl, если она RunDLL32. EXE

установлена в системе. shell32.dll, Control_RunDLL

Доступна в Windows 95/98/ME/NT4 tweakui. CP1

Таблица7.4 (окончание)
Описание команды Команда
Открыть файл с изображением, имя которого передано в параметре %1, в программе просмотра изображений и факсов. Доступна в Windows XP/2003 RunDLL32.EXE %SystemRoot%\ System32\shimgvw.dll,

ImageView Fullscreen %1
Открытие диалога О программе.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE SHELL32 . DLL ,

ShellAboutW

RunDLL32.EXE SHELL32.DLL,

ShellAboutA
Открытие диалога Применить системные

настройки для перезагрузки или выключения компьютера.

Доступна в Windows
RunDLL32.EXE SHELL.DLL, RestartDialog
Открыть файл, переданный в параметре % 1, в зарегистрированном для него приложении.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE shell32.dll, ShellExec RunDLL %1
Открыть диалог Заблокировать компьютер, вызываемый при нажатии комбинации клавиш ++.

Доступна в Windows 2000/XP/2003
RunDLL32.EXE USer32.dll, LockWorkStation
В листинге 7.5 приведены примеры rundll32. использования различных команд
і Листинг 7.5. Прочие команды rundll32 ши
// Открытие диалога выбора программы для открытия файла boot.ini

ЗапуститьПриложение("RunDLL32.EXE SHELL32.DLL,OpenAs_RunDLL ' c:\boot.ini");
// Открывает диалог "Отключение и извлечение аппаратного устройства"

ЗапуститьПриложение("RunDLL32.EXE shell32.dll,Control_RunDLL hot-plug. dll");

// Открыть изображение в программе просмотра изображений и факсов

// Открыть файл booklc.doc в зарегистрированном для DOC-файлов приложении

ЗапуститьПриложение("RunDLL32.ЕХЕ shell32.dll,ShellExec_RunDLL с:\booklc.doc");

// Заблокировать компьютер

ЗапуститьПриложение("RunDLL32.ЕХЕ user32.dll,LockWorkStation");





Глава 8 Интернет-технологии

Работа с электронной почтой

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

Чтобы эффективно решить задачу доступа к электронной почте, пользователю, в своей программе, необходимо понять основы ее устройства. Электронная почта представляет собой совокупность протоколов, регламентирующих обмен данными по сети, а также программных средств, реализующих эти протоколы и предоставляющих пользователю соответствующие интерфейсы. Основными протоколами являются протоколы передачи (отсылки) и чтения писем, которые работают поверх TCP/IP (Transmission Control Protocol/ Internet Protocol — протокол управления передачей данных Интернет). Для передачи сообщений по TCP-соединению подавляющее большинство программных средств пользуется протоколом SMTP (Simple Mail Transfer Protocol). Для приема почтовых сообщений в Интернете обычно используется протокол РОРЗ (Post Office Protocol 3).

Непосредственное использование в конфигурациях системы ''1С:Предприятие" команд протоколов SMTP и РОРЗ не представляется возможным. В связи с этим для работы с электронной почтой будут использоваться средства более высокого уровня (внешние компоненты, приложения и стандартные объекты системы).

Использование команды mailto

Самый простой способ подготовить письмо для отправки — это просто открыть окно создания нового письма почтового клиента, используемого в системе по умолчанию, воспользовавшись при этом системной командой mailto: (ЛИСТИНГ 8.1).

і Листинг 8.1. Создание нового сообщения через почтового клиента

И Открывает окно нового сообщения с заполненными полями // ’’Кому1", "Тема" и "Текст сообщения”.

ЗапуститьПриложение("mailto:mav@erpg.ru;boss§erpg.ru?subject= Пример%20темы&ЬосІу=Здавствуйте! %0сЩоступ%20открыт. ") ;

// Открывает окно нового сообщения с заполненным адресом получателя

ЗапуститьПриложение("");

// Открывает окно нового сообщения с заполненным адресом получателя и полями "Копия" и "Скрытая копия"

ЗапуститьПриложение("mailto:mav@erpg.ru?subject=npnMep%20TeMbi&cc= erpg§erpg.ru&bcc=");

Синтаксис команды mailto:

mailto :?subject=&cc=&bcc=?&body= <Текст>. Рассмотрим параметры команды:

П subject — тема (заголовок) письма;

О с с — строка с адресами электронной почты, перечисленными через точку с запятой, указывающая адресатов копии сообщения;

О Ьсс — строка с адресами электронной почты, перечисленными через точку с запятой, указывающая адресатов скрытой копии сообщения;

П body — текст сообщения без пробелов и знаков переноса строк.

^ЦВнимание^І

Обратите внимание, что текст, следующий после команды mailto:, должен быть без пробелов. Для указания пробела в тексте используется метка <,-2 0, а для указания символа переноса строки — sOd.

Использование интерфейса MAPI

Для совместимости и стандартизации программного доступа к приложениям, которые работают с электронной почтой, Microsoft разработала набор интерфейсов, называемых MAPI (Messaging Application Program Interface). Архитектура MAPI описывает так называемую подсистему MAPI, которая обеспечивает взаимодействие клиентских приложений с различными службами почтовой системы, такими как служба хранения информации, транспортная служба и т. д. Все почтовые клиенты, которые предназначены для функционирования в операционной системе Microsoft Windows, должны поддерживать интерфейсы MAPI. С другой стороны, MAPI — это прикладной интерфейс, который был создан для того, чтобы разработчики на раз-

личных языках программирования, в том числе и на встроенном языке системы "1С:Предприятие", имели бы возможность добавлять в свои приложения функцию для работы с электронной почтой. С точки зрения прикладной программы, подсистема MAPI — это набор динамических библиотек, содержащих функции и объектно-ориентированные интерфейсы, благодаря которым взаимодействуют клиентские и серверные части почтовых приложений. Это значит, что, если в системе функционирует почтовый клиент, совместимый с MAPI (а их подавляющее большинство), то можно обратиться к нему через MAPI-интерфейс посредством некоторых вызовов и выполнить нужные операции, например, сформировать и отправить письмо. При этом пользователь обращается к почтовому клиенту, используемому в системе по умолчанию, и всего лишь "поручает" ему выполнить необходимые действия. Как он это сделает, зависит лишь от его настроек. Отсюда возникают и минусы, и плюсы.

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

Плюсы состоят в том, что всегда можно найти отправленное системой письмо в папке Исходящие или Отправленные, а полученное — в папке Входящие почтового клиента. При этом не нужно заботиться о подключении к Интернету (почтовый клиент сам все отправит при первом подключении).

Корпорация Microsoft поставляет элемент управления MSMAPI32.OCX, содержащий простые компоненты ActiveX, позволяющие работать с MAPI из среды любых языков программирования, поддерживающих OLE-автоматизацию. ActiveX содержит два объекта: MAPI Session и MAPlMessage. MAPisession отвечает за установление и окончание сеанса связи с провайдером Интернета. Его функции и свойства позволяют задать параметры установления соединения, а затем, при необходимости, разорвать его. MAPiMessages предоставляет функции и свойства для работы с почтовыми сообщениями.

Оба объекта можно создать в конфигурации системы "1С:Предприятие". Для версии 7.7 — используется функция СоздатьОбъект, а для версии 8.0 —

Новый СОМОбъект.

Для инициализации сеанса связи (сессии) необходимо вызвать функцию signOn объекта MAPisession, а для того чтобы использовать объект MAPiMessages, нужно связать его С объектом MAPISession (ЛИСТИНГ 8.2). Для завершения сессии вызывается функция signoff объекта MAPisession.

MessageCtrl = СоздатьОбъект("MSMAPI.MAPIMessages");

// Задаем имя пользователя

SessionCtrl.UserName = "MyName";

// Задаем пароль пользователя

SessionCtrl.Password = "MyPassword";

// Открываем сессию

SessionCtrl.SignOn();

// Связываем элементы управления, используя идентификатор сессии

MessageCtrl.SessionID = SessionCtrl.SessionID;

//

// Закрываем сессию

SessionCtrl.SignOff();

Свойства UserName и Password объекта MAPISession задают имя профиля и пароль доступа к нему, если в качестве почтовой системы используется Microsoft Mail. Если же применяется Microsoft Outlook, эти свойства ни на что не влияют, а в качестве активной учетной записи используется учетная запись, выставленная по умолчанию.

Для чтения входящих писем используется метод Fetch, после вызова которого заполняется коллекция сообщений объекта MAPIMessages. После заполнения коллекции переменная MessageCtrl содержит письмо с индексом, который определяется свойством Msglndex.

В листинге 8.3 приведен пример вывода содержания писем, находящихся в папке Входящие.

сем через интерфейс MAPI

Листинг 8.3. Чтение входящих

¦НМММЯПНПМННВНЯННІ

// Элемент управления Session

SessionCtrl = СоздатьОбъект("MSMAPI.MAPISession");

// Элемент управления Messages

MessageCtrl = СоздатьОбъект("MSMAPI.MAPIMessages");

// Открываем сессию

SessionCtrl.SignOn();

// Связываем элементы управления, используя идентификатор сессии

MessageCtrl.SessionID = SessionCtrl.SessionID;.

// Выбирать для отображения все почтовые сообщения.

// Если вы хотите отображать только непрочитанные сообщения,

// нужно присвоить свойству FetchUnreadOnly значение -1 (Истина)

.285

MessageCtrl.FetchUnreadOnly =0; // Ложь // Выбрать письма MessageCtrl.Fetch();

Для Ном = 0 по MessageCtrl.MsgCount - 1 Цикл // Установить индекс для сообщения MessageCtrl.Msglndex = Ном;

// Сформировать текст из темы и тела почтового сообщения

ТекстПисьма = "Тема: ” + MessageCtrl .MsgSubjecc + "Текст: +

MessageCtrl.MsgNoteText;

Сообщить(ТекстПисьма);

КонецЦикла;

// Закрываем сессию

SessionCtrl.SignOff();

С помощью данного кода будет получен список всех тем и текстов писем из папки Входящие. Свойства MsgSubject И MsgNoteText объекта MAPiMessages возвращают тему и содержание письма. Возможно получить доступ и к другой информации, заложенной в письмах. Например, для вывода имени и электронного адреса отправителя можно использовать свойства MsgOrigDisplayName И MsgOrigAddress соответственно, СВОЙСТВО MsgDateReceived будет содержать дату получения письма.

Для создания письма снова используется объект MAPIMessages. Перед отправкой нужно задать несколько необходимых параметров и, если нужно, присоединить файлы (листинг 8.4).

р-----------¦------------------г—.....................-.....-.........—.....—..........................-"Г,- •

j Листинг 8.4. Отправка письма через интерфейс MAPI

I. .__________.__________________________________________________ іі ___________1_____________________ііііі. 1

// Элемент управления Session

SessionCtrl = СоздатьОбъект("MSMAPI.MAPISession");

// Элемент управления Messages

MessageCtrl = СоздатьОбъект("MSMAPI.MAPiMessages");

// Открываем сессию

SessionCtrl.SignOn();

// Связываем элементы управления, используя идентификатор сессии

MessageCtrl.SessionID = SessionCtrl.SessionID;

// Подготовиться к отправке сообщения

MessageCtrl.Compose();

И Установить e-mail получателя

MessageCtrl.RecipAddress = "";

// Установить тему сообщения

MessageCtrl .MsgSubject = "Заголовок тестового письма"; // З аполнить тело сообщения

MessageCtrl.MsgNoteText = "Это тестовое письмо";

// Присоединяем к письму два файла

MessageCtrl.AttachmentIndex = 0;

MessageCtrl.AttachmentPathName = ("C:\filel.txt”);

MessageCtrl.Attachmentlndex = 1;

MessageCtrl.AttachmentPathName ~ ( ”0:\f .i le2 . txt" ) ;

/ / Отправить без отображения стандартного диалога отправки сообщения

MessageCtrl.Send(0);

// З акрываем сессию

SessionCtrl.SignOff() ;

Примечание_^

Указывая в качестве параметра метода send значение "Истина" (-1), можно разрешить показ окна Создание нового письма.

Использование компоненты V7Plus.dll

Внешняя компонента V7Plus.dll состоит из четырех объектов: ?7маі1, V7SysInfo, V7HttpReader И XMLParser.

_Примечание

В данной главе будет рассматривается только объект работы с электронной почтой — ?7МаіІ, который позволяет работать с любым почтовым клиентом, работающим через MAPI (например, Microsoft Outlook Express или Microsoft Outlook).

Инициализация внешней компоненты осуществляется с помощью метода ЗагрузитьВнешнююКомпоненту("V7Plus.dll"), а для доступа к свойствам и методам объекта необходимо вызвать функцию СоздатьОбъект ("Addin. ?7Маі1"), которая возвращает ссылку на объект WMail.

Рассмотрим общий алгоритм получения писем:

1. Установка соединения с помощью метода подключиться.

287

2. Инициализация процесса приема сообщений с помощью метода ВыбратьСообщения.

3. Организация цикла получения сообщений с помощью метода ПолучитьСообщение.

4. С ПОМОЩЬЮ методов ПрочйтатьСообщение И ПолучитьФайл МОЖНО ПОЛучить доступ к тексту сообщения и присоединенным файлам.

5. С помощью свойств заголовок и Текст можно получить доступ к заголовку сообщения и его тексту.

6. Завершение работы с почтой происходит с помощью метода Отключиться.

Пример реализации данного алгоритма приведен в листинге 8.5.

имиааикияк

¦ ¦ . . і'И ІЯ ¦: : , , , ,

Листинг 8.5. Чтение входящих писем через компоненту V7PIUS.all

¦ПИ HwBBB Ни

_________ .... . ; ... ..... Щ ..

Jiepei.i Путь, ИмяФайла;

// Загрузка компоненты V /Plus.сП!

ЗагрузитьВнешнююКомпоненту("?7 Plus.dll");

Почта = СоздатьОбъект("Addin.?7Маі1");

ТекстДок=Создать0бъект("Текст");

// Инициализируем сеанс работы с почтой в соответствии

выбранным на закладке свойств компоненты типом почты и параметрами подключения

Почта.Подключиться();

// Инициализируем процесс получения сообщений

Почта.ВыбратьСообщения();

Пока Почта,ПолучитьСообщение() = 1 Цикл

// Получаем адрес, с которого было отправлено сообщение АдресОтправителя=Почта. ДцресОтправителя();

// Тема сообщения Заголовок=Почта.Заголовок;

// Получаем содержимое сообщения (текст и присоединенные файлы)

Почта.ПрочйтатьСообщение(0) ;

// Текст сообщения

Текст=Почта.Текст;

// Получить имя и каталог следующего присоединенного файла сообщения Пока Почта.ПолучитьФайл(Путь, ИмяФайла) = 1 Цикл ТекстДок.Открыть(Путь+ИмяФайла);

ТекстДок.ТолыхоПросмотр(1);

ТекстДок.Показать(Заголовок);

КонецЦикла;

КонецЦикла;

// Завершает сеанс работы с почтой

Почта.Отключить ся(); .

Алгоритм отправки сообщения будет состоять из следующих шагов.

1. Установка соединения с помощью метода подключиться.

2. Инициализация процесса создания нового сообщения с помощью метода

НовоеСообщение.

3. С помощью метода ДобавитьАдрес можно задать один или несколько адресов получателей.

4. С помощью метода добавитьФайл можно прикрепить один или несколько файлов к сообщению.

5. С помощью свойств Заголовок и текст можно задать заголовок сообщения и его текст.

6. Отправка сообщения происходит посредством вызова метода послать.

7. Завершение работы с почтой происходит с помощью метода Отключиться.

В листинге 8.6 приведен пример отправки сообщения с помощью компоненты V7Plus.dll.

Листинг 8.6. Отправка письма через компоненту V7Plus.dll

// Загрузка компоненты V7Plus.dll

ЗагрузитьВнешнююКомпоненту("V7 Plus.dll");

Почта = СоздатьОбъект("Addin.V7Mail") ;

// Метод Подключиться инициализирует сеанс работы с почтой MAPI // с соответствующими параметрами подключения и паролем.

Почта. Подключить ся ("МАР Г',"",

// Инициализируем создание нового сообщения

Почта.НовоеСообщение();

// Добавляем адрес в список адресов получателей

Почта.ДобавитьАдрес("");

// Добавляем имя нового файла в список присоединенных файлов сообщения

Почта.ДобавитьФайл("C:\file.txt”);

// Тема сообщения

Почта.Заголовокъ "Привет!”;

// Текст сообщения

Почта.Текст="Добрый день! Жду результатов совещания.";

// Отправить сообщение

Почта.Послать () ;

// Завершает сеанс работы с почтой

Почта.Отключиться();

Примечание

Подробное описание всех методов и свойств объекта ?7маіі можно найти в документации к компоненте.

Так как объект WMail компоненты V7Plus.dll работает через интерфейс MAPI, то при работе с ней сохраняются все особенности — плюсы и минусы использования интерфейса MAPI, которые были описаны ранее.

Использование компоненты Rom-Mail.dll

Все вышеописанные методы интеграции с электронной почтой используют интерфейс MAPI. Для работы напрямую с почтовыми серверами через протоколы РОРЗ и SMTP в системе "1С:Прелприятие 7.7" лучше всего использовать компоненту Rom-Mail.dll, которая распространяется бесплатно автором Олегом Ризвановым.

Компонентой поддерживаются следующие функции:

П стандарты MIME, UU-ENCODE;

О кодирование Base64 и QuotedPrintable;

П основные таблицы кодировок кириллицы: DOS, Windows-1251, KOI8-R, MAC;

П сообщения, состоящие из нескольких частей (multipart);

П отправка, получение, сохранение вложенных файлов (attachment);

О отправка тела сообщения в форматах TEKCT(plain/text), HTML(plain/html), RTF(richable);

П доступ как к указанной строке тела сообщения (построчное чтение), так и получение всего тела сообщения сразу;

П использование полей СС (копия) и ВСС (скрытая копия);

П настройка параметров соединения на странице свойств компоненты;

П сохранение соединения (keep alive);

П настройка аутентификации на странице свойств;

П возможность установки произвольного значения полей АдресОтправителя (From) и ИмяОтправителя (FromName), а также оставлять эти значения пустыми;

? выбор вида аутентификации при входе на SMTP-сервер;

П возможность выбора — забирать или оставлять сообщения на сервере;

П возможность установки каталога для сохранения вложений;

П пометка/снятие пометки на удаление;

П 20 направлений перекодировки в различные таблицы кодировок;

П поддержка функции контроля соединения (Ping).

Внешняя компонента ROM-Mail.dll содержит только один объект AddlnMail. В листинге 8.7 приведен пример загрузки внешней компоненты.

. jTA .......’"'ПЖ^МИШІ

..................

!............ ”"Г..................... '......’...............

Листинг 8.7. Загрузка внешней компоненты

_______’ "

// Загрузка внешней компоненты

Если ЗагрузитьВнешш?юКомпоненту("ROM-Mai-l.dll") = 1 Тогда // Создание объекта AddlnMail ВК = СоздатьОбъект("Addin.AddlnMail");

Иначе

Сообщить("Не удалось загрузить ROM-Mail.dll");

Возврат;

КонецЕсли;

Для чтения писем с РОРЗ-сервера необходимо заполнить параметры подключения к нему и вызвать метод подключиться с параметром "Прием" (листинг 8.8). После подключения необходимо в цикле выбрать все сообщения.

Листинг 8.8. Чтение писем с РОРЗ-сервера

--------
¦fill ¦
// Загрузка внешней компоненты

Если ЗагрузитьВнешнююКомпоне.чту("ROM-Mai!,dli"} = 1 Тогда // Создание объекта AddlnMail ВК = СоздатьОбъект("Addin.AddlnMail");

Иначе

Сообщить("Не удалось загрузить ROM-Mail.dll”);

Возврат;

КонецЕсли;

// NetBIOS-имя или IP-адрес сервера приема сообщений (РОРЗ)

ВК. СерверПриема = "pop.server.ru";

// Порт сервера приема сообщений

ВК.ПортПриема = 110;

// Логин для аутентификации на РОРЗ-сервере

ВК.Логин = "user";

// Пароль для аутентификации на РОРЗ-сервере

ВК. Пароль = "password" ;

// 1 - оставлять письма на РОРЗ-сервере, 0 - удалять письма с сервера

ВК.ОставлятьНаСервере = 1;

// Разрешить/запретить показ модальных окон предупреждений

ВК.ПоказыватьПредупреждения = 0;

// Выполняет подключение к серверу Если ВК.Подключиться("Прием")=0 Тогда

Предупреждение("Не удалось подключиться к серверу!");

Возврат;

КонецЕсли;

// Выборка писем

Для Индекс = 1 По ВК.КоличествоСообщений() Цикл // Получает сообщение с заданным номером ВК.ПолучитьСообщение(Индекс);

// Заполняем данные письма в таблицу значений

ТЗ.НоваяСтрока();

ТЗ.Отправитель = ВК.ИмяОтправителя;

ТЗ. Адрес = ВК.АдресОтправителя;

Т 3.Тема = ВК.Тема;

ТЗ.Получатель = ВК.АдресПолучателя;

T3.MessageID = ВК.IDMessage; // Идентификатор сообщения ТЗ.Копия = ВК.СС;

ТЗ.Тело = ВК.Тело;

// Имя файла-вложения или список файлов (строка, с разделителем ";")

ТЗ.Вложения = ВК.Вложения;

ТЗ.Дата = ВК.ДатаОтправки;

ТЗ.Размер = ВК.Размер; // Размер сообщения в байтах

КонецЦикла;

// Разрывает установленные соединения

ВК.Отключиться ();

В данном примере вся информация о письмах добавляется в таблицу значений с идентификатором тз.

Примечание

Инициализация данной таблицы значений лежит за рамками данного примера.

При получении тела письма оно может быть в произвольной кодировке. Чтобы преобразовать его к удобочитаемому виду, можно воспользоваться методом перекодировать, первым параметром которого указывается текст письма, а вторым — номер направления перекодировки:

1. Из ALT в ISO.

2. Из ALT в KOI.

3. Из ALT в MAC.

4. Из ALT в WIN.

5. Из ISO в ALT.

6. Из ISO в KOI.

Из ISO в MAC.

8. Из ISO в WIN.

9. Из KOI в ALT.

10. Из KOI в ISO.

Из KOI в MAC.

12. Из KOI в WIN.

13. Из MAC в ALT.

14. Из MAC в ISO.

15. Из MAC в KOI.

16. Из MAC в WIN.

17. Из WIN в ALT.

18. Из WIN в ISO.

19. Из WIN в KOI.

20. Из WIN в MAC.

Метод Перекодировать возвращает строку в кодировке, соответствующей номеру направления преобразования.

В цикле выборки писем, после получения очередного письма, при наличии вложенных файлов, можно сохранить их на жестком диске. Ниже приведен пример сохранения всех вложенных файлов в корневом каталоге диска (листинга 8.9).

¦ИИММИМММИМММДДИДММММ|МИЯДИИММММММИММ|І|ИДД|

: Листинг 8.9. Сохранение вложенных файлов на диск

II ...

Для Индекс = 1 По ВК. КоличествоСообщений (•) Цикл ВК,ПолучитьСообщение(Индекс) ;

//

Если ПустоеЗначение (ВК.Вложения) = 0 Тогда

// Получаем тело сообщения с заданным номером ВК.ПолучитьТело(Индекс);

// Выбираем все вложенные файлы письма Для НомерФайла = 1 По ВК.КоличествоФайлов () Цикл // Получение строки с именем файла-вложения ИмяФайла = ВК.ПолучитьФайл (НомерФайла) ;

// Сохранение файла

ВК.СохранитьФайл (НомерФайла, "С:\" + ИмяФайла); КонецЦикла;

КонецЕсли;

КонецЦикла;

Для отправки письма через SMTP-сервер необходимо подключиться к почтовому серверу, заполнить атрибуты письма и вызвать метод отправить.

В листинге 8.! О приведен пример отправки одиночного письма.

Г**і*,'***,**'“Т*.^”"*І .................!

стинг 8.10. Отправка письма через SMTP-сервер

// Загрузка внешней компоненты

Если ЗагрузитьВнешнююКо^оненту("ROM-Hail,dll“' = 1 Тогда

// Создание объекта МсЦдМаіІ ВК = СоздатьОбъект("Addin.AddlnMail") ;

Иначе

Сообщить("Не удалось загрузить ROM-Mail.dll");

Возврат;

КонецЕсли;

// NetBIOS-имя или IP-адрес сервера отправки сообщений (SMTP)

ВК.СерверОтправки = "smtp.server.ru";

// Порт сервера отправки сообщений (SMTP)

ВК.ПортОтправки = 25;

// Логин для аутентификации на SMTP-сервере ВК.Логин = "user";

// Пароль для аутентификации на SMTP-сервере ВК.Пароль = "password";

// SMTP-серверу требуется проверка подлинности

ВК.АутентификацияПриОтправке = 1;

// Выполняет подключение к серверу

Если ВК.Подключиться("Отправка") = 0 Тогда

Предупреждение("Не удалось подключиться к серверу!");

Возврат,¦

КонецЕсли;

ВК.АдресОтправителя = "";

ВК.ИмяОтправителя = "Андрей Михайлов";

ВК.ДцресПолучателя = "Получатель]. <>; Получатель2 <>";

ВК.Копия = "ПолучательЗ <>";

ВК.СкрытаяКопия = "Получатель4 <>";

ВК.Тема = "Тема письма",-

ВК.Толо = "Пример отправки письма";

ВК.Вложения = "C:\Temp\example.ert; C:\Temp\Readme.doc";

ВК.KoflMpoBKa="windows-X251";

ВК.ТипПисьма = 0; // text/plain

ВК.Важность =1; // Высокая

ВК.ПодтверждениеДоставки = 0;

ВК.ПодтверждениеПрочтения = 1;

// Выполнить отправку сообщений с SMTP-сервера

Если ВК.Отправить О = 1 Тогда

Предупреждение("Сообщение отправлено!");

Иначе

Предупреждение("Не удалось отправить сообщение!");

КонецЕсли;

// Разрывает установленные соединения

ВК.Отключиться();

Данный пример демонстрирует отправку письма текстового типа. Для его отправки в формате application/rtf или text/html необходимо в свойстве ТипПисьма указать соответственно значение или 2 и выполнить метод за-грузитьИзФайла, который загружает тело письма из указанного файла.

В компоненте ROM-Mail.dll реализован дополнительный метод Ping, который возвращает процент потерь. После выполнения метода свойство PingText содержит результат выполнения метода ping (листинг 8.1 1).

i Листинг 8.11. Использование метода Ping

я^нн^^^^нін_____ін^нннншяв____-________________..........___нн____hi__________I_____I' нии i

// NetBIOS-имя или IP-адрес хоста Host = "erpg.ru";

// Загрузка внешней компоненты

Если ЗагрузитьБнешнююКомпоненту("ROM-Mail.dll"5 = 1 Тогда // Создание объекта AddlnMail ВК = СоздатьОбъект("Addin.AddlnMail");

Иначе

Сообщить("Не удалось загрузить ROM-Mail.dll");

Возврат;

КонецЕсли;

// Отправляем пакет размером 72 байта по протоколу ICMP

ВК.Ping(Host);

// Вывести результат выполнения метода Ping

Сообщить(ВК.PingText);

Результатом выполнения данного кода будет сообщение вида:

"IP-адрес: 194.135.22.201; Байт отправлено: 72; Байт получено: 72; TTL: 128; Потерь ()%".

Компонента ROM-Mail.dll имеет страницу свойств, атрибуты которой устанавливаются из меню Сервис | Параметры системы " 1С:Предприятие". При использовании страницы свойств создавать объект и инициализировать компоненту следует в глобальном модуле.

Использование объекта Почта

В системе "1C:Предприятие" (версия 8.0) для работы с электронной почтой существует объект почта, который является аналогом объекта ?7Маі1 в системе ”1С:Предприятие" (версия 7.7) в том смысле, что он тоже работает по технологии MAPI.

Рассмотрим все объекты, которые необходимо знать при работе с электронной почтой.

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

? — содержит информацию о письме, такую как: тема, текст письма, адресаты, вложения и т. п.

? почтовыйАдрес — содержит информацию о почтовом адресе (электронный адрес и имя пользователя).

Гпава 8

296_

О ПочтовыеАдрес — содержит КОЛЛеКЦИЮ Элементов ПочтовыйАдрес.

П почтовоеВложение — содержит информацию о вложенном файле (данные и имя файла).

О ПочтовыеВложения — содержит коллекцию элементов ПочтовоеВложение.

Для подключения к почтовому клиенту используется метод подключиться объекта почта. Метод Подключиться имеет два параметра. Первый — строковое выражение, обозначающее название профиля для подключения, если параметр не указан, то используется профиль пользователя, установленный по умолчанию. Второй параметр — пароль пользователя, если он требуется при подключении к серверу.

В листинге 8.12 приведен пример подключения к почтовому серверу.

Листинг 8.12. Подключение к почтовому серверу

//Создает объект Почта Почта = Новый Почта;

// Подключение к почтовому серверу

Почта.Подключиться("МА?",);

//. . .

// Оключение от почтового сервера

Почта.Отключиться();

Для получения почты с сервера используется метод выбрать объекта Почта. Метод имеет два параметра. Первый — признак выборки только непрочитанных сообщений. Второй — признак выборки только конвертов сообщений (т. е. без вложений).

В листинге 8.13 приведен пример выборки писем из профиля, используемого по умолчанию, и записи информации о письмах в табличное поле

ТабличноеПолеИнтернетПочта.

лая шцновшити дик
.
Листинг 8.13. Чтение сообщений

——---------—-------1---------

// Создает объект Почта Почта = Новый Почта;

// Подключение к почтовому серверу для получения почты

Почта.Подключиться{ , ) ;

МассивПисем = Почта. Выбрать (Ложь, Истина) ;

// Перебираем массив писем

Для каждого Письмо Из МассивПисем Цикл

Добавляем новую строку в табличное поле

СтрокаТП = ТабличноеПолеИнтернетПочта.Добавить();

Попытка

СтрокаТП.ОтКого = Письмо.Отправитель.Адрес;

Исключение

СтрокаТП.ОтКого = Письмо.Отправитель;

КонецПопытки; ,

Получатели =

// Перебираем всех получателей

Для каждого Получатель Из Письмо.Получатели Цикл

Получатели = Получатели + Получатель.Пользователь + +

Получатель.Адрес + ">

КонецЦикла;

СтрокаТП.Кому = Получатели;

СтрокаТП.Тема = Письмо.Тема;

СтрокаТП.Текст = Письмо.Текст;

// Перебираем вложения

Для каждого Вложение Из Письмо.Вложения Цикл // Сохраняем вложение в папке С; \trail4.

Вложение.Данные.Записать("С:\Mail\" + Вложение.Имя);

КонецЦикла;

КонецЦикла;

// Оключение от почтового сервера

Почта.Отключиться();

/

В приведенном примере есть несколько особенностей:

1. При обращении к свойству отправитель объекта письмо используется КОНСТРУКЦИЯ По пытка...Исключение...КонецПопытки. Это необходимо вследствие того, что свойство Отправитель может возвращать значение типа строка адреса или почтовыйАдрес. Вместо конструкции Попытка. ..Исключение. ..конецПопытки можно анализировать тип возвращаемого значения.

2. Все файлы вложений автоматически сохраняются в папке "С:\Маі1\". Вместо этого можно сохранять данные вложений в реквизиты объектов системы" 1 С: Предприятие 8.0" типа хранилище Значения.

Для отправки писем используется объект почтовоесообщение. В листинге 8.14 приведен пример создания почтового сообщения и его отправки.

I Листинг 8.14, Отправка почтового сообщения

.........................................; ... _

У/ Создаем почтовое сообщение Письмо = Новый ПочтовоеСообщение;

Письмо.Тема = Тема;

Письмо.Текст = Текст;

// Добавляем адресата

Письмо.Получатели.Добавить("");

// Добавляем отправителя

Письмо.Отправитель = "";

// Добавляем файл

Письмо.Вложения.Добавить("с:\plan.txt");

// Добавляем произвольные двоичные данные Архив = Новый ДзоичныеДанные("с:\trade.zip") , Письмо.Вложения.Добавить(Архив,"trade.zip");

// Создаем объект Почта Почта = Новый Почта;

// Отсылаем письмо

Почта.Послать(Письмо);

Примечание

Полный список свойств и методов каждого объекта приведен в документации.

Использование объекта ИнтернетПочта

Объект ИнтернетПочта присутствует только в системе "1C:Предприятие" (версия 8.0) и позволяет работать с электронной почтой напрямую через сервер электронной почты. Другими словами — работа данного объекта не зависит от установленного почтового клиента.

Объект предназначен для доступа к почтовым серверам с целью отправки и получения сообщений. В отличие от объекта почта, который работает по технологии MAPI и требует от пользователя установленного почтового клиента, объект ИнтернетПочта использует интернет-протоколы SMTP и РОРЗ.

Рассмотрим используемые в данном режиме объекты.

О ИнтернетПочта — основной объект, предназначенный для подключения и отключения от почтового сервера, а также для выборки писем с почтового сервера и отправки сообщений.

О интернетПочтовыйПрофиль — содержит информацию об учетной записи пользователя (имя РОРЗ, SMTP-серверов, имя пользователя, пароль и т. п.).

? интернетйочтовоеСообщение — содержит информацию о письме (тема, дата получения, дата отправления, вложения, почтовые адреса отправителя и получателей и т. д.).

О ИнтернетПочтовыйАдрес — содержит информацию о почтовом адресе (электронный адрес и имя пользователя).

П ИнтернетПочтовыеАдреса — содержит коллекцию элементов Интернет -почтовыйАдрес.

П интернетТекстПочтовогоСообщения — содержит текст почтового сообщения и его тип (HTML, простой или размеченный текст).

П интернетТекстыПочтовогоСообщения — содержит коллекцию элементов ИнтернетТекстПочтовогоСообщения.

П ИнтернетПочтовоеВложение — содержит информацию о вложенном файле (данные и имя файла).

П ИнтернетПочтовыеВложения — содержит коллекцию Элементов ИнтернетПочтовоеВложение .

Для подключения к почтовому серверу используется метод Подключиться,

в параметре которого передается значение типа ИнтернетПочтовыйПрофиль.

В листинге 8.15 приведен пример создания профиля пользователя и подключения к почтовому серверу.

Листинг 8.15. Подключение к почтовому серее]

Профиль = Новый ИнтернетПочтовыйПрофиль;

// Адрес SMTP-сервера

Профиль.АдресСервераЗМТР = "smtp.erpg.ru";

// Адрес РОРЗ-сервера

Профиль.АдресСервераРОРЗ = "pop.erpg.ru";

// Порт протокола SMTP

Профиль.ПортЭМТР = 25;

// Порт протокола РОРЗ

Профиль.ПортРОРЗ = 110;

// Логин пользователя

Профиль.Пользователь = "boss";

// Логин пользователя для аутентификации на SMTP-сервере Профиль.ПользовательSMTP = "boss";

// Пароль доступа к почтовому ящику

Профиль,Пароль = "neskaju”;

// Пароль пользователя для аутентификации на SMTP-сервере

Профиль.ПарольSMTP = "tojejneskaju";

// Время ожидания удачного исполнения операции в секундах

Профиль . ВремяОжидания =30;

Почта = Новый ИнтернетПочта;

/ / Подключение к почтовому серверу Попытка

Почта.Подключиться(ПолучитьПрофиль() ) ;

Исключение

Сообщить(ОписаниеОшибки( } ) ;

Возврат;

КонецПопытки/

//...

// Отключение от почтового сервера

Почта.Отключиться() ;

Примечание

При подключении к почтовому серверу используется конструкция Попытка... Исключение. ..КонецПопытки. Это необходимо сделать для подстраховки от неудачного подключения.

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

В листинге 8.16 приведен пример получения писем с почтового сервера, профиль для которого был создан ранее.

Листинг8.16. Получение писем с почтового сервера

........................-............................—----.....-.............................J--L.....—.....----

Почта = Новый ИнтернетПочта;

/ / Подключение к почтовому серверу Попытка

Почта.Подключить ся(Профиль);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

ТабличноеПолеИнтернетПочта.Очистить()

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки ;

// Отключение от почтового сервера

Почта.Отключиться();

Примечание_

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

Работа с протоколом FTP

Аббревиатура FTP расшифровывается как File Transfer Protocol (протокол передачи файлов). Протокол FTP оптимизирован для передачи файлов, это и послужило причиной того, что программы, использующие его, стали частью отдельного сервиса Интернета. Сервис, обеспечивающий доступ к файлам других компьютеров сети по протоколу FTP, носит одноименное название.

Чтобы воспользоваться протоколом FTP, понадобится специальная программа, так называемый FTP-клиент. ІТР-клнеигом может служить браузер (Microsoft Internet Explorer, Netscape Navigator), программа управления файлами FAR, специализированная программа CuteFTP и др.

Для обеспечения программного доступа к протоколу FTP можно использовать либо вызов программы , либо — объект FTP, являющийся частью объектной модели системы "ІСТІрсдприятие" (версия 8.0).

Использование программы

Программа ftp позволяет передавать файлы на удаленный компьютер или получать их оттуда. Она работает с файлами и каталогами удаленного компьютера.

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

Для запуска программы ftp в контексте конфигурации системы "ЮПредприятие" (версия 7.7) достаточно вызвать команду КомандаСистемы,

в параметрах которой указать команду ftp с необходимыми параметрами.

Эти параметры помещаются после названия — ftp. Каждый параметр состоит из дефиса (-) и одной буквы и имеет соответствующую команду того же

имени, которая может быть использована внутри ftp.

Примечание_

Следует различать использование опций и соответствующих ftp-команд.

Рассмотрим возможные параметры программы ftp.

П -v — заставляет ftp работать в многословном режиме. В этом режиме сообщения ftp, посланные удаленной машиной, появляются на экране дисплея-приемника. Кроме того, если этот режим используется после завершения передачи каждого файла, то появляется статистическое сообщение, уведомляющее об этом. Данный режим устанавливается по умолчанию, если ftp выполняется интерактивно. Если ftp выполняется в командном режиме, многословный режим выключен. Для того чтобы его включить, надо установить опцию -v. Включить этот режим внутри ftp МОЖНО С ПОМОЩЬЮ команды verbose.

П -d — заставляет ftp работать в режиме отладки. В этом режиме сообщения ftp, посланные ftp в удаленную машину, отображаются на экране дисплея-передатчика. Если не используется эта опция — информация не отображается. Вызвать этот режим в ftp можно также используя команду debug.

О -i — данная опция означает не интерактивную работу.

П -п — опция позволяет предотвратить использование ftp-авторегистрации, во время связи с удаленной машиной. Когда установлен режим авторегистрации, ftp идентифицирует вас автоматически на удаленной маш и нс и регистрирует вас на ней. Если вы используете -п-опнию для отключения автоматической регистрации, вы должны будете использовать команду user, чтобы вручную зарегистрироваться на удаленной машине.

П -д — является причиной лишения имен файлов, созданных в среде операционной системы UNIX, их расширений, например, таких как универсальное — *. Если не используется эта опция, ftp расширяет имена файлов с помощью универсального расширения в списке файлов. Вместо ЭТОЙ ОПЦИИ МОЖНО ИСПОЛЬЗОВаТЬ Команду glob.

П -з:ИмяФайла — определяет выполнение команды ftp в пакетном режиме. В файле, имя которого указывается в параметре, описывается последовательность команд. Данный режим является основным для автоматизации работы с протоколом FTP посредством системы "ІС.'Предприятие".

В листинге 8.18 приведен пример работы с FTP-сервером посредством пакетного файла.

Листинг 8.18. Подключение к FTP-серверу через пакетный файл

і Л*

// Соединение с сервером

ТекстКоманды = "open

// Имя пользователя I user

// Пароль пользователя I password

// Выполняем команды программы ftp //...

// Закрыть связь с сервером

i quit

/ / Имя временного файла

ИмяФайла = КаталогИБО + "ftp\transfer.ftp";

// Создаем временный файл для пакетного выполнения команды ftp Текст = СоздатьОбъект("Текст");

Текст.ДобавитьСтроку(ТекстКоманды);

Текст.Записать(ИмяФайла);

// Выполняем команду ftp в пакетном режиме

КомандаСистемы("?бр -s:" + ИмяФайла);

// Удаляем временный файл

ФС.УдалитьФайл(ИмяФайла);

Из приведенного примера видно, что текст пакетного файла обязательно начинается с команды open, после которой указывается имя сервера. Следующими двумя строками следуют имя пользователя и пароль. Заканчивается текст пакетного файла командой quit.

В табл. 8.1 приведен полный список команд программы ftp.

Таблица8.1. Команды программы ftp

Команда Описание команды

append Добавляет содержимое локального файла в конец удаленного файла.

Например: append <имя локального файла> <имя файла удаленной машины>

ascii Установка режима передачи файлов в формате ASCII (По умолчанию

код всегда ASCII)

] 1 Зак. 722

Таблица 8.1 (продолжение)
Команда Описание команды
bell Выдача звукового сигнала по завершении команд. Чтобы прекратить подачу сигнала, нужно снова вызвать эту команду
binary Установка режима передачи файлов в двоичном формате
bye

или quit
Закрывает все открытые связи
cd Изменение рабочего каталога на удаленном компьютере. Например: cd /usr/bin
close Завершение сеанса работы ftp и закрытие текущей связи
debug Включение и выключение режима отладки
delete Удаление файла на удаленном компьютере. Например:

delete --'имя файла для удаления>
dir Вывод детального списка каталога удаленного компьютера. Например:

dir /usr/bin.

Если имя каталога не указывать, то будет распечатан текущий каталог удаленного компьютера. Для того чтобы занести результаты выполнения команды в файл, необходимо указать имя выходного файла. Например: dir /usr/bin printfile.

Если необходимо напечатать текущий каталог в файл, необходимо

вызвать команду:

dir . printfile

где означает текущий каталог
get

или recv
Копирует файл из удаленного компьютера на локальный. Например:

get <і4мя файла удаленной машины> <имя файла вашей ггашиныХ

Если просто указать имя файла удаленного компьютера, который нужно скопировать, то скопированный файл на вашей машине будет иметь то же самое имя
glob Переключение метасимвольного расширения имен локальных файлов. Эта команда запрещает такое универсальное расширение имен файлов, созданных в среде операционной системы UNIX, как — '*'
hash Переключает вывод символа "#" на экране пользователя после каждого блока данных, который посылается удаленному компьютеру. Размер блоков данных может быть различным в зависимости от версии программного обеспечения. Для того чтобы увидеть текущее состояние данного режима, с командой ftp должен использоваться режим отладки. Эта команда включает и выключает выдачу символа "#" на экран пользователя
Таблица S. 1 (продолжение)

Команда

led

Is

mdelete

mdir

mget

mkdir

mis

input

Описание команды

Изменяет рабочий каталог, используемый ftp. Например: led /usr/mav.

Если вы не задали имя каталога, то будет использоваться "стартовый" каталог

Распечатывает аббревиатурный список содержания каталога удаленного компьютера, с которого установлена связь. Например:

Is /usr/bin.

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

Is /usr/bin printfile.

Имя каталога нужно задать до вывода файла (printfile). Например, если вам необходимо распечатать текущий каталог в файл с именем printfile: . printfile

где символ ставится для указания, что каталог текущий Удаляет список файлов на удаленном компьютере. Например:

mdelete <имя 1-го файла> < имя 2-го файла >...

Выводит листинг директории удаленного компьютера, и результат помещается в файл локальной машины. Можно задать список файлов удаленной машины и имя файла локальной машины, куда поместить результат при вызове команды. Например: mdir <имя 1-го файла> <имя 2-го файла>... printfile

Копирование одного или более файлов с удаленного компьютера. Файлы после копирования будут иметь те же имена. Можно указать список файлов для копирования, например:

mget <имя 1-го файла> <имя 2-го файла>...

Создание каталога на удаленном компьютере. Например:

mkdir /u/mydir

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

mis <имя 1-го файла> printfile

Отправка нескольких файлов. Эта команда копирует один или более файлов с локального компьютера на удаленный. На удаленном компьютере файлы будут иметь те же имена. Например: mput <1-й файл> <2-й файл> машины...

Таблица 8.1 (окончание)
Команда Описание команды
open Подключение к протоколу FTP удаленного компьютера. Эта команда

устанавливает связь с удаленным компьютером, в который предполагается передача файлов. Например:

open ftp.server,ru
prompt Переключение интерактивной подсказки для составных команд. Эта команда переключает запросы к ftp между одноместными (обрабатывают один файл) и многоместными командами (например, такими как mget). Эта команда подключается и отключается при повторном наборе

put Отправка одного файла. Эта команда перемещает файл с локального

или send компьютера на удаленный. Например:

put <'имя локального файла> <имя удаленного файла> или put <имя локального файла>

pwd

quote

Вывод рабочего каталога удаленного компьютера

Отправка произвольных команд ftp, которые поддерживает удаленный сервер. Список доступных команд может быть отображен на экране с помощью команды remotehelp

Получение справочных сведений с удаленного сервера. Эта команда запрашивает помощь ftp на удаленном компьютере, с которым установлена связь на данный момент времени. Запрашиваемая информация сообщает о том, какие команды поддерживает удаленный компьютер

Переименование файла на удаленном компьютере. Например: rename <имя 1-го файла> <имя 2-го файла>

remotehelp

rename

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

Например:

rmdir /usr/mydir

status Выводит текущее состояние режимов bell, form, hash, glob, port, type

type Установка типа передачи файлов. Допустимы двоичный и коды ASCII.

Эта команда аналогична командам ascii и binary. Если не указан тип при вызове команды, то устанавливается ASCII

trace Переключение трассировки пакетов. Эта команда включается и от

ключается при ее повторным наборе

user Отправка сведений о новом пользователе. Команда позволяет поль

зователю идентифицировать самого себя на удаленном компьютере при установлении связи. Например: user mike cat myaccount

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

В листинге 8.19 приведен пример работы пакетного режима команды ftp при работе с файлами.

Листинг 8.19. Пример работы пакетного режима команды ftp

// Соединение с сервером ТекстКоманды = "open // Имя пользователя

I user

// Пароль пользователя

I password

// Получить файл с сервера на локальную машину Iget file.rtf c:\file.rtf

I get file.mp3 c:\mp3\file.mp3'

// Записать файл на сервер с локальной машины

Iput c:\file.htm file.htm Iput c:\docs\file.txt file.txt

// Удалить файл с сервера [delete file.rtf

// Создать новый каталог на FTP-сервере Imkdir newdir

// Закрыть связь с сервером

I quit

// Имя временного файла

ИмяФайла = КаталогИБ() + "ftp\transfer.ftp";

// Создаем временный файл для пакетного выполнения команды ftp Текст = СоздатьОбъект("Текст");

Текст.ДобавитьСтроку(ТекстКоманды);

Текст.Записать(ИмяФайла);

// Выполняем команду ftp в пакетном режиме

КомандаСистемы("ftp -s:" + ИмяФайла);

// Удаляем временный файл

ФС.УдалитьФайл(ИмяФайла);

Использование объекта ПГРСоединение

В системе "ІС.'Прсдприятие" (версия 8.0) для работы с удаленными компьютерами через протокол FTP предназначен объект РТРСоединение, С помощью данного объекта можно выполнять типовые действия с файлами, например, такие как: скачивать и закачивать файлы, переименовывать их, обращаться к их свойствам, создавать каталоги и т. д.

Для установления соединения с FTP-сервером проще всего воспользоваться конструктором объекта ктРСоеданение, который имеет следующие параметры:

О Сервер — сервер, с которым осуществляется соединение;

О порт — порт сервера, с которым осуществляется соединение (по умолчанию 21);

О имя пользователя — имя пользователя на указанном сервере;

П пароль пользователя — пароль пользователя на указанном сервере;

G прокси — значение типа интернетПрокси (прокси, используемый для соединения с сервером);

? пассивное соединение — булево значение, определяющее тип ftp-соединения (по умолчанию — ложь).

Поле установки соединения с помощью метода УстановитьТекущийКаталог можно указать текущий каталог сервера, с которым будет происходить работа в дальнейшем. Далее можно работать с файлами и каталогами удаленного компьютера. В листинге 8.20 приведен пример вывода содержимого каталога в табличное поле.

Листинг 8.20. Вывод содержимого каталога

НННІ ______________.. .... I— HHHIHKfl : ------------------------____aLJ.J // Соединение с удаленным сервером

FTP = Новый РТРСоединение("ftp.server.ru",21,"user","password",,);

// Установка текущего каталога

FTP.УстановитьТекущийКаталог("httpd/www/");

// Получить массив файлов, расположенных в текущем каталоге МассивФайлов = FTP.НайтиФайлы("",);

// Выбрать файлы их массива

Для каждого Файл Из МассивФайлов Цикл

// Добавить информацию о файле в табличное поле СтрокаТП = ТабличноеПолеФайлы.Добавить();

СтрокаТП,Имя = Файл.Имя;

СтрокаТП.ПолноеИмя = Файл.ПолноеИмя;

// Определяем, соответствует ли файловый объект файлу

Если Файл.ЭтоФайл() Тогда

СтрокаТП.ВремяИзменения = Файл.ПолучитьВремяИзменения () ;

СтрокаТП.Размер = Файл.Размер();

КонецЕсли;

КонецЦикла;

Для удаления файлов на сервере предназначен метод удалить объекта ЕТРСоединение.

В программном коде, приведенном в листинге 8.21, показаны примеры удаления одного файла и группы файлов.

™ggg-------ШИ

Листинг 8.21. Удаление файлов на удаленном компьютере

НННННННвННВиЯМНЯНННННННВНШНННННННННЯВЯНИВЯНІ

// Соединение с удаленным сервером

FTP = Новый ЕТРСоединение("ftp.server.ru",21,"user","password",,);

// Установка текущего каталога

ЕТР.УстановитьТекущийКаталог("usr/mav/");

Попытка

// Удаляет файл на сервере

FTP.Удалить("data.txt");

// Удаляет группу файлов на сервере

FTP.Удалить("tmp/", "*.txt");

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Во втором вызове метода Удалить, в коде, который представлен в листинге 8.21, используется маска, по которой определяются файлы, подлежащие удалению.

Для копирования файла с удаленного компьютера на локальный предназначена команда получить. В параметрах этой команды указывается имя файла источника и имя файла локального компьютера (листинг 8.22).

Іистинг 8.22.

аила с удаленного компьютера на локальный

й

I

/ / Соединение с удаленным сервером

FTP = Новый ЕТРСоединение("ftp.server.ru",21,"user","password",,);

// Установка текущего каталога

ЕТР.УстановитьТекущийКаталог("usr/mav/");

// Выбор папки для сохранения файла

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

Диалог,Каталог = “с;\";

Диалог.Заголовок = "Выберите папку для сохранения...";

Диалог.МножественныйВыбор = Ложь;

Если Диалог.Выбрать') Тогда Попытка

// Сохраняет файл из указанного адреса на локальный компьютер

// Имя файла удаленного компьютера содержится в переменной <ИмяФайла>

FTP.Получить(ИмяФайла, Диалог.Каталог + "\" + ИмяФайла);

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

КонецЕсли;

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

Для обратного действия, т. е. для копирования файла с локального компьютера на удаленный, используется метод записать. Пример использования этого метода приведен в листинге 8.23.

'¦¦'і

Листинг 8.23. Копирование файла с локального компьютера на удаленный і

// Соединение с удаленным сервером

FTP = Новый ІГТРСоединение("ftp.server.ru",21,"user","password", , );

// Установка текущего каталога

FTP.УстановитьТекущийКаталог("usr/mav/");

// Выбор файла для загрузки файла на ftp

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог. Каталог = ,5 с: \ ЕІ;

Диалог. Заголовок = "Выберите файл для загрузки на ftp..

Диалог.МножественныйВыбор = Ложь;

Если Диалог.Выбрать() Тогда Попытка

// Из полного имени выделяем только имя файла

ИмяФайла = Сред(Диалог.ПолноеИмяФайла, СтрДлина(Диалог.Каталог)+1); // Записывает файл с локального компьютера на ftp FTP.Записать(Диалог.ПолноеИмяФайла, ИмяФайла);

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

КонецЕсли;



Глава 9 Использование Active Directory Service Interfaces

Понятие

Технология Active Directory Service Interfaces (ADSI) предоставляет объектную модель, которая обеспечивает единообразный, не зависящий от конкретного сетевого протокола, доступ из программ или сценариев WSH к функциям различных каталогов (Active Directory для Windows 2000/Windows Server 2003, Windows Directory Service для Windows NT 4.0, NDS для Novell NetWare 4.x/5.x).

Объекты ADSI включены в операционные системы Windows XP/2000/2003, а также могут быть установлены в более ранних версиях, для чего их нужно загрузить с сервера компании Microsoft.

Для пользователей локальных или глобальных сетей важно уметь находить и использовать объекты разных типов (зарегистрированные пользователи, доступные сетевые принтеры и очереди печати и т. д.), которых в крупной сети может быть огромное количество. Администраторы сети должны поддерживать эти объекты в работоспособном состоянии. Под службой каталога (Directory Service) понимается та часть распределенной компьютерной системы (компьютерной сети), которая предоставляет средства для поиска и использования имеющихся сетевых ресурсов. Другими словами, служба каталога — это единое образование, объединяющее данные об объектах сети и совокупность служб, осуществляющих манипуляцию этими данными.

В гетерогенной (неоднородной) компьютерной сети могут одновременно функционировать несколько различных служб каталогов, например, NetWare Bindery для Novell Netware 3.x, NDS для Novell NetWare 4.x/5.x, Windows Directory Service для Windows NT 4.0 или Active Directory для Windows 2000. Естественно, для прямого доступа к разным службам каталогов приходится использовать различные инструментальные средства, что усложняет процесс администрирования сети в целом.

Для решения этой проблемы фирмой Microsoft была разработана технология Active Directory Service Interfaces (ADSI), которая предоставляет набор объектов ActiveX, обеспечивающих единообразный, не зависящий от конкретного сетевого протокола, доступ к функциям различных каталогов. Немаловажным фактом является то, что объекты ADSI включены в операционные системы Windows ХР/2000. Также они могут быть установлены в более ранних версиях операционной системы, для чего их нужно скачать с сервера Microsoft.

Служба Active Directory состоит из четырех основных частей:

П Служба DNS (Domain Name Service);

О WinNl 'Provider Service;

? NWCOMPA T ProviderService;

П Протокол LDAP (Lightweight Directory Access Protocol).

Традиционная в сетях TCP/IP служба DNS используется, в частности, для поиска контроллеров домена, а благодаря протоколу LDAP клиенты могут по имени находить в каталоге Active Directory нужные объекты и получать доступ к их атрибутам. С помощью службы WinNT Provider производится доступ к доменам сети в операционных системах Windows NT, а посредством службы NWCOMPAT — в Novell NetWare 3.x.

В данной главе будет рассмотрена только служба WinNT Provider, как самая простая и наиболее используемая.

Применяя объекты ADSI и службы WinNT Provider можно, например:

О получить список имеющихся в локальной сети доменов;

? получить список имеющихся в домене рабочих станций;

П получить список всех групп, определенных в домене или на компьютере; П добавить и удалить пользователя домена или компьютера;

П определить всех пользователей заданной группы или все группы, в которые входит определенный пользователь;

П просмотреть атрибуты пользователя и изменить его пароль.

Далее будут рассмотрены практические примеры работы с ADSI.

Формирование дерева объектов WinNT Provider

Все объекты службы WinNT Provider представляются в виде дерева, структура которого определена в табл. 9.1.

Таблица 9.1. Иерархия классов WinNT Provider
Имя класса Описание
Namespace Самый верхний уровень пространства имен.

Пример:

Obj = ПолучитьСОМОбъект("WinNT://")
Domain Домен Windows NT.

Пример:

Obj = ПолучитьСОМОбъект("WinNT://MyDomain")

User

Учетная запись пользователя.

Пример:

Obj=ПолучитьСОМОбъект("WinNT://MyDomain/User")

Группа учетных записей, управляющая правами доступа. Пример:

0^=ПолучитьС0М0бъект ("WinNT: //MyDomain/Group")

Пользователи группы Прочие группы

Group

UserGroupCollection

GroupCollection

Computer

Windows NT-сервер или рабочая станция.

Пример:

Obз=ПолучитьСОМОбъект("WinNT://МуServeг")

Очередь задач принтера.

Пример:

Obj=ПолучитьСОМОбъект("WinNT://MyServer/aPrinter")

Коллекция задач принтера

Очередь задач программы-планировщика принтера

PrintJ ob

PrintJobsCollection PrintQueue

Service

FileService

FileShare

Resource

Session

User

Group

Запущенные сервисы Сервис доступа к файлам Общедоступные файлы Ресурсы сервиса

Активные файловые подключения Локальные пользователи.

Пример:

Obj = Получить СОМОбъект ("WinNT://MyServer/User")

Локальные группы.

Пример:

Obj = • ПолучитьСОМОбъект("WinNT://MyServer/Group")

Коллекция локальных групп Схема WinNT-контейнера Схема определения классов Схема определения свойств Синтаксис свойств

Таблица 9.1 (окончание)
Имя класса Описание
UserCollection Коллекция локальных пользователей группы
Grouped lection

Schema

Class

Property

Syntax
В качестве имени домена необходимо указывать имя NETBIOS, т. к. WinNT Provider не поддерживает работу с DNS-именами.

Для создания определенного объекта необходимо подсоединиться к целевому контейнеру используя функцию Получитьсомобъект. Для точной идентификации класса создаваемого объекта можно указать его имя через запятую (листинг 9.1).

// Создание объекта очереди задач принтера на компьютере "Comp"

Queue = ПолучитьСОМОбъект("WinNT:// Domain/Comp/aPrinter,printQueue");

// Создание объекта пользователя "МА?"

User = ПолучитьСОМОбъект("WinNT:// Domain/МА?,user");

// Создание объекта компьютера "Сотр"

Computer = ПолучитьСОМОбъект("WinNT://Comp");
Для формирования дерева объектов WinNT Provider используется рекурсивная процедура ВывестиУровеньПространства, показанная в листинге 9.2.

....................................................................................

Листинг 9.2. Формирование дерева объектов WinNT Provider

// Вызов процедуры и инициализация рекурсии

ВывестиУровеньПространства ("WinNT: ", ТабличноеПолеПространствоШен. Строки)

// Рекурсивная процедура вывода очередного уровня иерархии

Процедура ВывестиУровеньПространства(Имя, ТП)

// Связываемся с корневым объектом Namespace

NameSpace = ПолучитьСОМОбъект(Имя);

11 Перебираем элементы коллекции Попытка

Для каждого Domain Из NameSpace Цикл СтрокаТП = ТП,Добавить О;

СтрокаТП.КолонкаИмя = Domain. Name;

// Ограничиваем иерархию 4-ю уровнями Если СтрокаТП.Уровень () < 4 Тогда

ВывестиУровеньПространства (Имя + ? (Имя="Иіп№Г: "/") +

Domain.Name, СтрокаТП.Строки);

КонецЕсли;

КонецЦикла;

Исключение

КонецПопытки;

КонецПроцедуры // ВывестиУровеньПространства()

В данном примере для простоты вся выборка объектов определенного уровня взята В программные скобки Попытка...Исключение...КонецПопытки. Это сделано для того, чтобы процедура не отработала с критической ошибкой, при отсутствии объектов в коллекции.

Вся иерархия объектов выводится в дерево значений, которое расположено на форме обработки С именем ТабличноеПолеПространствоИмен.

Приведенный в листинге 9.2 пример покажет дерево объектов локальной сети в соответствии с иерархией, приведенной в табл. 9.1.

Вывод списка всех доменов локальной сети

Для вывода всех доменов локальной сети необходимо выполнить следующую простую последовательность действий.

1. Используя функцию получитьсомобъект, подсоединимся к целевому контейнеру "WinNT:", который будет содержать коллекцию доменов.

2. С помощью конструкции для каждого...Из...Цикл...КонецЦикла перебираем полученную коллекцию.

Пример вывода списка доменов показан в листинге 9.3.

Листинг 9.3. Вывод списка всех доменов локальной сети

// Вывод списка всех доменов локальной сети Домены = ПолучитьСОМОбъект("WinNT:");

Для каждого Домен Из Домены Цикл Сообщить(Домен.Name);

КонецЦикла;

Вывод списка пользователей группы

Для вывода списка пользователей группы необходимо выполнить следующую простую последовательность действий.

1. Используя функцию пелучитьсоксбъект, подсоединиться к целевому Контейнеру "WinNT: //<ШяКомпьютера>/<ИмяГруппы>, Group", который будет содержать коллекцию пользователей. С помощью дополнения Group указывается, что создается элемент группы.

2. С помощью конструкции Для каждого...из...Цикл...конецЦикла перебираем полученную коллекцию.

Пример вывода списка пользователей группы "Пользователи" приведен в листинге 9.4.

Ш—г:........ ----——ШВШШШШ—

Листинг 9.4. Вывод списка пользователей группы

// Связываемся с компьютером

Obj = ПолучитьСОМОбъект("WinNT://" + ИмяКомпьютера +

"/Пользователи,group");

Сообщить("Список пользователей компьютера " + ИмяКомпьютера);

// Выборка всех пользователей из коллекции Для каждого Пользователь Из Obj.Members О Цикл Сообщить(Пользователь.Name);

КонецЦикла;

Создание и удаление пользователей

Для создания нового пользователя необходимо выполнить следующую последовательность действий.

1. Используя функцию получитьсомобъект, подсоединиться к целевому КОНТеЙНеру "WinNT://<ИмяКомпьютера> ".

2. Используя метод create из ADSI, создадим новый объект user в локальном кэше свойств. Метод create содержит два параметра: имя класса создаваемого объекта и имя объекта.

3. Используя свойство Description, можно задать текстовое описание пользователя.

4. С помощью метода setPassword можно задать пароль пользователя.

5. С помощью метода Set in?о из ADS1 новый объект записывается в каталог. Пример создания нового пользователя приведен в листинге 9.5.

; Листинг 9.5. Создание нового пользователя

// Связываемся с компьютером

Computer = ПолучитьСОМОбъект("WinNT://" + ИмяКомпьютера};

// Создаем объект класса User

User = Computer.Create("user", ИмяПользователя);

// Добавляем описание созданного пользователя

User.Description = Описание;

// Задаем пароль пользователя

User.SetPassword(ПарольПользователя);

// Сохраняем информацию на компьютере

User.Setlnfo();

Для удаления локального пользователя достаточно соединиться с компьютером и вызвать метод Delete, указав имя класса удаляемого объекта и имя самого объекта (листинг 9.6).

Н

HI

Листинг 9.6. Удаление пользователя

// Связываемся с компьютером

Computer = ПолучитьСОМОбъект("WinNT://" + ИмяКомпьютера);

// Удаление пользователя

Tmp = Computer.Delete("user", ИмяПользователя);

Создание и удаление групп пользователей

Создание и удаление групп пользователей происходит аналогичным образом, что и создание и удаление пользователей. Исключением является то, что в первом параметре метода Create указывается имя класса "Group" (листинг 9.7).

--------------------_г

..........................

Листинг 9.7. Создание новой группы пользователей

// Связываемся с компьютером

Computer = ПолагатьСОМОбъект("WinNT://" + ИмяКомпьютера);

// Создаем объект класса Group

User = Computer.Create("group", ИмяГруппы);

/ /Добавляем описание созданной группы User.Description = Описание;

// Сохраняем информацию на компьютере

User.Setlnfо();

Удаление группы происходит аналогично удалению пользователя — при помощи Метода Delete.

Манипулирование с учетными записями

С помощью службы WinNT Provider можно управлять учетными записями: создавать, изменять пароль, отключать учетные записи. Примеры создания и удаления были показаны в программных кодах, приведенных в листингах 9.5 и 9.6.

В листинге 9.8 приведен пример инициализации выдачи запроса на смену пароля, который должен появиться при следующем подключении пользователя.

Листинг 9.8. Смена пароля пользователя при следующем подключении

// Получаем объект пользователя

User = ПолнитьСОМОбъект ("WinNT://" + ИмяКомпьютера + "/" + ИмяПользователя + ",user");

// Указываем, что пользователь должен сменить пароль // при следующем подключении

User.Put("PasswordExpired", 1);

// Сохраняем информацию на компьютере

User.Setlnfo();

Предупреждение ("При следующем подключении пользователя " +

ИмяПользователя + " к компьютеру " + ИмяКомпьютера +

" будет запрошен ввод нового пароля.”) ,•

В данном примере в свойство пользователя PasswordExpired записывается значение 1, указывающее на то, что при подключении пользователя к компьютеру появится запрос на смену пароля. Метод setlnfo производит сохранение информации на компьютере.

С помощью свойства пользователя Account Disabled можно отключить или включить учетную запись, записав в него соответственно значение истина

ИЛИ Ложь.

В листинге 9.9 приведен пример отключения учетной записи.

............... ............... Г--.-'-""”"

Листинг 9.9. Отключение учетной // Получаем объект пользователя

User = ПолучитьСОМОбъе :кт("WinNT://" + ИмяКомпьютера + +

ИмяПользователя);

// Отключить учетную запись

User.AccountDisabled = Истина;

// Сохраняем информацию на компьютере

User.SetlnfoO ;

// Проверка отключения учетной записи

Сообщить("Проверка отключения учетной записи " + ИмяПользователя + " +

User.AccountDisabled);

С помощью свойства AccountExpirationDate можно ограничить срок действия учетной записи. В листинге 9.10 приведен пример, в котором учетная запись действительна до 5 июня 2007 ГОДИ.

I Листинг 9.10, Установить дату истечения действия учетной записи

// Получаем объект пользователя

User = ПолучитьСОМОбъект ("WinNT://" + ИмяКомпьютера + +

ИмяПользователя);

// Установить дату истечения действия учетной записи

User. AccountExpirationDate = "05/06/2007";

// Сохраняем информацию на компьютере

User.SetlnfoO;

^ Примечание_

При разборе данного примера обратите внимание на формат даты, передаваемой В СВОЙСТВО AccountExpirationDate.

Вывод информации о компьютере и пользователе

Как видно из табл. 9.1, служба WinNT Provider позволяет работать с множеством объектов, определенных в сети. Каждый из объектов имеет свой уникальный набор свойств, которые приведены в табл. 9.2.

^ Примечание_

Назначение данных свойств расписываться не будет.

Таблица 9.2. Свойства классов WinNTProvider
Имя класса Поддерживаемые свойства
Computer
Domain

FileService

FileShare

FPNWFileService

Division

Owner

OperatingSystem OperatingSystemVersion

Processor

ProcessorCount

MinPasswordLength

MinPasswordAge

MaxPasswordAge

MaxBadPasswordsAllowed

PasswordHistoryLength

AutoUnlocklnterval

LockoutObservationlnterval

HostComputer

DisplayName

Version

ServiceType

StartType

Path

ErrorControl

LoadOrderGroup

Description

MaxUserCount

ServiceAccountName

Dependencies

CurrentUserCount

Description

HostComputer

Path

MaxUserCount

HostComputer

DisplayName

Version

ServiceType

StartType

Path

ErrorControl

LoadOrderGroup

Таблица 9.2 (продолжение)
Имя класса Поддерживаемые свойства
FPNWFileService ServiceAccountName
Dependencies

Description

MaxUserCount

FPNWFileShare CurrentUserCount

HostComputer

Path

MaxUserCount

FPNWResource User

Path

LockCount

FPNWSession

Group

Namespace

PrintJob

PrintQueue

User

Computer

ConnectTime

Description

objectSid

Все перечисленные в таблице свойства

HostPrintQueue

User

TimeSubmitted

TotalPages

Size

Description

Priority

StartTime

UntilTime

Notify

TimeElapsed

PagesPrinted

Position

Action

ObjectGUID

PrinterPath

PrinterName

Model

Datatype

PrintProcessor

PrintDevices

Таблица 9.2 (продолжение)
Имя класса Поддерживаемые свойства
Pri.ntQueue Description

HostComputer Location

StartTime

UntilTime

DefaultJobPriority

JobCount

Priority

Attributes

BannerPage

ObjectGuid

Action
Resource

Service

Session

User

User

Path

LockCount

HostComputer

LoadOrderGroup

ServiceAccountName

Dependencies

StartType

ServiceType

DisplayName'

Path

ErrorControl

Computer

ConnectTime

IdleTime

User

AccountExpirationDate AutoUnlocklnterval BadPasswordAttempts

Description

FullName

HomeDirDrive

HomeDirectory

UserFlags

LockoutObservationlnterval

LoginHours

Таблица 9.2 (окончание)

Имя класса Поддерживаемые свойства

User LastLcgin

LastLogoff

LoginScript

LoginWorkstations

MinPasswordAge

MinPasswordLength

MaxBadPasswordsAllowed

MaxLogins

MaxPasswordAge

MaxStorage

ObjectSid

Parameters

PasswordAge

PasswordExpirationDate

PasswordExpired

PasswordHistoryLength

PrimaryGroupID

Profile

Важно отметить, что перечисленные в табл. 9.2 свойства не всегда будут доступны. Наличие тех или иных свойств зависит от версии операционной системы и версии установленной компоненты ADSI.

В листинге 9.1 I приведен пример вывода свойств компьютера (установленная операционная система, имя процессора и т. п.).

Листинг 9.11. Вывод информации о компьютере

¦НМНННННИНМММІННННІМПнНМИМЯІІННННЯШі

// Получаем объект компьютера

Computer = ПолучитьСОМОбъект("WinNT://" + ИмяКомпьютера);

// Выводим свойства компьютера

Сообщить("Division = " + Computer.Division);

Сообщить("Owner = " + Computer.Owner);

Сообщить("OperatingSystem = " + Computer.OperatingSystem);

Сообщить("OperatingSystemVersion = " + Computer.OperatingSystemVersion); Сообщить("Processor = " + Computer.Processor);

Сообщить("ProcessorCount = " + Computer.ProcessorCount);

Создав объект user, можно выводить свойства пользователя (имя пользователя, описание, время подключения, имя рабочей папки и т. п.). Пример вывода свойств пользователя приведен в листинге 9.12.

Листинг 9.12. Вывод информации о пользователе

... .................. ... :. .....................................П..—..л— ......................

// Получаем объект пользователя

User = ПолучитьСОМОбъект("WinNT://" + ИмяКомгіьютера + +

ИмяПользователя);

// Выводим свойства пользователя

Сообщить("FullName = " + User.FullName);

Сообщить("AccountExpirationDate = " + User.AccountExpirationDate); Сообщить("AutoUnlocklnterval = " + User.AutoUnlocklnterval);

Сообщить("BadPasswordAttempts = " + User.BadPasswordAttempts); Сообщить("Description = " + User.Description);

Сообщить("HomeDirDrive = " + User.HomeDirDrive);

Сообщить("HomeDirectory = " + User.HomeDirectory);

Сообщить("UserFlags = + Cser , UserFlags) ;

Сообщить("LockoutObservationlnterval = " +

User.LockoutObservationlnterval);

Сообщить("LoginHours = " + User.LoginHours);

Сообщить("LastLogin = " + User.LastLogin);

Сообщить ("LoginScri.pt = + User, LoginScr ipt) ;

Сообщить("MinPasswordAge = " +User.MinPasswordAge);

Сообщить("MinPasswordLength = " + User.MinPasswordLength);

Сообщить("MaxBadPasswordsAllowed = " + User.MaxBadPasswordsAllowed); Сообщить("MaxPasswordAge = " + User.MaxPasswordAge);

Сообщить("MaxStorage = " + User.MaxStorage);

Сообщить("ObjectSid = " + User.ObjectSid);

Сообщить("Parameters = " + User.Parameters);

Сообщить("PasswordAge = " + User.PasswordAge);

Сообщить("PasswordExpirationDate = " + User.PasswordExpirationDate); Сообщить("PasswordExpired = " + User.PasswordExpired);

Сообщить("PasswordHistoryLength = " + User.PasswordHistoryLength); Сообщить("PrimaryGroupID = " + User.PrimaryGroupID);

Сообщить("Profile = " + User.Profile);

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

Помимо перечисленных свойств каждый пользователь имеет уникальный идентификатор SID (user security identifier), который можно получить с помощью метода Get, в параметрах которого передать название свойства — objectsiD. Данный метод возвращает значение типа COMSafeArray, которое посредством метода выгрузить можно конвертировать в обычный массив. Далее, С ПОМОЩЬЮ конструкции Для каждого...из...Цикл...КонецЦикла МОЖНО обойти все элементы массива и собрать полный идентификатор.

Пример получения идентификатора пользователя приведен в листинге 9.13.

р-...........--------------г7

і Листинг 9.13. Вывод SID пользователя (user security identifier)

V 4 ДіІА________________ l-------..... ...—.I. ..—._____________

// Получаем объект пользователя

User - ПолучитьСОМОбъект("WinNT://" + ИмяКомпьютерэ + +

ИмяПользователя);

// Получаем SID (user security identifier)

Sid = User.Get("objectSID"); // получили тип COMSafeArray

Масс = Новый Массив !; ;

// Выгружаем COMSafeArray в массив Масс = Sid.Выгрузить();

ЗіаСтрока =

// Складываем все строки массива Для каждого Значение из Масс Цикл SidCTpOKa = SidCTpoKa + Значение +

КонецЦикла;

Сообщить("SID пользователя + ИмяПользователя + + SidCTpoKa)









-

'































Приложение

Описание

прилагаемого компакт-диска

В прилагаемом к книге CD-ROM содержатся исходные тексты программ всех примеров, которые в ней рассмотрены. Помимо примеров на диске содержится Offline-версия интернет-проекта ERP Group (), основателем которого является автор книги.

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

Таблица П. 1. Содержимое компакт-диска

Каталог\Файл Описание

Chapter 01\

ActiveBarCode.epf

ActiveBarCode.ert

Примеры, рассмотренные в главе 1.

Формирование штрихкода средствами ActiveBarcode для "1C:Предприятие 8.0"

Формирование штрихкода средствами ActiveBarcode для "1С:Предприятие 7.7"

HTML Editor.epf

Пример создания визуального редактора HTML-страниц для "1 (^Предприятие 8.0"

Примеры работы с объектом internetExplorer

для "1C:Предприятие 8.0"

Примеры работы с объектом InternetExplorer для "1С:Предприятие 7.7"

I nternetExplorer. epf

InternetExplorer.ert

Определение IP-адреса локального и удаленного компьютера для "1С:Предприятие 8.0"

Примеры использования помощников MS Agent для

"1С:Предприятие 8.0

Примеры использования помощников MS Agent для

"1С:Предприятие 7.7"

Примеры интерактивного взаимодействия с MS Agent для "1C: Предприятие 8.0"

IP.epf

MSAgent.epf

MSAgent.ert

MSAgentBalloonDialog.epf

Таблица П. 1 (продолжение)
КаталоіЛФайл Описание
Chapter01\ Примеры, рассмотренные в главе 1.

MSAgentBalloonDialog.ert Примеры интерактивного взаимодействия с MS

Agent для "1C:Предприятие 7.7"
Примеры работы с регулярными выражениями для "1 С:Предприятие 8.0"

RegExp.epf

WindowsMediaPlayer.epf Chapter 02\

ComputerSystemlnformatio

n.epf

WMI.epf

WMI.ert

WMICIassViewer.epf WmiServices. classes WmiServices.ert Chapter 03\

Пример использования проигрывателя Windows Media Player для "1С:Предприятие 8.0"

Примеры, рассмотренные в главе 2.

Вывод подробной информации об аппаратном и программном составе локального компьютера для "1C: Предприятие 8.0"

Примеры использования объектов WMI для ”1С:Предприятие 8.0"

Примеры использования объектов WMI для "1 С:Предприятие 7.7"

Инструмент просмотра всех классов WMI, их свойств и значений для "1С:Предприятие 8.0"

Файл со списком WMI-классов, который используется для загрузки классов в обработке WmiServices.ert

Инструмент просмотра всех классов WMI, их свойств и значений для "1С:Предприятие 7.7"

Примеры, рассмотренные в главе 3.

FileSystemObject.epf

Пример работы с файловой системой для "1С:Предприятие 8.0"

Пример запуска произвольного ?В-скрипта (VBS) для "1С:Предприятие8.0"

Пример чтения тегов До ?!) МРЗ-файлов для "1С:Предприятие 8.0

Примеры использования объектов wsh для "1С:Предприятие 8.0"

MSScriptControl.epf

ReadMP3Tags.epf

WSH.epf

Chapter 04\ Photoshop.epf

VSApplication.vbs

Примеры, рассмотренные в главе 4.

Примеры использования Adobe Photoshop в качестве OLE-сервера для версии "1С:Предприятие 8.0"

Пример использования OLE-соединения к БД "1C:Предприятие 8.0" из VBS

Таблица П. 1 (продолжение)
Каталог\Файл Описание
Chapter 04\ Примеры, рассмотренные в главе 4.
V8ApplicationCOMConnect Пример использования СОМ-соединения для

or.epf "1С:Предприятие 8.0"

V8COMConnector.vbs Пример использования СОМ-соединения к БД

"1 С:Предприятие 8.0" из VBS

WordCheckSpelling.epf Пример реализации проверки орфографии текстов

с помощью MSWord для "1С:Предприятие 8.0"

WordExcel.epf Примеры использования MS Word и Excel в качестве

OLE-сервера для "1 С:Предприятие 8.0"

WordMacros.epf Динамическое создание и выполнение макросов MS

Word для "1С:Предприятие 8.0"

Chapter 05\

ADO Demo.epf

ADO Demo.ert

ExcelADO.epf

HexDumper.epf

ProjectADO.epf

example, mpp

Chapter 06\

Примеры, рассмотренные в главе 5.

Пример подключения к произвольной БД средствами ADO для "1 С:Предприятие 8.0"

Пример подключения к произвольной БД средствами ADO для "1C:Предприятие 7.7"

Пример подключения к книге MS Excel средствами ADO для "1С:Предприятие 8.0"

Пример реализации шестнадцатеричного редактора средствами ADO для "ІС. Предприятие 8.0"

Пример подключения к проекту MS Project средствами ADO для "1 С:Предприятие 8.0"

Пример файла проекта, используемого в обработке ProjectADO.epf

Примеры обработок, рассмотренные в главе 6.

SQL-DMO Demo.ert Пример подключения MS SQL Server средствами

SQL-DMO/vin "1С:Предприятие7.7"

Chapter 07\ Примеры обработок, рассмотренные в главе 7,

ControlPanel.epf Примеры запуска команд управления Windows, ис

пользующие шпсІІІ32для "1C:Предприятие 8.0"

Chapter 08\ Примеры обработок, рассмотренные в главе 8.

Пример работы с FTP с помощью объекта

ЕТРСоединениедля "1 С:Предприятие 8.0"

Пример работы с FTP с помощью команды ftp для

"1 С’.Предприятие 7.7"

Таблица П. 1 (окончание)

КаталогЛФайл

Описание

Chapter 08\ Mail.epf

Mail.ert

RomPop3.ert

RomSmtp.ert

Chapter 09\ ADSI.epf

AddOn\

ActiveBarcode

ADSI

COMServices

COMViewer

IE60

MDAC

MSAgent

ROM-Mail

Wmi

Wmp

Wsh

XMLCore

ERPG.ru\

Примеры обработок, рассмотренные в главе 8.

Примеры работы с электронной почтой для "ІС.Предприятие 8.0"

Примеры работы с электронной почтой для "1 С: Предприятие 7.7"

Пример работы с протоколом POP3 для "1 ^Предприятие 7.7"

Пример работы с протоколом SMTP для "1 С:Предприятие 7.7"

Примеры обработок, рассмотренные в главе 9.

Примеры использования Active Directory Service Interfaces "1С:Предприятие 8.0"

Дополнительные файлы и необходи

мые для запуска некоторых примеров.

Установочный комплект ActiveBarcode 3.50

Microsoft Active Directory Service Interfaces version 2.5 (ADSI)

СОМ-объект (с исходными кодами на VB), предназначенный для работы с СОМ-обьектами в системе "1 С:Предприятие 7.7"

OLE/COM Object Viewer

Internet Explorer 6.0 — русская и английская версии

Microsoft Data Access Components 2.8

Установочный комплект Microsoft Agent 2.0, включая персонажи и SDK

Внешняя компонента ROM-Mail

Windows Management Instrumentation (WMI) Core 1.5 (Windows 95/98)

Distributed Component Object Model (DCOM) for Windows 95/98 1.3

Установочный комплект Windows Media Player 9.0 Windows Script 5.6 включая SDK MS XML Core 4.0

Offline-версия Web-проекта "ERP Group" Андрея Михайлова ()

Предметный указатель



OLE 2 130



OLE-объект 129



SQL-DMO 227

н



м

MAPI 282 Microsoft Agen 26

Win32_ComputerSystem 78 Windows Script Host 97 WinNT Provider 314 WMI-моникер 63

Д

Действия с ярлыками 115 Добавления сетевого принтера 88 Доступ:

к данным Microsoft Project 214 к метаданным 143

3

Закрытие:

документа MS Excel 165 презентации 177

A

Алгоритм:

отправки сообщений 288 получения писем 286

В

Вывод:

всех доменов локальной сети 317

специальных папок 113 списка пользователей группы 318

Выполнение запроса к данным OLE-базы 141

Вычисление выражений 134

Класс:

CIM_DataFile 85 StdRegProv 91 Win32_Account 78 Win32_DesktopMonitor 77 Win32_Group 78 80 Win32_LocalTime 82 Win32_LogicalDisk 63 67 Win32_NetworkAdapter 94 Win32_NetworkAdapter Configuration 93 Win32_NTEventLogFile 83 Win32_Printer 87 Win32_Process 72 Win32_Product 69 Win32_ScheduledJob 89 Win32_Service 71 Win32_Share 87 Win32_StartupCommand 77 Win32JTimeZone 82 Win32 WindowsProduct

Activation 77

Win32 0peratingSystem 75 WMI 61

Команда: mailto 281 ping 94

Компонента V7Plus.dll 286 Компонентная объектная модель 13

Компоненты универсального механизма доступа к данным 185

Контейнер приложения OLE 129 Копирование и вставка данных в документ Word 151 Копирование файлов и папок 104

м

Метод: Activate 147 Add 147
AnimationNames 30 Buttons.Add 44 CheckSpelling 161 Close 147

Connect 137, 230 .

InputBalloon 41 MoveTo 3 MsgBalloon 38, 39 NewObject 138, 139, 141 Open 147

Option Buttons. Add 44 Play 30 Printout 148 ShowFormBalloon 44 Speak 31 StartService 74 Stop 31 StopAll 31 SlopService 74 Terminate 74 Think 31 Uninstall 71 Перейти 46 Методы:

класса Win32_Product 70 объекта Command 194 объекта RegExp 54 объекта WshNetwork 119 объекта Документ 46 Механизм обработки строк 52 Модель СОМ 13 Модификация реестра 117

О

Обработка штрих кодов 22 Обращение к листам рабочей книги документа Excel 166 Объект:

Application 164 Balloon 35 Command 186, 192
Connection 186 Drive 100 Error 186 Field 187 File 100

FileSystemObject 100 Folder 100 FormBalloon 41 MAPIMessage 283 MAPISession 283 Record 187 RecordSet 186, 198 RegExp 54 Stream 187 SWbemLocator 64 Winsock 20 Word. Application 147 Объектная модель:

ADOX 202 WMI 59

Объекты WSH 97 Окно сообщений 126 Определение:

даты и времени 82 ІР-адреса 21, 94 временной зоны 82 домена 78

имени пользователя 80 локальных групп 80 разрешения экрана 77 списка программ автозагрузки 77 Отключение:

сетевого соединения 93 учетной записи 320 Отправка письма через SMTP-сервер 293

п

Перемещение файлов и папок 105

Печать документа PowerPoint 178 Поиск файлов 86
Показ слайдов 179 Получение сведений: о папках и файлах 102 об определенном диске 100 Получение списка: пользователей 81 установленных сервисов 73 всех доступных дисков 108 установленного программного обеспечения 70

Проверка существования диска каталога или файла 104 Программа ftp 303 Просмотр:

всех заданий планировщика 90 записей журнала событий 85 количества записей журнала событий 84 учетных записей 78

Р

Работа:

с Microsoft Word 146 с датой и временем 82 с журналами событий 83 с заданиями планировщика 89 с операционной системой 75 с сетевыми ресурсами 119 с файлами 85 с сетью 93

Регулярные выражения 52

С

Свойства:

MS Agent 33 класса Win32_

ComputerSystem 78 класса Win32_Product 69 компонента ActiveBarcode 22 объекта Command 193 объекта DBFile 235 (окончание рубрики см. на стр. 336)
Свойства (окончание): объекта LogFile 235 объекта Winsock 20 объекта WshNetwork 119 объектов WinNT Provider 321 ButtonsCaptions 39 Document 16 Font 45

OptionPressed 44 Style 151 Tables 159 UserName 80 приложения OLE 129 таблиц 153

Создание и удаление групп пользователей 319

Создание:

задания 90

копии журнала событий 84 нового параметра реестра 93 нового пользователя 318 нового оазпелр 9° обиокта 15

объекта приложения Adobe Photoshop 181 папок 105

текстовых файлов 106 ярлыков 114

ярлыков для URL-адресов і IЬ абзацев в документах MS Word 149

Создание и открытие документов MS Word 147

Сохранение презентации 177

Спецификации таблиц базы данных 230

т

Технология:

ActiveX 14 ADSI 313 WMI 60 СОМ 13

Транслирование сторонней информации 17

У

Удаление:

программного продукта 71 файлов и папок 105 Управление: анимацией 180 доступом к папкам 87 учетными записями 320 Установка: принтера 89 приоритета процесса 73

Ф

Функции управления программами 122

ч

Чтение:

значений ключей реестра 92

писем с РОРЗ, сервера 290

1C:

ПРЕДПРИЯТИЕ

7.7/8.0

СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ ИСПОЛЬЗУЙ возможности системы НА ВСЕ юо

МИХАЙЛОВ АНДРЕЙ ВИТАЛЬЕВИЧ

Автор имеет большой опыт коммерческой разработки информационных систем на базе платформы ”1С:Предприятие” версий 7.7 и 8.0, в том числе спроектированных и успешно внедренных "с нуля*. Несколько его разработок получили сертификат "1С:Совместимо! Система программ 1С:Предприя-тие". Принимал участие в разработке конфигураций "1 С:Управление производственным предприятием" на платформе ”1С:Предприятие 8.0", "1C-Papyc:CRM Управление продажами", "Астрософт. Деловое досье: Учет оборудования" и многих других. Имеет ряд сертификатов фирмы "1C", в том числе самые

разнообразные сертификаты по версии 8.0.

В настоящее время - вице-президент компании "Технологии успеха", которая занимается разработкой и внедрением информационных систем на базе платформы "1С:Предприятие 8.0".

Книга не является традиционным учебником по программированию в системе "1С:Предприятие". Основное внимание в ней уделено практическому использованию неявных, скрытых, но не менее важных, возможностей этой платформы, а также операционной системы и разнообразныхСОМ-объектов.

Книга представляет собой практическое руководство, предназначенное для программистов, разработчиков и администраторов системы "1С:Предприятие"при работе с технологиями ActiveX, COM, WMI и WSH, при интеграции с базами данных через интерфейсы ADO и SQL-DMO, при работе с Интернетом, электронной почтой и FTP, взаимосвязи с внешними приложениями и многим другим.

Главная цель книги - показать читателю, что возможности системы "1С:Предприятие* не ограничиваются только решениями задач для автоматизации документооборота.

В системе можно применять различные технологии программирования, которые активно используются при разработке приложений на "стандартных" языках и в других средах разработки.

Материал сопровождается большим количеством наглядных примеров. Книга ориентирована на программистов, разработчиков и администраторов различного уровня.

КАТЕГОРИЯ:

ПРОГРАММИРОВАНИЕ/1 С: ПРЕДПРИЯТИЕ

ISBN 5-94157-536-Х

785941 575367

Компакт-диск содержит все исходные тексты примеров, приведенных в книге, а также СОМ-объекты.

БХВ-ПЕТЕРБУРГ 190005, Измайловский пр., 29 E-mail: Internet: www bhv.ru Тел.:(812)251-4244 Факс:(812)251-1295



і Листинг 1.8. Вывод табличного документа для версии 7.7

янн—ниннниннннінниннннннннннннинннннннннняяннни^нннннннннннннннні

Таблица.ИсходнаяТаблица("Таблица");

Таблица.ВывестиСекцию("ШтрихКод");

Таблица.Показать("Штрихкод");

В данном примере предполагается, что:



Элемент ActiveBarCode в табличном документе находится в секции ШтрихКод.

2. Переменные номер, Тип и Показывать, введенные в свойствах элемента, объявляются и заполняются в коде до вывода таблицы (например, из диалога или справочника).



// Вывод модального вопроса

Ответ = Balloon.MsgBalloon("Вы действительно хотите закрыть обработку?",



"Внимание вопрос!". Characters);

Если Ответ = 6 Тогда

Сообщить("Вы выбрали ответ ""Да....');

Иначе

Сообщить("Вы выбрали ответ ""Нет""");

КонецЕсли;



linkTag = / (4lt;(a|\/a) ( [\s\Sj*?)>)/gi | scriptTag =/ (< (script!\/script) ([\s\S]*?)>)/gi I code = code.replace(htmlTag,""cfont color=#FF0000>$l"")

| code =code.replace(tableTag,""cfont color=#008080>$l"")



Процедура Переключить Режим (Документ, ПредыдущийРежим, НовыйРежим)

Если НовыйРежим = "Текст" Тогда sExpression = "

I document.body.inne rText = document.body.inne rHTML;

|document.body.innerHTML = colourCode(document.body.innerHTML);

I function colourCode (code)

l{

l htmlTag = /(< ([\s\S]*?)>)/gi

tableTag = /(Sit;(table ItbodyIth|tr|td|\/tableI\/tbodyI\/thI\ /tr|\/td)([\s\S]*?)>)/gi

| commentTag =/(<!—([\s\S]*?)>)/gi l i^geTag = / (<img([\s\S] *?) >) /gi



Листинг 2.5. Пример кода СОМ-объекта на языке Visual Basic

ИИИИІНИИИИИИИИИИІі- -уяИВВЯЯВНВНННВ^-.._—_________ ______—.-.-.:^ЯВЯНННВЯН

'Функция возвращает элемент коллекции ObjSet по номеру Number Public Function SnumerateCoIIection(ОЬ]Set, Number)

Dim Current As Integer Current = 0 .

For Each Obj In Obj Set

If Current = Number Then

Set EnumerateCollection = Obj Exit Function End If

Current = Current + 1

Next

End Function .

'Функция возвращает количество элементов коллекции Obj.Set Public Function GetCountCollection(ObjSet)

Dim Current As Integer Current = 0

For Each Obj In ObjSet

Current = Current + 1

Next

GetCountCollection = Current End Function

'Функция возвращает COM.....оОъект по моникеру или имени файла

Public Function GetCOMObject(Str)

Set GetCOMObject = GetObject(Str)

End Function



Данный пример является частью кода COM-объекта, созданного в среде Visual Basic. После компиляции мы получим библиотеку COMServices.dll, которая представляет СОМ-объект — COMServices. COM.



Зак. 722



Листинг 3.15. Вывод специальных папок в версии 8.0

// Функция возвращает путь к системной папке, указанной в параметре <Имя> Функция ПолучитьСистемнуюПапку(Имя)

Попытка

Ctrl = Новый СОМОбъект("MSScriptControl.ScriptControl");

// Указываем язык скрипта (VBS)

Ctrl .Language = "vbscript:" ;

// Добавляем код на VBS Ctr1.AddCode("



Function SpecialFolders (Name)

I Set Shell = CreateObject ('"'Wscript. Shell"”)

ISpecialFolders = Shell.SpecialFolders(Name) .



Зак. 722



| ЛистингСЮ. Варианты подключения к OLE-серверу .................................



— filuuu: --------•Х..І........—.—¦ ..............----------J

’ Подключение к БД файлового варианта Set FileDb = CreateObject("v8.Application")

FileDb.Connect("File=C:\Progra~l\lcv8\Db\Trade; Usr=MeaHOB; Pwd=super")

' Подключение к БД клиент-серверного варианта Set ServerDb = CreateObject("v8.Application")

ServerDb.Connect("Srvr=ServerlC; Ref=Trade; иБг=Иванов; Pwd=super")

Рассмотрим параметры подключения к базе данных в файловом варианте. О File — указывает на каталог базы данных.



г--;--———......——----

IЛ истинг4.37. Создание диаграммыс помощью мастера



_’_

// Создание диаграммы

Ch. Chart. Chartwizard (Excel. WorkBooks [1] .Worksheets [2] .Flange ["A1:C5"], -4100);

// Оформление диаграммы



Листинг 4.39. Выгрузка метаданных в MS Excelwrn версии 8.0

htillSSlih ¦ ¦ ....................XXiffiX...............................______________________________________1.................J

Попытка

Excel = Новый СОМОбъект("Excel.Application");

Исключение



Листинг 4.42. Запуск MS PowerPoint и открытие презентаций

// Создание объекта приложения PowerPoint

Арр = Новый СОМОбъект("PowerPoint.Application");

// Установка видимости окна приложения Арр,visible = Истина;

// Открытие презентации

Арр. Presentations.Open {"С:\Фундамент.ppt");

// Уничтожение объекта приложения

Арр.Quit();

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



----- •"•т-т.-г:--------т —------------—-——— —

Листинг 4.48. Запуск выполнения операции по имени

// Создание объекта приложения Photoshop

Photoshop = Новый СОМОбъект ("Photoshop.Application") ;

// Открытие картинки

PhotoDoc = Photoshop.Open("С:\picture.jpg">

// Запуск операции (Action) по имени Photoshop.PlayAction("Quadrant Colors");

// Сохранение картинки

PhotoDoc.SaveTo("С:\NewPicture.psd") // Закрытие документа PhotoDoc.Close() ;

// Уничтожение объекта приложения Photoshop.Quit();

Существенный недостаток данного примера состоит в том, что метод SaveTo не сохраняет автоматически документ, а открывает стандартный диалог сохранения файла. Для полной автоматизации всех действий над документом рекомендуется все операции (Action) заканчивать сохранением файла или установить отдельную операцию, которая будет сохранять документ в файл со всеми произведенными изменениями.

Помимо выполнения операции, с указанием ее имени, можно выполнить все определенные в Adobe Photoshop операции, перебрав коллекцию Actions объекта Photoshop (листинг 4.49).



20 8-байтовое целое со знаком

128 Двоичное значение

11 Булево значение

8 Символьная строка, заканчивающаяся символом Null (в кодировке Unicode)

129 Строковое значение



Денежная сумма (8-байтовое целое со знаком,

кратное 10 000)

1 Дата



133 Дата (в формате "ггггммчч")

134 Время (в формате "ччммсс")

135 Точная дата и время (в формате "гггг_мм_ чч_чч_мм_сс" плюс тысячные доли секунды)

14 Десятичное число с фиксированными разме

рами целой и дробной частей



5 Значение с плавающей точкой двойной точно

сти



0 Значение не определено



32-битовый код ошибки

72 Полностью уникальный идентификатор (GUID)

9 Указатель на интерфейс IDispatch OLE-объекта

3 4-байтовое целое со знаком

13 Указатель на интерфейс lUnknown OLE-объекта

205 Длинное двоичное значение (только для объек

та Parameter)

Длинное строковое значение, заканчивающееся символом Null (только для объекта Parameter)



// Описание переменных подключения ИмяФайла = "C:\demo.mdb";

СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ИмяФайла;

// Создадим экземпляр объекта ADOX Catalog Catalog = Новый СОМОбъект ("ADOX. Catalog") ;

// Создадим новый MDB-файл Catalog.Create(СтрокаПодключения);

В приведенном выше примере создается новая база данных заданного типа в заранее заданном каталоге. Затем можно добавить в эту базу данные таблиц и поля. Чтобы сделать это, необходимо:



Создать новый экземпляр объекта Table и добавить его в коллекцию Tables объекта Catalog.

2. Создать новый экземпляр объекта Column и добавить его в коллекцию Columns объекта Table.



Листинг8.2. Инициализация сеанса связи МАЙ;. ::

А., 1..... .......... л; і.о_,_щт.и .....г. А-..:.... ...і

// Элемент управления Session

SessionCtrl = СоздатьОбъект("MSMAPI.MAPISession") ;

// Элемент управления Messages



    Бухгалтерия: Автоматизация - Система 1С