<<

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

СОДЕРЖАНИЕ

>>

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



Characters.Balloon.FontName = "Comic Sans MS";
Characters .Balloon. FontSiz-e = 24;
Characters.Think("Добрый день, приятной работы!")
36 Глава 1

Интерактивное взаимодействие с MS Agent
Все, о чем говорилось ранее, так или иначе связано с односторонним обще-
нием персонажа с пользователем. Чтобы организовать интерактивное взаи-
модействие пользователя с MS Agent (организация предупреждения, ввода
значений, выбора из списков и т. п.), необходимо прибегнуть к сторонним
разработкам, т. к. сама по себе технология MS Agent не позволяет этого делать.
Существует множество подобных разработок, большая и лучшая часть кото-
рых являются коммерческими, хотя и не дорогими (обычно не более $10).
Для однозначности остановимся на разработке BalloonDialog 6.5 ActiveX
компании SommyTech.

^ Примечание
Загрузить демо-версию BalloonDialog 6.5 можно на сайте производителя —
http://www.sommytech.com.ar.

Компонент BalloonDialog позволяет:
П работать совместно с MS Agent;
О выводить модальные предупреждения (замена стандартного оператора
Предупредить);
П выводить сообщения с флажком (замена стандартного оператора сооб-
щить);
П выводить вопросы с предложением различных вариантов ответов (замена
стандартного оператора вопрос);
CD показывать диалог ввода текста (замена стандартного оператора ВвестиСтроку);
П выводить сложные диалоговые окна, состоящие из текстовых полей, полей
для ввода текстов, комментариев, кнопок и радиокнопок одновременно.

Ошибка!
Вы не имеете прав для входа в данный

ОК




Рис. 1.6. Вывод модального окна предупреждения BalloonDialog
совместно с Microsoft Agent
Применение технологий СОМ и ActiveX 37

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




