Михайлов А.М.- 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 <Insert>.
0000000ІЛБ b знос^ставныи капитал
ПродаяОговаров покупателю Ма... і
! Оплата покупателя Магазин ’В..
Я:
Операция
ОАО
Операция
02.06.2003 19:30:22 | ОАО "Глобус"
02^08.200319:31:5б I ОАО
1Глобус"
кнопку
Операция
Операция
03.06.200312:00:00 ІОАО“Глобус"
Операция
"Глобус"
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. Получение всех
Попытка
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("<Hl>IIpHMep формирования HTML страницы</Н1>");
Документ.Write("<Р>Пишите <а href=""mailto:mav@erpg.ги"">письма</А>"); Документ.Close();
Данный пример демонстрирует динамическое формирование HTML-документа, но не редактирование его. Для реализации возможности полноценного редактирования документа предназначен метод ExecCommand (Command, изегІпДегІіасе, Value). Здесь, как уже было сказано ранее, command — это имя выполняемой команды, userinterface — необязательный логический параметр (принимает значения истина или ложь), который отвечает за вывод пользовательского интерфейса команды (если таковой имеется). Если данный параметр опущен, то его значение будет — Ложь, value — необязательный параметр, указывающий дополнительные значения для команды.
Важно отметить, что метод ExecCommand может работать с выделенным текстом.
С помощью данного метода можно: преобразовывать обычный текст в полужирный (выделенный текст будет помещен в теги <STRONGX/STRONG>); наклонный; задавать цвет фона; цвет текста; вставлять гиперссылки, рисунки и многое другое (листинг 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 содержит описание этого шрифта (как в теге <FONT>);
П 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<sA
; Обычный
згІЭІФ
<• I 1
• Arial
<CENTERXA > > </A > </CENTER> class=tdtbl
Sir
></TCx/TR>
vAlign=top>
<TD class=tdtbb colSpan=2
проекта: </H2>< I
href= "forum, erpg. ги">Перейти
форум
на
wldth="33%'
<Н2>Голосование</Н2> <!
<Н2>Новости
number*40"
><ДР>
<Н2>Подписка на новости проекта</Н2>'
первыми узнавать все новости нашего проекта - подпишитесь на них и Вы никогда не пропустите ничего интересного.
action=http://subscribe,ru/member/quick target=_blank><INPUT type=hidden value=quick name=action> <INPUT type=hidden value=comp. soft. prog.erpg name=grp> value="Bam e-mail" name=email>
value=OK> < INPUT tvpe=hidden value = list comp.soft, proa.erect name
<Р>Чтобы
method=post
<FORM
INPUT
type=submlt
maxLength=100
<INPUT
rc>
0 6 авторе Закрыть
Рис. 1.12. Цветовая раскраска тегов в HTML-редакторе
Листинг 1.29. Процедура переключения между режимами с цветовой раскраской тегов
I code = code.replace(conmentTag,
""<font color=#808080>$l</font>"")
I code = code.replace(imageTag,""<font color=#800080>$l</font>"")
I code = code.replace(linkTag,""cfont color=#008000>$l</font>"")
I code = code.replace(scriptTag,""<font color=#800000>$l</font>"")
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 —;__________________________-----------------— ( —....
// Описание регулярного выражения (шаблона)
РегулярноеВыражение = "<BODY (.*)</BODY>";
// Определение строки
ТестоваяСтрока = "<HTML><BODY bgcolor=#FFAABBXP>3To npnMep</P></BODY> </HTML>";
// Создание объекта работы с регулярными выражениями 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><p>3To пример</р>" является первым совпавшим образцом, т. е. текст, попавший в скобки " (.
л; " в шаблоне (для второго совпадения нужно выполнить метод SubMatches (1) и т. д.);
? последняя строка — "<BODY bgcolor=#FFAABBxp>3To пример</р> </BODY>" (свойство value) представляет полный образец.
Для того чтобы получить цвет фона, определенного в теге <BODY> в переменной ТестоваяСтрока достаточно изменить регулярное выражение на
строку (# [0-9A-F] {6})". При этом свойство SubMatches (0) вернет как раз необходимую строку "#ffaabb", содержащую цвет в шестнадцатеричной системе счисления.
Для проверки совпадения строки с регулярным выражением используется метод Test. В листинге 1.31 приведен пример такой проверки.
- II fjj] tp
?|i , . _ ¦ . ; . ,м ; • ' щ "
rr‘h
r‘
r'"IT"’ . jij j :
Листинг 1.31. Проверка совпадений регулярного выражения в строке
// Описание регулярного выражения (шаблона)
РегулярноеВыражение = "(#[0-9A-F]{6})";
// Определение строки
ТестоваяСтрока = "cHTMLXBODY bgcolor=#FEAABBXP>3ro npHMep</P></BODY> </HTML>";
// Создание объекта работы с регулярными выражениями RegExp = Новый СОМОбъект("VBScript.RegExp");
RegExp. MultiLine = Ложь;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp. Pattern = РегулярноеВыражение;
// Проверка совпадений регулярного выражения в строке Если RegExp.Test(ТестоваяСтрока) Тогда Сообщить("Найдены совпадения!");
Иначе
Сообщить("Совпадений нет!");
КонецЕсли;
Данный пример приведен для системы "1С:Предприятие 8.0". В версии 7.7 метод Test будет возвращать при значении истина и о при значении
Ложь.
Для демонстрации работы метода Replace рассмотрим пример, приведенный в листинге 1.32, который заменит текст, находящийся в тегах <р>, на другой.
¦' .....- ----------------------------------------------------
ТіТ----
Листинг 1 ;32. Заме на совпадения регулярного выражения в строке // Определение строки
ТестоваяСтрока = "<HTML><BODY Ьдсо1ог=#ІТЕААВВ><Р>Это npMMsp</P></BODY> </HTML>"; // Определение регулярного выражения
RegExp.Pattern = "<Р>( . *?)</Р>";
// Замена текста в переменной ТестоваяСтрока на другую
НовкйТекст = RegExp. Replace (ТестоваяСтрока, "<Р>Новь;й текст в теге Р!</Р>")
// Вывод нового текста
Сообщить ("Текст после замены: " + Символы. ПС + НовыйТекст);
В результате работы метода Replace переменная НовыйТекст будет содержать
строку "chtmlxbody bgcolor=# ffaabb хржовый текст в теге
Р! </px/bodyx/html> ".
В данном случае в тестируемой строке будет только одна пара тегов <РХ/Р>. Но вы можете сами добавить еще одну пару и проверить работоспособность кода.
Содержание раздела