Попытка
// Устанавливаем ссылку на объект
Agent = Новый СОМОбъект("Agent.Control.2");
Исключение
Сообщить("MS Agent не установлен! " ;
)
Сообщить("Загрузить MS Agent можно с сайта Microsoft —
http://www.microsoft.com/msagent/");
Возврат;
КонецПопытки;


Попытка
// Создаем объект BaiioonDiaiog
Balloon = Новый СОМОбъект("BlnDialogT.Balloon");
// Сброс всех установок свойств в значения по умолчанию
Balloon.ResetProperties();
Исключение
Сообщить("BaiioonDiaiog не установлен!");
Сообщить("Загрузить BaiioonDiaiog можно с сайта SommyTech —
http://www.sonmytech.com.ar");
Возврат;
КонецПопытки ;


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


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


Создание объекта Balloon в версии 8.0 системы "1С:Предприятие" выполня-
ется С ПОМОЩЬЮ конструктора— Новый СОМОбъект("В1п01а1од. Balloon"),
в версии 7.7 — СоздатьОбъект ("BinDialog. Balloon"). Если вы используете
Глава 7
38

демо-версию, то имя СОМ-объекта будет "BinDialogT.Balloon", при этом
каждый раз при инициализации будет появляться окно с информацией о про-
изводителе и просьбе зарегистрироваться.
Метод MsgBaiioon выводит рядом с персонажем диалог и ждет, пока пользо-
ватель нажмет кнопку. Он возвращает целое число — номер, соответствую-
щий нажатой кнопке и имеет четыре параметра. Первый параметр метода —
строка сообщения; второй — целое число, определяющее набор кнопок диа-
лога и тип отображаемой на поле диалога иконки; третий — строка заголовка
диалога; четвертый — ссылка на персонаж MS Agent. Используя последний
параметр, окно диалога автоматически позиционируется на экране в зависи-
мости от положения персонажа. Кроме того, при перетаскивании персонажа
пользователем диалог объекта Balloon перемещается вместе с ним.
С помощью этого же метода, как показано в листинге 1.21, можно заменить
и стандартную функцию встроенного языка вопрос (рис. 1.7).



Внимание вопрос!
Вы действ1<гтелы-ю хотите закрыть
обработку?




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




// Вывод модального вопроса
Ответ = Balloon.MsgBaiioon("Вы действительно хотите закрыть обработку?",
36, "Внимание вопрос!", Characters);
Если Ответ = 6 Тогда
Сообщить("Вы выбрали ответ ""Да ';
)
Иначе
Сообщить("Вы выбрали ответ ""Нет""");
КонецЕсли;
Применение технологий СОМ и ActiveX 39

По сравнению с предыдущим кодом в методе MsgBaiioon появился второй
параметр. Как уже было сказано, второй параметр означает целое число,
определяющее набор кнопок диалога и тип отображаемой на поле диалога
иконки. Точнее этот параметр определяется суммой двух чисел: кодом набо-
ра кнопок и кодом типа иконки диалога.
Например, число 36 (4+32) обозначает, что диалог будет содержать кнопки
Yes и No (код 4) и отображаться иконка с вопросом (код 32).
Все возможные наборы кнопок, которые применяются в BaiioonDialog,
приведены ниже.
П о — отображается только кнопка ОК.
П 1 — отображаются кнопки ОК и Cancel.
CJ 2 — отображаются кнопки Abort, Retry и Ignore.
П з — отображаются кнопки Yes, No и Cancel.
О 4 — отображаются кнопки Yes и No.
О б — отображаются кнопки Retry и Cancel.
Кроме этого, в BaiioonDialog допускается пять типов иконок диалога.
П 16 — отображается иконка Ошибка.
П 32 — отображается иконка Вопрос.
П 4 8 — отображается иконка Предупреждение.
П 64 — отображается иконка Информация.
П 80 — отображается произвольная иконка, определяемая свойствами
IconPicture ИЛИ URLIconPicture.
Как уже было сказано, метод MsgBaiioon возвращает номер, соответствую-
щий нажатой кнопке.
П 1 — если пользователь нажал кнопку ОК.
П 2 — если пользователь нажал кнопку Cancel.
П з — если пользователь нажал кнопку Abort.
П 4 — если пользователь нажал кнопку Retry.
П 5 — если пользователь нажал кнопку Ignore.
О б — если пользователь нажал кнопку Yes.
П 7 — если пользователь нажал кнопку No.
Так как система "1С:Предприятие" в основном используется в России и с рус-
ским интерфейсом, то крайне желательно, чтобы все кнопки выводились на
русском языке. Чтобы изменить названия кнопок, существует свойство
ButtonsCaptions. Вообще говоря, с помощью этого свойства можно пере-
именовывать кнопки абсолютно произвольным образом (рис. 1.8).
40 Глава 1



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

Чай Сок
Кофе




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


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



// Задаем произвольные названия для кнопок
Balloon.ButtonsCaptions="&OK;&Сок;П&рервать;&Повторить;&Игнорировать;&Чай
;&Кофе";
// Выводим модальный вопрос
Ответ = Balloon.MsgBalloon("Предлагаю отдохнуть и перекусить!", 35, "Вни-
мание вопрос!", Characters);
Если Ответ = 6 Тогда
Сообщить("Чай закончился!");
ИначеЕсли Ответ = 1 Тогда
Сообщить("Кофе не закупили!");
ИначеЕсли Ответ = 2 Тогда
Сообщить("Сок выпил кот!");
КонецЕсли;


// Вернем названия кнопок в более привычный вид, причем русский
Balloon. ButtonsCaptions='40K;0&TMeHa;n&pepBaTb; Повторить ;Шрнорировать;&
Да;&Нет";


Символ & в заголовке кнопки ставится перед "горячим" или подчеркнутым
символом для отработки комбинации <Alt>+<подчеркнутый символХ
41
Применение технологий СОМ и ActiveX

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


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

JQK___ j | Обмена




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

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




// Диалог ввода текста
Имя = Balloon.InputBalloon("Введите Ваше имя.", "Имя пользователя",
"Андрей Михайлов", Characters);
// Сообщение, выводящее введенный текст
Balloon.MsgBalloon(Имя,, "Здравствуйте!", Characters);


Метод inputBalloon имеет четыре параметра. Первый — текст сообщения,
второй — заголовок сообщения, третий — значение, подставленное в поле
ввода по умолчанию, и четвертый — ссылка на персонаж.
Помимо довольно простых диалогов BalloonDialog позволяет конструиро-
вать довольно сложные диалоговые окна, включающие в себя сообщения,
комментарии, кнопки, радиокнопки, поля ввода. Специально для этого су-
ществует объект FormBalloon.
Приведем пример, в котором пользователю предлагается диалог выбора од-
ного из нескольких справочников; после выбора справочника должна от-
крываться его форма списка (рис. 1.10).
42 Глава 1


Открыть справочник
Список справочников
в Банковские счета
в Валюты
в Виды деятельности
• Контрагенты
О Нематериальные активы
В диалоге показаны первые 5
справочников

и Отмена \\




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

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

чг 1.24. Выбор справочника из радиокнопок в BalloonDialog для версии 7.7

// Добавление кнопки
Balloon.FormBalloon.Buttons.Add("&0тмена");


// Добавление радиокнопок
Для Ном = 1 По Мин(Метаданные.Справочник() , 5) Цикл
Balloon.FormBalloon.OptionButtons.Add(Метаданные.Справочник(Ном) . Пред-
ставление () ) ;
КонецЦикла;


Balloon.FormBalloon.TextBox = 0; // Поле ввода не показываем
Balloon.FormBalloon.TBoxLines = 3; // Трехстрочный текст
Применение технологий СОМ и ActiveX 43_

// Текст по умолчанию
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;
//Из метаданных получаем имя справочника
ИмяСправочника = Метаданные.Справочник(НомерПозиции).Идентификатор;
ОткрытьФорму("Справочник." + ИмяСправочника); // Открываем форму
КонецЕсли;



ОКНОПОК В BalloonDialog для Е

// Добавление кнопки
Balloon.FormBalloon.Buttons.Add("&OTMeHa");


// Добавление радиокнопок
Количество = 1;
Для каждого Справочник Из Метаданные.Справочники Цикл
Balloon.FormBalloon.OptionButtons.Add(Справочник.Представление())
Количество = Количество + 1;
Если Количество = 6 Тогда
Прервать;
КонецЕсли;
КонецЦикла;


Balloon.FormBalloon.TextBox = Ложь; // Поле ввода не показываем
Balloon.FormBalloon.TBoxLines = 3; // Трехстрочный текст
_44 . Глава 1

/I Текст по умолчанию
Balloon.FormBalloon.TBoxText = "Некоторый текст для ввода";

Balloon.FormBalloon.Title = "Открыть справочник"; // Заголовок диалога
Balloon.FormBalloon.Message = "Список справочников"; // Сообщение диалога
Balloon.FormBalloon.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, которое может принимать два значения:
П о — диалоговое окно закрылось без нажатия на кнопку;
П 1 — диалоговое окно пользователь закрыл нажатием на какую-либо
кнопку.
Для определения номера позиции выбранной пользователем радиокнопки
используется СВОЙСТВО OptionPressed.
Работа с метаданными преднамеренно не описывается, т. к. это не является
темой данной главы.
Применение технологий СОМ и ActiveX 45

Вы так же можете изменить шрифт текстов, выводимых в диалоге. Для этого
у объекта 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".

ii HTML Editor 1.0 e MAV _ПX
:
J? trl <J |3j;
˜˜
;
:'JL*i^Z
Обычный

forum.erpg.ru ••> Работа о системе 1С.:Г1редпр*ятие В.о | лучший форум о систем. leva



Ваше мнение о курсам
i дистанционного обучения по Вт Июн 08, 2004 9 : 4 4 рт
Valentin
8.0 Андрей Михайлов aka MAV *


! VU.Application Пи Июн 07, 2004 Ili42 «m
kaliki 221

Пт Июи 04, 2004 7|4в рт
Прошу помочь в освоении 8.0 175
Helen
;
kaliki ^D

Wv !| Методичка по работе в 1C V8 ;
Чт Июн 03, 2004 5:52 ргш
sov 425
' Полубвнский Алексей CALX)

Ср Июн 02, 2004 12:37 pm
112
Гость ^0

{! Создание Внешний Компонент Be Май 30, 2004 10:31 am
12S
для v8 6RP <3roup TO




^ Об авторе" Закрыть
;


Рис. 1.11. Визуальный HTML-редактор
Глава 1
46_

Основным элементом данной формы является Полентмьдокумента, который
имеет один очень важный метод — перейти, и одно не менее важное
свойство — документ. Метод перейти переводит элемент управления
Полентмьдокумента на страницу с заданным адресом, который определяется
в единственном параметре метода. Свойство документ возвращает значение
типа сомобъект, которое предоставляет доступ к HTML-документу.
Рассмотрим основные методы объекта документ.
П Open ( ) — открывает новый поток для методов write и writeLn;
О Close ( ) — закрывает текущий документ;
П write (Text) — записывает HTML-текст в текущий открытый поток;
О writeLn (Text) — аналогичен методу write, но добавляет в конец возврат
каретки;
П ExecCommand (Command, Userlnterface, V a l u e ) — выполняет команду
над всем выбранным фрагментом, при этом переменные метода опреде-
ляются как:
• Command — идентификатор команды, подлежащей выполнению;
• Userlnterface — признак того, нужно ли при необходимости предос-
тавлять графический интерфейс (необязательный параметр);
• value — значение команды (необязательный параметр);
П QueryCommandEnabied (Command) — возвращает двоичное значение, пока-
зывающее, доступна ли заданная команда;
О QueryCommandValue (command) — возвращает текущее значение заданной
команды;
О ElementFromPoint (x, Y) — возвращает элемент, которому принадлежит
точка, заданная координатами х и у;
П QueryCommandSupported (Command) — возвращает признак, доступна ЛИ
заданная команда;
П QueryCommandstate (Command) — возвращает текущее состояние команды;
П QueryCommandlndetermtCommand) — Возвращает Признак, НЗХОДИТСЯ ЛИ
команда в неопределенном состоянии или нет;
О createEiement (Tag) — создает объект элемента заданного тега;
Рассмотрим пример формирования простейшей HTML-страницы (лис-
тинг 1.26).
47
Применение технологий СОМ и ActiveX




Документ = ЭлементыФормы.ПолеНТМЬДокумента.Документ;
Документ.Open();
Документ. WriteLn("<Hl>IIpHMep формирования HTML страницы</Н1>");
Документ.Write("<Р>Пишите <А href=""mailto:mav@erpg.ги"">письма</А>");
Документ.Close();


Данный пример демонстрирует динамическое формирование HTML-
документа, но не редактирование его. Для реализации возможности
полноценного редактирования документа предназначен метод
ExecCommand(Command, Userlnterf асе, V a l u e ) . Здесь, как уже было сказа-
но ранее, command — это имя выполняемой команды, Userinterface — не-
обязательный логический параметр (принимает значения истина или ложь),
который отвечает за вывод пользовательского интерфейса команды (если
таковой имеется). Если данный параметр опущен, то его значение будет —
ложь, value — необязательный параметр, указывающий дополнительные
значения для команды.
Важно отметить, что метод ExecCommand может работать с выделенным тек-
стом.
С помощью данного метода можно: преобразовывать обычный текст в по-
лужирный (выделенный текст будет помещен в теги <STRONGX/STRONG>);
наклонный; задавать цвет фона; цвет текста; вставлять гиперссылки, рисун-
ки и многое другое (листинг 1.27).




// Раскрасить выделенный фрагмент в красный цвет
Документ.execCommandC'ForeColor", Ложь, "FFOOOO");
// Выделить текст полужирным шрифтом
Документ.execCommand("Bold", Ложь};
// Вставить рисунок
Документ.execCommand("Insertlmage", Ложь, "C:\Img\mav.jpg");
// Отформатировать текст по правому краю
Документ.execCommandC'JustifyRight", Ложь);
// Установить для выделенного фрагмента текста шрифт Arial
Документ.execCommand("FontName", Ложь, "Arial");
// Отформатировать текст как заголовок второго уровня
Документ.execCommand("FormatBlock", Ложь, "<Н2>");
Глава 1
48

Приведем полный список доступных команд.
П Backcoior — устанавливает или получает цвет фона текущего выделения
(value должно содержать имя цвета или его шестнадцатеричный RGB
эквивалент, например, FFCCOO);
П Bold — переключает начертание текста текущего выделения между полу-
жирным и нормальным;
П сору — копирует выделение в буфер обмена;
П createBookmark — получает имя якоря или создает его для текущего вы-
деления (value — строка, содержащая имя якоря);
П CreateLink — получает URL-ссылки или создает новую ссылку (пара-
метр value должен содержать URL);
П cut — вырезает текущее выделение в буфер обмена;
П Delete — очищает текущее выделение (удаляет все его содержимое);
О Find — находит текст, заданный в параметре value в текущем выделении;
О FontName — устанавливает шрифт для текущего выделения, причем value
содержит описание этого шрифта (как в теге <FONT>);
П Fontsize — устанавливает размер шрифта (value — число от 1 до 7
включительно);
О ForeCoior — устанавливает цвет текста, при этом Value должно содер-
жать имя цвета или его шестнадцатеричный RGB-эквивалент (например,
FFCCOO);
П FormatBiock — устанавливает или получает форматирование текущего
блока (value может содержать теги-описатели);
П indent — увеличивает отступ выделенного текста на одну единицу при-
ращения;
О InsertButton — перезаписывает идентификатор кнопки вместо текущего
выделения (value — строка, содержащая идентификатор кнопки);
П insertFieidset — вставляет поля ввода;
П insertHorizontaiRuie — вставляет горизонтальную полосу;
О insertiFrame — вставляет встроенный фрейм (IFRAME);
О insertimage — вставляет изображение;
П insertinputButton — вставляет кнопку;
П InsertlnputCheckbox — вставляет флажок (checkBox);
П insertinputFiieUpioad — вставляет элемент выбора файла;
П insertinputHidden — вставляет скрытое поле (hidden);
П insertinputimage — вставляет изображение;
Применение технологий СОМ и ActiveX 49

П insertinputPassword — вставляет поля ввода пароля;
О insertinputRadio — вставляет радиокнопку (Radio);
П insertinputReset — вставляет кнопку Reset;
П insertinputsubmit — вставляет кнопку submit;
П insertinputText — вставляет поля ввода текста;
П insertParagraph — вставляет новый раздел (абзац);
П insertorderedList — переключает стиль текущего выделения между ну-
мерованным списком и простым текстом;
П insertunorderedList — переключает стиль текущего выделения между
маркированным списком и простым текстом;
П insertseiectoropdown — записывает элемент Drop-down вместо теку-
щего выделения (value должно содержать идентификатор элемента);
П InsertTextArea — вставляет элемент TextArea;
О italic — переключает начертание текста текущего выделения между на-
клонным и обычным;
П Justifycenter — устанавливает выравнивание по центру для всего блока,
в котором расположено текущее выделение;
П j u s t i f y L e f t — устанавливает выравнивание по левому краю для всего
блока, в котором расположено текущее выделение;
О justifyRight — устанавливает выравнивание по правому краю для всего
блока, в котором расположено текущее выделение;
О outdent — уменьшает отступ для всего блока, в котором расположено
выделение, на одну единицу;
П overwrite — переключается между режимами вставки текста и замены
текста при вводе (значением value может быть истина — замена, ложь —
вставка);
О Paste — вставляет текст из буфера обмена вместо текущего выделения;
П Refresh — обновляет текущий документ;
П Remove Format — удаляет из текущего фрагмента все теги форматирова-
ния;
П SeiectAil — выделяет все содержимое документа;
П unBookmark — удаляет все закладки из текущего выделения;
П underline — переключает начертание текста текущего выделения между
подчеркнутым и обычным;
П unlink — удаляет все гиперссылки из текущего выделенного фрагмента;
П unselect — снимает выделение.
50 Глава 1

С помощью объекта документ можно переключать представления редакти-
руемого HTML-документа между режимами визуального редактирования,
текстового и режимом просмотра.
Для переключения между режимами необходимо знать не только в какой режим
нужно перевести HTML-документ, но и из какого. В листинге 1.28 приведен
пример процедуры, которая производит данное переключение.
г -˜""—;---——-——--—————-------—-— ..-..,„-..,.-..,- ..,
| Листинг 1.28. Процедура переключения между режимами

Процедура ПереключитьРежим(Документ, ПредыдущийРежим, НовыйРежим)
Если НовыйРежим = "Текст" Тогда
Документ.Body.InnerText = Документ.Body.InnerHTML;
ИначеЕсли ПредыдущийРежим = "Текст" Тогда
Документ.Body.InnerHTML = Документ.Body.InnerText;
КонецЕсли;


Если НовыйРежим = "Просмотр" Тогда
Документ.Body.ContentEditable = "false";
Иначе
Документ.Body.ContentEditable = "true";
КонецЕсли;
КонецПроцедуры


Данная процедура имеет три параметра:
П документ — ссылка на объект документ;
П ПредыдущийРежим — строка, описывающая ранее использованный режим
документа, причем этот параметр может принимать значения текст
И Просмотр;
П НовыйРежим — строка, описывающая новый режим документа.
При использовании процедуры, описанной в листинге 1.29, для переключе-
ния в режим редактирования HTML-кода существует довольно большой не-
достаток — весь код отображается одним цветом, что очень затрудняет его
чтение и понимание, в то время как все современные редакторы выделяют
разными цветами различные группы тегов. Чтобы раскрасить код в окне ре-
дактора, необходимо запустить специальный скрипт, который будет выпол-
няться средствами компоненты Internet Explorer.
Приведем пример процедуры переключения между режимами с возмож-
ностью раскраски тегов (рис. 1.12) в режиме редактирования HTML кода
(листинг 1.29).
Применение технологий СОМ и ActiveX 51

ш HTML Editoi 1.0 *MAV _DX
I У ol Х'&ф :, . •••'., %, :_S = <• * жxч Б s Тй м ;˜ ;˜ ;г ;.* ..;, >V


<CENTER><A href="forurn.erpq.ru">riepeHTn на форум
&gt;&gt; </Ax/CENTER> <ЯО>
<TD class=tdtbl width="33%">
<Н2>Голосование</Н2><1— ^Include virtua!="po!l ssi.php?poll _id=2" --

<TR vAlign=top>
<TD class=tdtbb colSpan=2 rowSpan=9>
<Н2>Новости проекта :</Н2><! — #include virtual ="news/show_news.php?
number=40" — ><ДО>
,<TD class=tdtbl>
<Н2>Подписка на новости проекта</Н2>'
<Р>Чтобы первыми узнавать все новости нашего проекта - подпишитесь
на них и Вы никогда не пропустите ничего интересного.
<FORM action=http://subscribe,ru/rnember/quick method=post
target=_blank><INPUT type=hidden value=quick name=action> <INPUT
type=hidden value=cornp. soft. prog. erpg name=grp> < INPUT
maxLength=100 value="Bam e-mail" пзте=егпаП> <INPUT type=submit
value=OK> < INPUT tvpe=hidden value = list сотр. soft. ргоаегоа name=src;
т
Об авторе Закрьггь

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



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


Процедура Переключить Режим(Документ, ПредыдущийРежим, НовыйРежим)
Если НовыйРежим = "Текст" Тогда
sExpression = "
I document.body.innerText = document.body.innerHTML;
|document.body.innerHTML = colourCode(document.body.innerHTML);
I function colourCode(code)
|{
| htmlTag = /(sit;([\s\S]*?)sgt;)/gi
| tableTag = /(&lt;(table!tbody|th|tr|td|\/tableI\/tbodyI\/th|\
/tr|\/td)([\s\S]*?)sgt;)/gi
| commentTag = /(Sit;!—([\s\S]*?)&gt;)/gi
| imageTag = /(&lt;img([\s\S]*?)&gt;)/gi
I linkTag = / (sit;(a|\/a) ([\s\S]*?)&gt;)/gi
| scriptTag = / (&lt; (script I\/script) ([\s\S]*?)&gt;)/gi
I code = code.replace(htmlTag,""<font color=#FFOOOO>$K/font>"")
| code = code.replace(tableTag,""<font color=t008080>$K/font>"")
52 Глава 1
I code = code.replace(commentTag,
""<font color=#808080>$K/font>"")
I code = code.replace(imageTag,""<font color=#800080>$K/font>"")
I code = code.replace(linkTag,""<font color=#008000>$K/font>"")
I code = code.replace(scriptTag,""<font color=#800000>$K/font>"")
I return code;
IP;
Документ.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.
Применение технологий СОМ и ActiveX 53

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

Символ Назначение
Соответствует выражению, находящемуся до знака "*", взятому ноль или
большее количество раз. Например, шаблон " [0-9] *" определяет стро-
ку, содержащую ноль или большее количество цифр
\ Предназначен для определения символа, являющегося метасимволом.
Например, шаблон "." соответствует любому символу, а шаблон "\." бу-
дет соответствовать точке
Определяет начало входной строки
$ Определяет конец входной строки
+ Соответствует выражению, находящемуся до знака "+", взятому один
или более раз. Например, шаблон " [ 0 - 9 ] + " определяет строку, содер-
жащую одну или более цифр
. (точка) Определяет любой символ, кроме символа перевода строки
I Разделяет два выражения. Например, шаблону "а |Ь" будут соответство-
вать строки "а" и "Ь"
[a-z] Определяет диапазон символов. Например, шаблон " [0-9]" определяет
цифру
[Л • • • ] Определяет любой символ, не соответствующий заданному набору. На-
Л
пример, шаблон " [ 0 - 9 ] " определяет любой символ, кроме цифры
\w Слово. То же, что и [a-zA-z_0-9]
Все, кроме слов. То же, что и [ A a-zA-z_0-9]
\w
\s Любое пустое место
\s Любое непустое место
\d Десятичная цифра. То же, что и [0-9]
He цифра. То же, что и [ А 0 - 9 ]
\D
{} В фигурных скобках указывается количество символов, подходящих по
описанное ранее правило
() С помощью круглых скобок можно объединять метасимволы в группы


Для лучшего понимания синтаксиса регулярных выражений рассмотрим
несколько примеров.
П " (два | три) богатыря" — соответствует как строке, которая может при-
нимать значение как "два богатыря", так и "три богатыря".
" . + @ . + \ . . + " — соответствует e-mail-адресу.
П
54 Глава 1

П " а ( . ) \1с" — соответствует одному символу "а", затем любым двум оди-
наковым символам, потом символу "с". Например, шаблон совпадет
С "аххс", НО не С "ахус".
CJ " ( \ d \ d ) \. \ 1 \ . \ d \ d \ d \ d " — соответствует дате, у которой число и месяц
одинаковы, то есть дата "09.09.2001" - подойдет, а дата
" 0 9 . 1 2 . 2 0 0 1 " — нет.
П " \ d { 2 } - \ d { 5 } " — данный шаблон проверяет правильность номера иден-
тификатора, состоящего из двух цифр, дефиса, и еще пяти цифр.
П " < ( . * ) > . *<\/\1>'.'— шаблон соответствует тегу HTML.
Для использования в системе механизма регулярных выражений необходимо
создать СОМ-объект с идентификатором VBScript.RegExp.
Объект RegExp имеет следующие свойства:
Р Global — признак поиска соответствия во всей строке, причем если
свойство принимает значение истина, то поиск ведется во всей строке,
если ложь — то только до первого совпадения;
П ignorecase — признак игнорирования регистра символов при поиске
(свойство может принимать значение истина и л о ж ь ) ;
О Pattern — строковый шаблон для поиска;
П MultiLine — признак, является ли текст многострочным или нет (свой-
ство может принимать значение истина и л о ж ь ) .
Рассмотрим три метода объекта RegExp.
П Test (ИсходнаяСтрока) — метод Test позволяет протестировать строку
исходнаяСтрока на соответствие ее шаблону (pattern). Возвращает значе-
ние истина, если строка, переданная в качестве параметра, соответствует
определенному шаблону, ложь — иначе.
П Execute (ИсходнаяСтрока) — метод выполняет поиск всех совпадений
регулярного выражения в строке исходнаяСтрока и возвращает коллек-
цию MatchCoiiection, которая содержит в себе всю информацию о сов-
падениях. Метод Execute может быть использован, например, для извле-
чения всех e-mail-адресов из строки ИсходнаяСтрока.
П Replace(ИсходнаяСтрока, НоваяСтрока) — МСТОД Replace дает ВОЗМОЖ-
НОСТЬ заменить все совпадения регулярного выражения строкой но-
ваяСтрока.
В листинге 1.30 приведен пример использования метода Execute и разбора
коллекции MatchCoiiection.
Применение технологий СОМ и ActiveX 55




// Описание регулярного выражения (шаблона)
РегулярноеВыражение = "<BODY (.*)</BODY>";
// Определение строки
ТестоваяСтрока = "<HTMLXBODY bgcolor=#FFAABBXP>3TO пример</РХ/ВОО?>
</HTML>";


// Создание объекта работы с регулярными выражениями
RegExp = Новый СОМОбъект("VBScript.RegExp");
RegExp.MultiLine = Ложь;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.Pattern = РегулярноеВыражение;


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


// Обход элементов коллекции MatchCollection
Для каждого Match Из Matches Цикл
Сообщить("Номер первого совпавшего символа: " + Match.Firstlndex);
Сообщить("Длина совпавшего образца: " + Match.Length);
Сообщить("Первый совпавший образец: " + Match.SubMatches(0));
Сообщить("Полный образец: " + Match.Value);
КонецЦикла;


В результате выполнения такого кода в окне сообщений появятся следую-
щие строки:
П первая — число б (свойство Firstlndex) определяет номер первого сов-
павшего символа (т. е. символа "Ь");
П вторая строка — 46 (свойство Length) определяет длину совпавшего об-
разца;
П третья строка— "bgcoior=#FFAABBxp>3To пример</р>" является первым
совпавшим образцом, т. е. текст, попавший в скобки " ( • * ) " в шаблоне
(для второго совпадения нужно выполнить метод SubMatches ( i ) и т. д.);
П последняя строка — "<BODY ьдсо1ог=#грдАввхр>это пример</р>
</BODY>" (свойство value) представляет полный образец.
Для того чтобы получить цвет фона, определенного в теге <BODY> в пере-
менной ТестоваяСтрока достаточно изменить регулярное выражение на
56 Глава 1

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

.31. Проверка совпадений регулярного вь

// Описание регулярного выражения (шаблона)
РегулярноеВыражение = " ( # [ О - 9 A - F ] { б } ) ";
// Определение строки
ТестоваяСтрока = "<HTML><BODY bgcolor=#FFAABBXP>3ro пример</Р></ВООУ> </HTML>";


// Создание объекта работы с регулярными выражениями
RegExp = Новый СОМОбъект("VBScript.RegExp");
RegExp.MultiLine = Ложь;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.Pattern = РегулярноеВыражение;


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


Данный пример приведен для системы "1С:Предприятие 8.0". В версии 7.7
метод Test будет возвращать -1 при значении истина и о при значении
Ложь.
Для демонстрации работы метода Replace рассмотрим пример, приведен-
ный в листинге 1.32, который заменит текст, находящийся в тегах <р>, на
другой.

на совпадения регулярного выражения в строке

// Определение строки
ТестоваяСтрока = "<HTML><BODY bgcolor=#FFAABBXP>3ro пример</Р></ВООУ> </HTML>";
// Определение регулярного выражения
Применение технологий СОМ и ActiveX _ 57

RegExp. Pattern = "<р> ( . *?) </Р>";
// Замена текста в переменной ТестоваяСтрока на другую
НовыйТекст = RegExp. Replace (ТестоваяСтрока, "<Р>Новый текст в теге

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

В результате работы метода Replace переменная НовыйТекст будет содержать
строку "<HTMLXBODY Ьдсо1ог=#ГГААВВХР>Новый текст в теге
P!</PX/BODYX/HTML> ".
В данном случае в тестируемой строке будет только одна пара тегов <РХ/Р>.
Но вы можете сами добавить еще одну пару и проверить работоспособ-
ность кода.
Глава 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 — для чтения или редактирования системного реестра). Понятно, что
это неудобно, т. к., во-первых, приходилось осваивать множество не связан-
ных друг с другом технологий и инструментов, а во-вторых, усложнялось
Глава 2
60

взаимодействие разных компонентов компьютерной системы друг с другом
(например, настройки в локальном реестре рабочей станции могли кон-
фликтовать с политиками безопасности, которые заданы на сервере).
С появлением Windows 2000 эта ситуация была в основном исправлена.
Появилась встроенная в операционную систему консоль управления ММС
(Microsoft Management Console), с помощью которой можно из одной точ-
ки управлять большинством логических и физических компонентов ком-
пьютерной сети, построенной на основе Windows. В свою очередь, это
стало возможным именно благодаря применению технологии WMI. Дан-
ная технология, во-первых, делает доступ к информации о самых различ-
ных компонентах информационной системы (журнал событий, системный
реестр, подсистема производительности, драйверы устройств и т. д.) неза-
висимым от типа этих компонентов, а во-вторых, осуществляет управле-
ние любой подсистемой стандартным, не зависящим от реализации этой
подсистемы, методом.
Итак, технология WMI — это глобальная концепция настройки, управления
и слежения за работой различных частей корпоративной компьютерной се-
ти. В частности, используя WMI, можно с помощью специальных утилит
или сценариев Windows Script Host (WSH) решать ряд важных задач.
П Управление различными версиями операционной системы 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.
Администрирование Windows средствами WMI 61


Доступ к объектам WMI
Для программирования WMI разработан набор классов, которые осуществ-
ляют управление объектами WMI. Ввиду большого их количества, ограни-
чимся рассмотрением только основных, с которыми обязательно придется
работать.
О swbemLocator — обеспечивает доступ к объекту swbemServices, который
осуществляет подключение к WMI. Предоставляет дополнительные воз-
можности проверки подлинности при установлении соединения.
П swbemServices — обеспечивает доступ к экземплярам управляемых объ-
ектов, выполняет запросы к классам WMI, выполняет другие связанные
с WMI операции.
П swbemobjectset — является коллекцией объектов swbemobject. Создать
объект swbemobjectset и получить к нему доступ можно при помо-
щи нескольких методов, принадлежащих объектам swbemServices
И SWbemObject.
П swbemobject — представляет собой определение одного класса WMI
в форме экземпляра объекта.
Подробное описание всех объектов, их свойств и методов можно найти
на сайте Microsoft Developer Network Library (MSDN) —
http://msdn.microsoft.com/library/.
Для доступа к WMI через библиотеку сценариев WMI из системы
"1 (^Предприятие" нужно сделать три шага, которые являются общими для
большинства сценариев WMI. Первое — необходимо подключиться к служ-
бе Windows Management Service, второе — получить экземпляры управляе-
мых объектов WMI, третье — вызвать метод или получить доступ к свойст-
вам управляемого объекта. После знакомства с интерфейсами, которые
используются для выполнения этих трех шагов, гораздо увереннее чувству-
ешь себя на пути к вершине искусства написания сценариев.
Самое неприятное в этих основных трех шагах то, что код их написания до-
вольно коренным образом отличается в разных версиях "1C: Предприятия"
(7.7 и 8.0). Причем многие конструкции в версии 7.7 штатными средствами
просто не выполнить, поэтому приходится прибегать к внешним вспомога-
тельным инструментам.
Для доступа к объектам WM1 из "1С:Предприятия" версии 8.0 вполне хвата-
ет стандартных языковых конструкций внутреннего языка, поэтому сначала
будут описаны алгоритмы подключения именно для этой версии.
Рассмотрим пример подключения к классу win32_Logicaioisk (листинг 2.1).
62 Глава 2




// Создать указатель на объект SWbemLocator
Попытка
Locator = Новый СОМОбъект("WbemScripting.SWbemLocator");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;


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


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


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

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



// Шаг 1. Подключение к WMI на удаленном компьютере
ServicesSet = Locator.ConnectServer("MainServer", "root\cimv2", "Admin",
"password");

Рассмотрим каждый из параметров метода ConnectServer в отдельности.
П Первый — имя удаленного компьютера (для локального указывается точ-
ка ".").
П Второй — имя пути для WMI. По умолчанию root\cimv2 можно не ука-
зывать;
О Третий — имя пользователя (для авторизации).
П Четвертый — пароль пользователя (для авторизации).
Администрирование Windows средствами WMI 63

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

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

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


// Шаг 1. Подключение к WMI на локальном компьютере
ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\
" + ИмяКомпьютера + "\root\cimv2");


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


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


В данном примере для подключения к WMI на целевом компьютере и дос-
тупа ко всем экземплярам класса win32_Logicaioisk используется WMI-
моникер (moniker) winmgmts. Моникер — это специальный СОМ-объект, ко-
торый отыскивает в сети или создает и инициализирует экземпляр объекта и
возвращает клиенту указатель на него. Для повышения безопасности WMI-
моникер использует встроенные средства аутентификации, а также позволя-
ет устанавливать дополнительные маршруты к объектам.
Сценарий возвращает каждый экземпляр win32_LogicaiDisk как swbemobject из
коллекции SWbemObjectSet. SWbemObjectSet И SWbemObject — ЭТО ЛИШЬ Два ИЗ
нескольких интерфейсов, которые предоставляет библиотека сценариев WMI. Так
как SWbemObjectSet является коллекцией, то доступ к ее элементам можно орга-
низовать При ПОМОЩИ КОНСТРУКЦИИ Для каждого..Лз...Цикл...КонецЦикла. ВнуфИ
цикла организован доступ к свойству caption, которое определено в классе
Win32_LogicalDisk.
Самое интересное в этом примере то, что на втором шаге пишется текст
запроса, который очень похож на конструкции структуризированного языка
запросов (SQL). Благодаря этому мы можем выбрать не все экземпляры вы-
борки, а только необходимые, т. е. соответствующие некоторым условиям
отбора.
64 Глава 2

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

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

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

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

В данном примере тип диска (oriveType), равный трем, соответствует жест-
ким дискам. Это бывает довольно удобно для ограничения выборки элемен-
тов и повышения производительности системы.
Хотя варианты подключения с помощью моникера и объекта swbemLocator
функционально одинаковы, они демонстрируют действие различных меха-
низмов, заложенных в библиотеке WMI. Новичкам может показаться, что
синтаксис моникера излишне запутан, поэтому вначале они могут поработать
С SWbemLocator. С ТОЧКИ ЗрСНИЯ фунКЦИОНЗЛЬНОСТИ МСТОД ConnectServer,
который предоставляет swbemLocator, позволяет распределять полномочия,
необходимые для проведения аутентификации WMI-соединения. Синтаксис
моникера предоставляет возможность выполнения нескольких действий в од-
ной строке кода.
Теперь рассмотрим, как все то же самое выполняется в системе
"1С:Предприятие" версии 7.7.
Сразу необходимо отметить, что в версии 7.7 невозможно штатными средст-
вами:
П перебрать элементы коллекции, так как в 7.7 нет цикла, аналогичному
КОНСТРУКЦИИ Для каждого...Из...Цикл...КонецЦикла;
П получить доступ к экземплярам классов, если используется WMI-моникер,
так как в 7.7 нет аналога функции получитьсомобъект.
Это довольно серьезные ограничения, связанные с работой СОМ-объектов,
но вполне решаемые с помощью вспомогательных внешних компонент или
дополнительных СОМ-объектов, которые можно написать на любом другом
языке программирования. Так как эта глава книги (как, впрочем, и многие
другие) посвящена СОМ-технологиям, то и для обхода ограничений версии 7.7
будет использоваться СОМ-объект.
Администрирование Windows средствами WMI 65

Для обхода данных ограничений понадобятся всего три функции (лис-
тинг 2.5):
О функция получения очередного элемента коллекции;
П функция получения количества элементов в коллекции;
П функция, заменяющая функцию получитьсомобъект в версии 8.0.

I Листинг 2.5. Пример кода СОМ-объекта на яз

'Функция возвращает элемент коллекции ObjSet по номеру Number
Public Function EnumerateCollection(ObjSet, Number)
Dim Current As Integer
Current = 0 .
For Each Obj In Ob j Set
If Current = Number Then
Set EnumerateCollection = Obj
Exit Function
End If
Current = Current + 1
Next
End Function .


'Функция возвращает количество элементов коллекции ObjSet
Public Function GetCountCollection(ObjSet)
Dim Current As Integer
Current = 0
For Each Obj In ObjSet
Current = Current + 1
Next
GetCountCollection = Current
End Function


'Функция возвращает СОМ-объект по моникеру или имени файла
Public Function GetCOMObject(Str)
Set GetCOMObject = GetObject(Str)
End Function

Данный пример является частью кода СОМ-объекта, созданного в среде
Visual Basic. После компиляции мы получим библиотеку COMServices.dll,
которая представляет СОМ-объект — coMServices. COM.
3 Зак. 722
66 Глава 2

Местоположение файла COMServices.dll не важно, главное зарегистрировать
его в системе командой regsvr32 COMServices.dll.
Теперь рассмотрим, как описанные ранее три шага подключения к WMI
будут выглядеть в версии 7.7 с использованием вспомогательного СОМ-
объекта COMServices (листинг 2.6).
иммнищщив
доступа к объектам WMI для версии 8.0

// Создать указатель на объект COMServices
Попытка
COMServices = СоздатьОбъект("COMServices.COM");
Исключение
Предупреждение("Ошибка загрузки СОМ-объекта COMServices.");
Возврат;
КонецПопытки;


// Создать указатель на объект SWbemLocator
Попытка
Locator = СоздатьОбъект("WbemScripting.SWbemLocator");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;


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


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

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры
Для Ном = 0 По ObjectSet.Count-1 Цикл
Item = COMServices.EnumerateCollection(ObjectSet, Ном);
Сообщить("Имя: " + Item.Caption);
КонецЦикла;


В данном примере используется конструкция цикла Для...По...Цикл...конецЦикла
от нуля до количества элементов (свойство count) коллекции минус один.
Внутри цикла вызывается метод EnumerateCollection объекта COMServices,
Администрирование Windows средствами WMI 67

в который передается ссылка на коллекцию objectset и номер извлекае-
мого элемента коллекции. Во всем остальном код ничем не отличается от
аналогичного кода в версии 8.0. Важно отметить, что не каждый класс имеет
свойство Count. Если оно отсутствует, то для определения количества эле-
ментов в коллекции применяется метод GetcountCoiiection объекта
COMServices.
Рассмотрим второй вариант подключения к объектам WMI с помощью мо-
никеров в версии 7.7 (листинг 2.7).
„ ,—.., —, ,
Листинг 2.7. Подключение к серверу с помощью моникера для версии 7.7

// Сетевое имя компьютера, к которому производится подключение
ИмяСервера = " "
.;


// Шаг 1. Подключение к 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.EnumerateCollectiori(ObjectSet, Ном);
Сообщить("Имя: " + Item.Caption);
КонецЦикла;


Данный пример модифицировался лишь в том, что на первом шаге добавил-
ся вызов метода GetCOMObject для получения объекта swbemServices.
В следующих частях этой главы будут показаны примеры практического
применения технологии WMI. Большинство примеров будет написано толь-
ко для версии 8.0 системы "1С:Предприятие". При необходимости перевести
их в формат версии 7.7 не составит труда.


Сбор данных об аппаратном составе
В листинге 2.1 приведен пример вывода названий всех имеющихся логических
дисков локального компьютера. Помимо названий класс win32_LogicaiDisk
имеет еще очень большое количество свойств, таких как описание, файло-
Глава 2
68

вал система, метка диска и т. п. В листинге 2.8 приведен пример вывода ос-
новных свойств каждого элемента класса win32_Logicaioisk.




// Создать указатель на объект 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).

| Листинг 2.9. Вывод всех свойств класса win32_Logic
L.._ ; ' , „ __ „. , _7Г__.'

// Шаг 3. Просмотр SWbemObjectSet, содержащего экземпляры
Для каждого Item Из ObjectSet Цикл
Сообщить("Диск: " + Item.Caption);
// Выборка по всем свойствам
Для каждого Свойство Из Item.Properties_ Цикл
Администрирование Windows средствами WMI 69

Сообщить(Свойство.Name + " = " + Свойство.Value);
КонецЦикла;

КонецЦикла;

На практике чаще всего обращаются к конкретному свойству по его имени,
однако нужно учитывать, что каждый класс имеет свой набор свойств.
Помимо класса win32_Logicaioisk есть еще ряд классов, позволяющих по-
лучать информацию об аппаратном составе локального или удаленного ком-
пьютера. Наиболее интересные из них следующие:
С) win32_Processor — информация о процессорах;
П win32_BaseBoard — информация о материнской плате;
П win32_DiskDrive — информация о дисковых накопителях (HDD);
П win32_physicaiMemory — информация о физической памяти (RAM);
П win32_SoundDevice — информация о звуковых картах;
О win32_NetworkAdapter — информация о сетевых адаптерах;
П win32_CDROMDrive — информация о приводах CD-ROM;
П win32_FioppyDrive — информация о дисководах (Floppy);
G win32_DesktopMonitor — информация о мониторах;
П win32_videocontroiier — информация о видеосистеме;
П win32_printer — информация о принтерах;
П win32_Keyboard — информация о клавиатуре;
П win32_PointingDevice — информация о точечных манипуляторах (мы-
ши, трекболы и т. п.);
П win32_usBHub — информация о портах USB.


Работа с программным обеспечением
Для работы с программным обеспечением предназначен класс win32_Product.
Единственное ограничение данного класса состоит в том, что он работает
только с тем программным обеспечением, которое было установлено с по-
мощью Microsoft Windows Installer (MSI).
Основные свойства класса win32_Product:
О Name — название продукта;
П Description — описание;
П identifyingNumber — идентификационный номер продукта (например
серийный номер или номер аппаратного устройства);
70 Глава 2

П instaiioate — дата инсталляции;
П instaliLocation — путь к продукту;
О vendor — производитель;
П version — версия.
Основные методы win32_Product:
П I n s t a l l ( P a c k a g e L o c a t i o n , Options, A l l U s e r s ) — установка продукта,
причем параметры метода определяются как:
• PackageLocation — путь К файлу установки;
• Options — параметры командной строки;
• Aiiusers — признак установки продукта для всех пользователей;
П Reinstall (ReinstaiiMode) — переустановить продукт с параметром:
• ReinstaiiMode — режим переустановки продукта (например i — ско-
пировать только недостающие файлы, б — обновить все файлы).
П uninstaiio — удалить целиком продукт.

Внимание
Все методы возвращает о, если они завершены успешно. Иначе возвращается
ЧИСЛО 2 1 4 7 5 4 9 4 4 5 .


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

иг 2.10. Получение списка установленного программного обеспечения

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_Product");
Для каждого Item Из Items Цикл
Сообщить("Имя: " + Item.Name + " (Вер." + Item.Version + " " ;
))
КонецЦикла;

Если есть необходимость получить список программного обеспечения по
какому-либо условию, можно в запросе использовать выражение where.
Приведем пример получения списка всех продуктов компании Microsoft,
установленных в операционной системе (листинг 2.11).
Администрирование Windows средствами WMI 71
,..
.. .-,,--. — -. ——'i
| Листинг 2.11. Получение списка продуктов Microsoft

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_Product Where Vendor
LIKE '%Microsoft%'");
Для каждого Item Из Items Цикл
Сообщить("Имя: " + Item.Name + " (Вер." + Item.Version + " " ;
))
КонецЦикла;


В данном примере используется фильтр по маске — "%Microsoft%". Это оз-
начает, что в запрос попадут все объекты, у которых свойство vendor содер-
жит строку "Microsoft".

Удаление программного обеспечения
Для удаления какого-либо программного продукта используется метод
uninstaii класса win32_product. Приведем пример удаления программы
Adobe 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 Цикл

<<

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

СОДЕРЖАНИЕ

>>