<<

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

СОДЕРЖАНИЕ

>>


// Выборка объектов из коллекции Drives
Для каждого Диск Из FSO.Drives Цикл
Стр = flncK.DriveLetter;
Если flncK.DriveType = 3 Тогда
Стр = Стр + " - ." + flHCK.ShareName;
ИначеЕсли Диск.IsReady Тогда
Стр = Стр + " - " + flncK.VolumeName;
Иначе
Стр = Стр + " - [Диск не найден]";
КонецЕсли;
Сообщить(Стр);
КонецЦикла;



FSO = Новый СОМОбъект("Scripting.FileSystemObject")
Folder = FSO.GetFolder("C:\");

// Выборка всех папок
Использование скриптов WSH Ю9

Для каждого Папка Из Folder.SubFolders Цикл
Сообщить("[" + ВРег(Папка.Name) + " " ;
])
КонецЦикла;

// Выборка всех файлов
Для каждого Файл Из Folder.Files Цикл
Сообщить(НРег(Файл.Name));
КонецЦикла;


В листинге 3.12 приведен пример вывода списка только папок и файлов од-
ного уровня, находящихся в корневом каталоге диска С:. Для построения
дерева папок и файлов можно использовать данный пример, который дол-
жен находиться в функции, вызываемой рекурсивно.

Чтение свойств МРЗ-файлов
Как уже было показано ранее, с помощью объекта FileSystemObject можно
обращаться к файлам.
Рассмотрим следующую задачу. Допустим необходимо прочитать теги (IDvl)
МРЗ-файла. Тегами обычно называют свойства МРЗ-файла, включающими
в себя информацию об авторе, названии, размере файла и т. п. Для решения
данной задачи необходимо выполнить следующие действия:
1. Создать объект FileSystemObject для доступа к файлам.
2. Проверить наличие необходимого файла на диске.
3. Получить ссылку на объект File с помощью метода GetFiie.
4. Прочитать размер файла с помощью метода F i l e . s i z e и проверить, что-
бы он был не менее 128 байт.
5. Открыть файл для чтения. Метод Fiie.openAsTextstream(i) возвращает
объект Stream.
6. Получить строку, содержащую последние 128 байт, в которых и хранятся
теги МРЗ-файла.
7. Проверить наличие в начале полученной строки символов "TAG".
8. Выделить из строки нужные теги согласно спецификации МРЗ-файлов.
Рассмотрим пример чтения тегов МРЗ-файла (листинг 3.13).
„„„-„ „__

3.13. Чтение тегов МРЗ-файлг

// Переменная ИмяФайла должна содержать строку, содержащую путь к МРЗ-файлу
Если (ИмяФайла = Неопределено) или СокрЛП(ИмяФайла = "") Тогда
Сообщить("Не указано имя файла!");
110 Глава 3

Возврат;
КонецЕсли;


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


// Проверка на наличие файла
Если НЕ FSO.FileExists(Имяфайла) Тогда
Сообщить("Файл не найден!");
Возврат;
КонецЕсли;


// Получаем размер файла и проверяем, чтоб он был не менее
минимально допустимого
File = FSO.GetFile(Имяфайла);
FileLength = File.Size;


Если FileLength <= 128 Тогда
Сообщить("Файл малого размера!");
Возврат;
КонецЕсли;


// Открываем файл для чтения (параметр = 1)
Попытка
Stream = File.OpenAsTextStream(l);
Исключение
Сообщить("Невозможно открыть файл!");
Возврат;
КонецПопытки;


// Считываем строку с информацией (IDSvl)
Stream.Skip(FileLength - 128);
Попытка
Data = Stream.Read(128);
Использование скриптов WSH Щ
Исключение
Сообщить("Невозможно прочитать файл!");
Возврат;
КонецПопытки;


// Закрываем поток и удаляем объекты
Stream.Close() ;
File = Неопределено;
FSO = Неопределено;

// Проверяем полученную строку на корректность
Если Лев(Data, 3) <> "TAG" Тогда
Сообщить("Неверный формат файла! ") ;
Возврат;
КонецЕсли;


// Перечисляем все жанры, встречающиеся в спецификации к МРЗ-файлам
Жанры = Новый Массив();
Жанры.Добавить("Blues");
Жанры.Добавить("Classic Rock");
// и т.д...
Жанры.Добавить("JPop");
Жанры.Добавить("Synth Pop");


// Выделяем из строки нужные поля
Название = СокрЛП(Сред(Data, 4, 30));
Артист = СокрЛП(Сред(Data, 34, 30));
Альбом = СокрЛП(Сред(Data, 64, 30));
Год = СокрЛП(Сред(Data, 94, 4));
Комментарий = СокрЛП(Сред(Data, 98, 30));
Трек = КодСимвола(Сред(Data, 127, 1));
НомерЖанра = КодСимвола(Сред(Data, 128, 1));


Если НомерЖанра < Жанры.Количество() Тогда
Жанр = Жанры[НомерЖанра];
Иначе
Жанр = " ;
"
КонецЕсли;
112 Глава 3

// Выводим теги
Сообщить("Название: " + Название);
Сообщить("Артист: " + Артист);
Сообщить("Альбом: " + Альбом);
Сообщить("Год: " + Год);
Сообщить("Комментарий: " + Комментарий);
Сообщить("Трек: " + Трек);
Сообщить("Жанр: " + Жанр);


Файлы МРЗ хранятся в формате Unicode. Однако, к сожалению, версия 7.7
системы "1С:Предприятие" не позволяет работать с такими форматами.
В связи с этим, напрямую в версии 7.7 теги МРЗ-файлов прочитать не уда-
ется. Для чтения тегов в данном случае нужно использовать внешние ком-
поненты или объект Msscriptcontroi.scriptcontroi, вынося весь код
в VB-скрипт.


Специальные папки
Бывают ситуации, когда необходимо записать какой-либо файл в специаль-
ную папку (на рабочий стол, в избранное, включить в автозагрузку и т. п.).
В английской версии Windows существует папка Startup (Автозагрузка), и
если вы, например, укажите путь C:\WINDOWS\DiaBHoe меню\Программы\
Автозагрузка, то эта запись сработает только в русской версии Windows и
нигде больше. Чтобы избежать этих проблем, был создан список специаль-
ных папок. Чтобы получить доступ к какой-либо специальной папке, можно
воспользоваться методом speciaiFoiders объекта wshSheii. Данный метод
имеет один параметр — строку, описывающую имя специальной папки.
Рассмотрим возможные параметры метода SpeciaiFoiders:
П AiiusersDesktop — рабочий стол (для всех пользователей);
П AiiusersstartMenu — меню Старт (для всех пользователей);
П AiiusersPrograms — меню Программы (для всех пользователей);
О Aiiusersstartup — Автозагрузка (для всех пользователей);
О Desktop — рабочий стол;
П Favorites — Избранное;
П Fonts — шрифты;
П MyDocuments — Мои документы;
О NetHood — папка NetHood;
П FrintHood — папка PrintHood;
Использование скриптов WSH 113

П Programs — меню Программы;
О Recent — последние запуски;
П sendTo — меню Отправить;
П startMenu — меню Старт;
П startup — Автозагрузка;
О Templates— шаблоны.
Рассмотрим пример вывода некоторых специальных папок в системе
"1С:Предприятие" версии 7.7 (листинг 3.14).

лстинг 3.14. Вывод специальных папок в версии 7.7
-.i,_l_ — -^—_.
-- 1 -
_„_, „_,._..-_.i_i._.: . . .
... . __.._: __-,«..




WSHShell = СоздатьОбъект("WScript.Shell");

Сообщить("Автозагрузка: " + WshShell.SpecialFolders("Startup"));
Сообщить("Программы: " + WshShell.SpecialFolders("Programs"));
Сообщить("Мои документы: " + WshShell.SpecialFolders("MyDocuments"));
Сообщить("Шрифты: " + WshShell.SpecialFolders("Fonts"));
Сообщить("Меню 'Старт': " + WshShell.SpecialFolders("StartMenu"));

В версии 7.7 все довольно просто и прозрачно. А вот в 8.0, по непонятным
причинам, данный код вызывает ошибку. Чтобы обойти эту ошибку, можно
использовать объект MSScrlptControi. Scriptcontfbi, в котором и получать
путь, указывающий местоположение специальных папок, после чего воз-
вращать их в контекст системы "Ю.Предприятие". Рассмотрим пример по-
лучения специальных папок через VB-скрипт (листинг 3.15).
Г " ""ШННННННИ1
i Листинг 3.15. Вывод специальных папок в версии 8.0

// Функция возвращает путь к системной папке, указанной в параметре <Имя>
Функция ПолучитьСистемнуюПапку(Имя)
Попытка
Ctrl = Новый COMO6beKT("MSScriptControl.ScriptControl");
// Указываем язык скрипта (VBS)
Ctrl.Language = "vbscript";
// Добавляем код на VBS
Ctrl.AddCode("
I Function SpecialFolders(Name)
I Set Shell = CreateObject(""Wscript.Shell"")
|SpecialFolders = Shell.SpecialFolders(Name)
114 Глава 3
I End Function");
// Запускаем функцию SpecialFolders с 'параметром <Имя>
ИмяПапки = Ctrl.Run("SpecialFolders", Имя);

Исключение
//В случае неудачного выполнения возвращаем — Неопределено
ИмяПапки = Неопределено;

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

Возврат ИмяПапки;
КонецФункции

Сообщить("Рабочий стол: " + ПолучитьСистемнуюПапку("Desktop"));
Сообщить("Мои документы: " + ПолучитьСистемнуюПапку("MyDocuments"));
Сообщить("Избранное: " + ПолучитьСистемнуюПапку("Recent"));



Работа с ярлыками Windows
С помощью WSH можно создавать ярлыки для файлов и адресов сайтов
в Интернете (URL). Для этого используется объект Wshshell.

Создание ярлыков для файлов
Для создания ярлыка используется метод Createshortcut объекта Wshshell,
который имеет единственный параметр — полное имя файла для ярлыка.
Приведем пример создания ярлыка для запуска системы SQL-версии
"1С:Предприятие 7.7" (листинг 3.16).

г 3.16. Создание ярлыка для файла

Shell = Новый СОМОбъект("WScript.Shell"};
DesktopPath = ПолучитьСистемнуюПапку("Desktop");
Link = Shell.Createshortcut(DesktopPath + "\test.lnk");
Link.Arguments = "1 2 3";
Link.Description = "Тестовый пример";
Link.HotKey = "CTRL+ALT+SHIFT+X";
Link.IconLocation = "Icv7s.exe,!";
Link.TargetPath = "c:\Program Files\lCv77\BIN\lcv7s.exe";
Link.WindowStyle = 3;
Link.WorkingDirectory = "c:\Program Files\lCv77\BIN\";
Link.Save();
Использование скриптов WSH 115

В данном примере метод Createshortcut возвращает ссылку на объект Link.
Для описания параметров ярлыка сначала заполняются основные свойства
объект Link. После этого он сохраняется с помощью метода save о .
Объект Link имеет следующие свойства:
П Arguments — описание параметров запуска файла;
О Description — текстовое описание к ярлыку;
П HotKey — комбинация клавиш для быстрого запуска ярлыка;
П iconLocation — файл с иконкой;
П TargetPath — полное имя запускаемого файла;
П windowstyle — способ запуска программы, причем свойство может при-
нимать следующие значения:
• з — при запуске окно программы будет развернуто на весь экран;
• 4 — устанавливает стандартный размер окна;
• 7 — окно будет свернуто в значок на панели задач;
П workingoirectory — рабочая папка.

Копирование, перемещение и удаление ярлыков
Для копирования, перемещения и удаления ярлыков применяются такие же
методы, что и для работы с файлами. А именно CopyFile, Move File и
DeleteFile (листинг 3.17).

ННШННВи.
эпирование, перемещение и удаление ярш

Shell = Новый COM06beKT("WScript.Shell");
FSO = Новый СОМОбъект("Scripting.FileSystemObject");
DesktopPath = ПолучитьСистемнуюПапку("Desktop") + "\test.lnk";
NewPath = "C:\\";


// Копирование ярлыка
FSO.CopyFile(DesktopPath, NewPath);


// Перемещение ярлыка
MyDocumentsPath = ПолучитьСистемнуюПапку("MyDocuments") + "\test.lnk";
FSO.MoveFile(NewPath, MyDocumentsPath);


// Удаление ярлыка
FSO.DeleteFile(MyDocumentsPath);
116 Глава 3

Создание ярлыков для URL-адресов
Помимо ярлыков для файлов, WSH позволяет создавать ярлыки для запуска
Web-страниц. В этом случае применяется все тот же метод createShortcut,
но в качестве аргумента необходимо использовать файл с расширением URL
и в свойстве TargetPath указывать адрес интернет-страницы.
Рассмотрим пример создания на рабочем столе ярлыка для запуска форума,
посвященного системе "1С:Предприятие" (листинг 3.18).




Shell = Новый СОМОбъект("WScript.Shell");
DesktopPath = ПолучитьСистемнуюПапку("Desktop");


URL = Shell.CreateShortcut(DesktopPath + "\ERP Group.url");
URL.TargetPath = "http://www.erpg.ru";
URL.Save();


URL = Shell.CreateShortcut(DesktopPath + "\Ваш форум.url");
URL.TargetPath = "http://forum.erpg.ru";
URL.Save () ;




Работа с системным реестром Windows

Понятие реестра
Реестр — это база данных операционной системы, содержащая данные о
текущей конфигурации программных и аппаратных средств вычислительной
системы. Физически вся информация реестра разбита на два файла:
SYSTEM.DAT и USER.DAT, находящиеся в каталоге Windows.
Чему действительно необходимо уделить внимание, так это структуре реест-
ра. Он содержит шесть корневых разделов (ветвей), на которых ниже оста-
новимся подробнее. Каждый из них включает подразделы, отображаемые
в левой части окна в виде значка папки. Конечным элементом дерева реест-
ра являются ключи или параметры, делящиеся на три типа:
О строковые (например, "C:\Windows");
О двоичные (например, 10 82 АО 8F), причем максимальная длина такого
ключа 16 Кбайт;
Использование скриптов WSH 117

П типа DWORD, которые занимают по 4 байта и отображаются в шестнад-
цатеричном и в десятичном виде (например, 0x00000020 (32), причем
в скобках указано десятичное значение ключа).
Рассмотрим корневые разделы раздела, точнее, какая информация в них
содержится.
П HKEY_CLASSES_ROOT. В этом разделе содержится информация о заре-
гистрированных в Windows типах файлов, что позволяет открывать их по
двойному щелчку мыши, а также информация об OLE-серверах (подроб-
нее о технологии OLE см. в главе 4).
П HKEY_CURRENT_USER. Здесь содержатся настройки оболочки пользова-
теля (например, "Рабочего стола", меню Пуск и т. п.), вошедшего в среду
Windows. Они дублируют содержимое подраздела HKEY_USER\name, где
name — имя пользователя, вошедшего в среду Windows. Если на компью-
тере работает один пользователь и используется обычный вход в среду
операционной системы, то значения раздела берутся из подраздела
HKEY_USERS\.DEFAULT.
О HKEY_LOCAL_MACHINE. Этот раздел содержит информацию, относя-
щуюся к компьютеру: драйверы, установленное программное обеспече-
ние и его настройки.
П HKEY_USERS. Содержит настройки оболочки Windows для всех пользо-
вателей. Как было сказано выше, именно из этого раздела информация
копируется в раздел HKEY_CURRENT_USER. Все изменения в HKCU
(сокращенное название раздела HKEY_CURRENT_USER) автоматически
переносятся в HK.U.
П HKEY_CURRENT_CONFIG. В этом разделе содержится информация
о конфигурации устройств Plug-and-Play и сведения о конфигурации
компьютера с переменным составом аппаратных средств.
П HKEY_DYN_DATA. Здесь хранятся динамические данные о состоянии
различных устройств, установленных на компьютере. Именно сведения
этой ветви отображаются в окне Система | Устройства | Свойства, вызы-
ваемого из Панели управления. Данные этого раздела изменяются самой
операционной системой, так что редактировать что-либо вручную не же-
лательно.

Запись, чтение и удаление ветвей реестра
С помощью Windows Script Host возможно в "невидимом" режиме добавлять
какую-либо информацию в реестр. Также возможно считывать информа-
цию, создавать и удалять разделы и параметры. Пользователь может даже не
подозревать, что на его компьютере выполняются какие-то работы. Очевид-
но, что многим администраторам такая возможность придется по душе.
Глава 3
118

Для работы с реестром в WSH предусмотрены методы Regwrite, RegRead и
RegDelete объекта WshShell.
Метод Regwrite предназначен для создания ветвей реестра и записи в них
параметров. Метод содержит три аргумента.
П Name — полное имя ветви или параметра. Если в конце имени стоит об-
ратный слэш (\), то аргумент является ветвью, иначе — параметром;
П Value — значение параметра или значение по умолчанию в случае созда-
ния ветви;
П туре — тип значения (REG_SZ — строковый параметр, REG_EXPAND_SZ —
расширяемый строковый параметр, REG_DWORD — числовой параметр,
REG_BINARY - двоичный параметр).
Метод RegRead предназначен для чтения значения параметра и имеет один
параметр — полное имя ветви или параметра реестра. В случае указания
имени ветви (с обратным слэшем на конце) метод возвращает значения па-
раметра по умолчанию.
Метод RegDelete предназначен для удаления ветви или параметра реестра и
имеет один параметр — полное имя ветви или параметра.
Рассмотрим пример работы с системным реестром (листинг 3.19).

4стинг 3.19. Работа с системным реестром Windows

Shell = Новый СОМОбъект("WScript.Shell");
Key = "HKEY_CURRENT_USER\";


// Создание ветки HCU\TestKey\
Shell.RegWrite(Key + "TestKeyV, "testkeydefault");
// Создание строкового параметра stringl
Shell.RegWrite(Key + "TestKeyXstringl", "testkeystring")
// Создание параметра типа DWORD
Shell.RegWrite(Key + "TestKeyXint", 123, "REG_DWORD");


// Чтение созданных параметров
Сообщить(Shell.RegRead(Key + "TestKeyV'));
Сообщить(Shell.RegRead(Key + "TestKeyXstringl"));
Сообщить(Shell.RegRead(Key + "TestKeyXint"));


// Удаление ветки HCUXTestKeyX
Shell.RegDelete(Key + "TestKeyX");
Использование скриптов WSH цд

Работа с сетевыми ресурсами
Для работы с сетевыми ресурсами в WSH предназначен объект wshNetwork.
Данный объект позволяет решать такие задачи, как подключения к сети, ин-
сталляцию принтеров, назначение буквенных обозначений сетевым дискам,
получение информации об имени пользователя или компьютера и так далее.
Рассмотрим основные свойства объекта W s h N e t w o r k :
П ComputerName — возвращает имя компьютера;
П userDomain — возвращает имя домена, в котором зарегистрирован поль-
зователь;
П userName — возвращает имя пользователя.
Рассмотрим основные методы объекта W s h N e t w o r k :
П MapNetworkDrive — присваивает назначенную пользователем букву сете-
вому диску;
П EnumNetworkDrives — возвращает список подключенных сетевых дисков;
П RemoveNetworkDrive — ОТКЛЮЧаеТ Сетевой ДИСК;
П AddwindowsPrinterConnection — позволяет установить новый принтер
в Windows, т. е. указать путь к принтеру и инициировать установку драй-
веров;
П AddPr interconnect ion — подключает сетевой принтер;
П RemovePrinterConnection — отключает сетевой принтер;
П setDefauitprinter — задает принтер по умолчанию;
П EnumPrinterConnections — возвращает список подключенных принтеров.


Получение информации о сетевой идентификации
Для начала разберемся, как работают методы ComputerName, UserDomain
И UserName объекта WshNetwork.
Рассмотрим небольшой пример, в котором выводятся сведения об имени
пользователя, имени компьютера и домене (листинг 3.20).
- _.
. - — ; —.
г




вод информации об имени пользователя, имени компьютера


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


Сообщить("Имя пользователя: " + Network.UserName);
Сообщить("Имя компьютера: " + Network.ComputerName);
Сообщить("Имя домена: " + Network.UserDomain);
120 Глава 3

В данном примере использовались свойства объекта wshNetwork: userName,
ComputerName И UserDomain. С ИХ ПОМОЩЬЮ была Получена информация
о подключившемся пользователе. Эта информация может понадобиться, на-
пример, если на компьютере работает несколько пользователей и им нужен
доступ к разным сетевым дискам. Таким образом, можно обеспечить авто-
матическое подключение этих дисков в зависимости от того, какой пользо-
ватель сейчас работает.

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

1иска подключенных сетевых дисков

Network = Новый СОМОбъект("WScript.Network");
// Получаем коллекцию сетевых дисков
Drives = Network.EnumNetworkDrives();
Для каждого Диск Из Drives Цикл
Сообщить(Диск);
КонецЦикла;


Для подключения и отключения сетевых дисков существуют методы
MapNetworkDrive И RemoveNetworkDrive соответственно. Рассмотрим пример
подключения сетевого диска (листинг 3.22).




Net = Новый СОМОбъект("WScript.Network");
Попытка
Net.MapNetworkDrive("М:", "\\Server\DATA\CRM");
Исключение
Сообщить("Невозможно произвести подключение!");
КонецПопытки;


В данном примере в методе MapNetworkDrive используются только первые
два параметра: буква, на которую будет подключаться диск, и, собственно,
путь к сетевому диску. Третий параметр (истина или ложь) указывает, осу-
ществлять или нет подключение этого диска при следующем входе пользо-
Использование скриптов WSH 121

вателя. Четвертый и пятый параметры определяют имя пользователя и его
пароль, с которыми может подключаться диск. Лучше организовать доступ
к диску нужным пользователям на сервере средствами самой ОС. Тогда по-
сторонние люди не смогут узнать пароль для работы с этим ресурсом.
При отключении сетевого диска используется метод RemoveNetworkDrive,
который имеет три параметра. Обязателен только первый параметр — буква
отключаемого диска. Второй параметр — отключает диск (если истина) даже
если он в этот момент используется. Третий параметр сохраняет настройки
для следующих входов пользователя.


Работа с сетевыми принтерами
В wshNetwork реализовано несколько методов сетевого доступа к принтерам.
Чтобы явно установить связь принтера с портом, следует использовать ме-
тод AddPrinterConnection. Для соединения с принтерами в среде Windows
(и автоматической установки драйверов на машинах с операционными сис-
темами Windows 2000/XP/NT и Server 2003) нужно применить метод
AddwindowsPrinterConnection, который представлен в листингах 3.23 и 3.24.
Метод SetDefauitPrinter назначает компьютеру принтер, связь с которым
устанавливается по умолчанию.

Листинг 3.23. Подключение сетевого принтера в Windows NT/2000/XP/Server 2003

Network = Новый СОМОбъект{"WScript.Network");
Попытка
Network.AddwindowsPrinterConnection("\\ServerName\PrinterName");
Network.SetDefauitPrinter("\\ServerName\PrinterName");
Исключение
Сообщить("Невозможно произвести подключение!");
КонецПопытки;
•jgp-j-тт- — — .--.--
ючение сетевого принтера в Windows 9x/ME

Network = Новый СОМОбъект("WScript.Network");
Попытка
Network.AddwindowsPrinterConnection("\\ServerName\
PrinterName", " Lexmark Optra S 1650");
Network.SetDefauitPrinter("\\ServerName\PrinterName");
Исключение
Сообщить("Невозможно произвести подключение!");
КонецПопытки;
•\22 Глава 3

Данные примеры подключают сетевой принтер с именем PrinterName, на-
ходящийся на сервере ServerName и устанавливают его в качестве принтера,
используемого по умолчанию.
Для отключения сетевого принтера используется метод
RemovePrinterConnection, который имеет три параметра:
П первый параметр — буква отключаемого диска;
П второй параметр — (если истина) отключает принтер, даже если он в этот
момент времени используется;
П третий параметр — признак сохранения настройки для следующих входов
пользователя.
Обязательным является только первый параметр.
Как и в случае с сетевыми дисками, объект WshNetwork позволяет определить
список подключенных сетевых принтеров. Для этого используется метод
EnumPrinterConnections, который возвращает коллекцию принтеров. Дан-
ную коллекцию, как и любую другую, в системе "1C:Предприятие" 8.0 мож-
но перебрать С ПОМОЩЬЮ КОНСТРУКЦИИ Для...каждого из...Цикл...КонецЦикла.
В версии 7.7 системы "1C:Предприятие" — с помощью объекта coMServices.


Управление программами
Под управлением программ будем понимать: запуск программ; активизацию
их окон; имитацию нажатия, в границах этих окон, различных клавиш кла-
виатуры. Для решения перечисленных задач нужны всего три функции.
О sendKeys (string) — имитируется нажатие клавиши или последователь-
ности клавиш на клавиатуре, указанных в единственном параметре.
О AppActivate (Title) — активизирует приложение по заголовку окна или
по идентификатору процесса.
П Run (Command, WindowStyle, WaitOnReturn) — запускает Приложение ПО
командной строке. Параметры функции имеют следующее назначение:
• первый параметр (command) — определяет запускаемое приложение;
• второй параметр (WindowStyle) — определяет стиль окна и может
принимать значения:
О о — запускать программу в скрытом окне;

^ Примечание
Если вы попытаетесь запустить приложение с таким значением второй пере-
менной, то окно программы будет невидимым и кнопка на панели задач не бу-
дет создана. Удостовериться, что приложение действительно запустилось,
можно в диспетчере задач, который вызывается по комбинации клавиш
<Ctrl>+<Alt>+<Del>.
Использование скриптов WSH 123

О 1 — запустить программу в оригинальном размере и положении
окна;
О 2 — запустить программу минимизированной;
О з — запустить программу максимизированной (на полный экран);
О 4 — запустить программу с последним использованным размером
и положением окна на экране;
О 5 -— запустить программу с текущими размером и позицией окна на
экране;
О б — запустить программу минимизированной (при этом активным
будет следующее окно в последовательности окон активных при-
ложений Windows);
• третий параметр (значения — истина или ложь) указывает на необхо-
димость дождаться завершения выполнения приложения.
В качестве параметра метода sendKeys можно указывать как алфавитно-
цифровые символы, так и символы специальных клавиш, например,
<Enter>, <Tab>, <F1>...<F12>, <Alt>, <Shift>, <Ctrl> и т. п. В табл. 3.1 при-
ведены специальные обозначения для этих клавиш.

Таблица 3.1. Обозначения специальных клавиш

Клавиша Обозначение
<BACKSPACE> {BACKSPACE}, {BS}, или {BKSP}
<BREAK> {BREAK}
<CAPS LOCK> {CAPSLOCK}
<DEL> или <DELETE> {DELETE} или {DEL}
<DOWN ARROW> {DOWN}
<END> {END}
<ENTER> {ENTER}или ˜
<ESC> {ESC}
<HELP> {HELP}
<HOME> {HOME}
<INS или INSERT> {INSERT} или {INS}
<LEFT ARROW> {LEFT}
<NUM LOCK> {NUMLOCK}
<PAGE DOWN> {PGDN}
<PAGE UP> {PGUP}
Глава 3
124

Таблица 3,1 (окончание)

Обозначение
Клавиша
<PRINT SCREEN> {PRTSC}
{RIGHT}
<RIGHT ARROW>
<SCROLL LOCK> {SCROLLLOCK}
{TAB}
<TAB>
<UP ARROW> {UP}
<F1> {F1}
<F2> {F2}
<F3> {F3}
<F4> {F4}
<F5> {F5}
<F6> {F6}
{F7}
<F7>
{F8}
<F8>
,<F9> {F9}
<F10> {F10}
<F11> {F11}
<F12> {F12}


Для указания клавиш <Alt>, <Shift>, <Ctrl> существуют специальные коды:
П <Shift> - "+";
-" Л ";
П <Ctrl>
а <Ait> •-"%".
Например, если вы хотите передать нажатие нескольких клавиш с нажатой
клавишей <Shift>, надо выполнять команду wshsheii.sendKeys ( " + ( д в с ) " ) ,
если только одной клавиши (первую, указанную в последовательности кла-
виш) — команду WshShell.SendKeys("+ABC") .

Примечание Д
Необходимо заметить, что такие символы, как "+", "Л" и "%", зарезервированы
под обозначение специальных клавиш, так что просто так передать эти (и неко-
торые другие) символы не удастся. Для этого надо заключить их в фигурные
скобки, например, "{+}", "{%}" и т. д. Вот полный список символов, которые не-
обходимо заключать в фигурные скобки: +, Л, %, ˜, (,), {,}, [, ].
Использование скриптов WSH 125

Если вы хотите передать несколько нажатий подряд одной клавиши, то
вовсе не обязательно все их набирать в скрипте. Можно просто указать
количество повторений. Так, строка wshsheii.sendKeys ( " { А ю о } " ) экви-
валентна сотне нажатий клавиши "А". Правда, есть ограничение на коли-
чество возможных повторений нажатия клавиш. Это значение лежит где-
то между 8150 и 8180 раз. При превышении этого значения будет выдана
ошибка.


Управление калькулятором
В листинге 3.25 приведен код, демонстрирующий, как запустить калькуля-
тор и рассчитать значение произведения чисел 2 и 3.
._т- ..
„ __—_—_ -„ —— „__,.^_,. т ______,_ _ , _ _ _ _ _ _ _ _ _ _________ .т,
- -. ___- _,—- ___- ,




нг 3.25. Управление калькулятором
_;_„ ...*
...: :. ; ', _ !

WshShell = Новый СОМОбъект("WScript.Shell");


// Запускаем калькулятор
WshShell.Run("calc");


// Ждем пока калькулятор загрузится (для русской версии ОС)
Пока Не WshShell.AppActivate("Калькулятор") Цикл
КонецЦикла;

.
// Эмулируем нажатие клавиш
WshShell.SendKeys("!{+}");
WshShell.SendKeys("2");
WshShell.SendKeys("˜");
WshShell.SendKeys("*3");
WshShell.SendKeys("˜") ;


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


Управление Microsoft Word
Рассмотрим еще один интересный пример, в котором запускается Microsoft
Word и в нем печатается некоторый текст (листинг 3.26).
126 Глава 3

явление Microsoft Word

WshShell = Новый СОМОбъект("WScript.Shell");

Если WshShell.AppActivate("Word") Тогда
WshShell.SendKeys("Welcome to http://www.erpg.ru");
WshShell.SendKeys("˜"); // Enter
WshShell.SendKeys("%"); // Alt
// Спускаемся на 4 пункта вниз
WshShell.SendKeys("{DOWN}{DOWN}{DOWN}{DOWN}");
WshShell.SendKeys("˜"); // Enter
WshShell.SendKeys("c:\test.doc");
WshShell.SendKeys("˜"); // Enter
Иначе
Сообщить("Microsoft Word не запущен!");
КонецЕсли;


Реализация примера подразумевает, что у вас уже запущен MS Word с пус-
той страницей. В результате выполнения в документе напечатается текст и
будет сохранен под именем c:\test.doc, но только в том случае, если пункт
меню Сохранить находится четвертым сверху.



Запуск встроенного калькулятора
В системе "1C:Предприятие" (в версиях 7.7 и 8.0) существует встроенный
калькулятор, который вызывается при нажатии комбинации клавиш
<Ctrl>+<F2> или через пункт меню Сервис | Калькулятор. С помощью ме-
тода SendKeys объекта W s h S h e l l можно программно вызвать встроенный
калькулятор (листинг 3.27).

нг 3.27. Запуск встроенного калькулятора

WshShell = Новый СОМОбъект("WScript.Shell");
WshShell.SendKeys("A{F2}"); // Ctrl+F2

Закрытие окна сообщений
в системе "1С:Предприятие"
В системе "1С:Предприятие" (в версиях 7.7 и 8.0) при вызове оператора
сообщить появляется окно сообщений. Часто бывает ситуация, когда необ-
Использование скриптов WSH 127

ходимо программно закрыть это окно. Оно закрывается при нажатии ком-
бинации клавиш <Ctrl>+<Shift>+<Z>. Приведем пример закрытия окна со-
общений (листинг 3.28).



//С помощью вывода текста показываем окно сообщений
Для Ном = 1 По 100 Цикл
Сообщить("Текст " + Ном);
КонецЦикла;


WshShell = Новый СОМОбъект("WScript.Shell");
// Закрываем.окно сообщений
WshShell.SendKeys("л+(z)"); // <Ctrl>+<Shift>+<Z>
WshShell.SendKeys("л+(я)"); // для русской раскладки
Глава 4


Использование OLE Automation


Понятие OLE Automation
OLE — это аббревиатура названия технологии Object Linking and Embedding
(связывание и внедрение объектов). Она указывает на способность работать
с составными объектами, созданными в других приложениях (например,
рисунками, документами и т. п.). Основные термины, с которыми оперирует
данная технология, — это OLE-объект, сервер приложения и контейнер
приложения.
OLE-объектом называют объект, созданный в другом приложении и сохра-
нивший связь с этим приложением. Точечный рисунок, созданный в редак-
торе Paint, электронные таблицы в формате Excel или диаграмма из MS
Graph — все они могут быть OLE-объектами, если будут вставлены в доку-
мент соответствующим образом. Если не вставлять их как OLE-объект, то
связь с оригинальным приложением отсутствует.
Контейнером приложения OLE называют приложение, в котором создается
составной документ, содержащий OLE-объект, позволяя обрабатывать его
в исходном приложении (например, таком как Paint или Excel), которое ис-
пользовалось для создания этого объекта.
Сервером приложения OLE (OLE Sewer Application) называют приложение,
создающее объекты, которые можно поместить в документ-контейнер.
Программы — "1С:Предприятие", Microsoft Word и Excel являются прило-
жениями, которые могут выступать и как OLE-сервер, и как OLE-
контейнер. Другими словами, эти приложения могут создавать новые OLE-
объекты, а такжет хранить OLE-объекты, созданные в других приложениях.
Первоначально механизм OLE был задуман как технология интеграции
программных продуктов, входящих в комплект Microsoft Office, в другие
приложения. Первое воплощение OLE (OLE 1) представляло собой меха-
низм создания и работы с составными документами (compound documents).
5 Зак. 722
130 Глава 4

С точки зрения пользователя, составной документ выглядит единым набо-
ром информации, но фактически содержит элементы, созданные двумя или
несколькими разными приложениями. С помощью OLE 1 пользователь мог,
например, объединить электронную таблицу, созданную Microsoft Excel,
с текстовым документом Microsoft Word. Идея состояла в том, чтобы доку-
менто-ориентированная (document-centric) модель работы с компьютером
позволила бы пользователю больше думать об информации и меньше о при-
ложениях, ее обрабатывающих. Как следует из слов "связывание и внедре-
ние", составные документы можно создать, либо связав их, либо полностью
внедрив один документ в другой.
OLE 1, как и большинство первых версий программных продуктов, была несо-
вершенна. Архитекторам следующей версии предстояло улучшить первоначаль-
ный проект. Вскоре они поняли, что составные документы это лишь частный
случай более общей проблемы — как разные программные компоненты должны
предоставлять друг другу сервисы? Для решения этой проблемы архитекторы
OLE создали группу технологий, область применения которых гораздо шире
составных документов. Основу OLE 2 составляет важнейшая из этих техноло-
гий — "Модель многокомпонентных объектов" (Component Object Model или
СОМ). Новая версия OLE не только обеспечивает поддержку составных доку-
ментов лучше, чем первая, но и несомненно идет куда дальше простого объеди-
нения документов, созданных в разных приложениях. OLE 2 позволяет по-
новому взглянуть на взаимодействие любых типов программ.
Электронные таблицы, текстовые процессоры и другие программы предос-
тавляют множество полезных возможностей. Почему бы не обеспечить дос-
туп к ним и другому программному обеспечению? Чтобы это стало возмож-
ным, приложения должны предоставлять свои сервисы не только человеку,
но и программам, т. е. они должны быть программируемыми. Обеспечение
программируемое™ и является целью "Автоматизации" (Automation, перво-
начально называлась OLE-автоматизацией).
Приложение можно сделать программируемым, обеспечив доступ к его сер-
висам, через обычный СОМ-интерфейс. Однако так поступают редко. Вме-
сто этого доступ к сервисам приложений осуществляется через диспинтер-
фейсы (dispinterface). Они очень похожи на интерфейсы (имеют методы,
клиенты осуществляют к ним доступ через указатели интерфейса и т. д.).
Однако диспинтерфейсы имеют и существенные отличия. В частности, их
методы гораздо проще вызывать клиентам, написанным на простых языках
типа встроенного языка системы "1С:Предприятие".


Использование системы "1С:Предприятие"
в качестве OLE Automation сервера
Методы работы с OLE-объектами существенно отличаются в разных версиях
системы "1С:Предприятие". Поэтому их рассмотрение будет происходить по
отдельности, для каждой версии системы.
Использование OLE Automation 131


Использование OLE Automation сервера
в версии 7.7
Для запуска системы "1С:Предприятие", в качестве OLE Automation сервера,
из внешнего приложения, выполняется следующая последовательность дей-
ствий:
1. Создается объект с OLE идентификатором:
• vicEnterprise.Application — версия независимый ключ;
• V77.Application — версия зависимый ключ;
• V77S.Application — версия зависимый ключ, SQL-версия;
• V77L.Application — версия зависимый ключ, локальная версия;
• V77M.Application — версия зависимый ключ, сетевая версия.
2. Выполняется инициализация системы "1С:Предприятие" методом
Initialize() .
3. Вызываются атрибуты и методы системы "1С:Предприятие", как OLE
Automation сервера.
"1С:Предприятие", в качестве OLE Automation сервера, имеет 4 метода:
1. initialize о — выполняет инициализацию системы "1С:Предприятие".
2. createobject о — создает объект агрегатного типа данных системы
"ЮПредприятие" и возвращает ссылку на него.
3. EvaiExprO — вычисляет выражение системы.
4. ExecuteBatchO — выполняет последовательность операторов.

Подключение к базе данных
Для открытия и инициализации базы данных системы "1С:Предприятие"
(версии 7.7) предназначен метод i n i t i a l i z e d , который имеет следующие
параметры:
П имя объекта.RMTrade — имя переменной и ключевое слово RMTrade;
П команднаяСтрока.— командная строка, в которой можно прописать путь
к базе данных, имя пользователя и пароль;
О ПоказыватьЗаставку — Либо пустая строка, Либо — "NO_SPLASH_SHOW",
чтобы не показывать заставку при загрузке.
Для того чтобы открыть базу через OLE, необходимо создать объект с иден-
тификатором OLE, выполнить инициализацию базы и проверить успеш-
ность ее выполнения. Если в методе initialize указать только первый па-
раметр, то при открытии базы открывается окно выбора, в котором
предлагается выбрать пользователя и ввести пароль (листинг 4.1).
132 Глава 4



БазаОЬЕ = СоздатьОбъект("V77.Application");
Открыта = БазаОЬЕ.Initialize(БазаОЬЕ.RMTrade,,);
Если Открыта = 0 Тогда
// True=-l, False=0
Сообщить("Не удалось открыть базу данных!");
Возврат;
КонецЕсли;


Доступ к объектам базы данных
Для доступа к объектам агрегатных типов предназначен метод
createobject о, который имеет единственный параметр— строковое
выражение, значение которого содержит имя агрегатного типа данных,
заданного в конфигураторе. Например: "Справочник, номенклатура",
"Документ.ПриходнаяНакладная" И Т. П.
Этот метод создает объект агрегатного типа данных системы
"1С:Предприятие" и возвращает ссылку на него.
Для доступа к константам, перечислениям и видам субконто достаточно ис-
пользовать свойства глобального контекста Константа, Перечисление ИЛИ
видыСубконто сервера приложения (листинг 4.2).
^ .... -—_.._ ,__...-.„..-.. ,.-._...-,. . _т ... .,
I Листинг 4.2. Доступ к константам, перечислениям и видам субконто I

Сообщить(БазаОЬЕ.Константа.ДатаЗапретаРедактирования);
Сообщить(БазаОЬЕ.Перечисление.КатегорияКонтрагента.Поставщик);
Сообщить(БазаОЬЕ.ВидСубконто.Контрагенты);


Для сравнения перечислений или видов субконто разных баз данных (OLE
и местной) необходимо сначала получить строковое или числовое представ-
ление данного перечисления или вида субконто с помощью методов иден-
тификатор или ЗначениеПоНомеру в местной базе, а затем найти соответст-
вующее ему значение в OLE-базе (листинг 4.3).


Листинг 4.3. Поиск вида субконто в OLE

ВыбранныйВидСубконтоИд = ВыбранныйВидСубконто.Идентификатор();
ВыбранныйВидСубконтоОЬЕ = БазаОЬЕ.ВидСубконто.ЗначениеПоИдентификатору
(ВыбранныйВидСубконтоИд));
Использование OLE Automation 133

В данном примере переменная ВыбранныйВидСубконто содержит значение
типа "ВидСубконто", которое определено вне данного кода, например, на
форме.
Для доступа к справочникам и документам необходимо использовать метод
CreateObject. После создания объекта справочника или документа к нему
применимы все методы, касающиеся соответствующего объекта в среде
"1С:Предприятие" (листинг 4.4).



СправочникОЬЕ = БазаОЬЕ.CreateObject("Справочник.Фирмы");
СправочникОЬЕ.ВыбратьЭлементы();
Пока СправочникОЬЕ.ПолучитьЭлемент() Цикл
Сообщить(СправочникОЬЕ.Наименование);
КонецЦикла;

В данном примере в операторе сообщить для вывода наименования элемен-
та справочника необходимо использовать именно конструкцию
СправочникОЬЕ.Наименование, а НС СправочникОЬЕ.ТекущийЭлемент(). Ина-
че вместо строкового или числового представления этого элемента програм-
ма выдаст просто "OLE". По аналогии также не будет работать метод
текущийдокумент ( ) . Тем не менее через OLE-объект можно использовать
методы: Н о в ы й ( ) , Записать ( ) И Др.
Доступ к документам производится так же, как и к справочникам (листинг 4.5).



// Поиск контрагента в OLE-базе
CnpaB04HHKOLE = BasaOLE.CreateObject("Справочник.Контрагенты");
СправочникОЬЕ.НайтиПоКоду(ВыбКонтрагент.Код, 0);

// Создание нового документа
ДокументОЬЕ = БазаОЬЕ.CreateObject("Документ.Контакт");
flOKyMeHTOLE.Новый();
// Заполнение реквизита Контрагент из OLE-базы
flOKyMeHTOLE.Контрагент = CnpaBO4HHKOLE.ТекущийЭлемент();
ДокументОЬЕ.Тема = "Пример";
ДокументОЬЕ.Записать();

Если ДокументОЬЕ.Провести()=0 Тогда
Сообщить("Ошибка! Документ не проведен.");
КонецЕсли;
Глава 4
134

Важно отметить тот факт, что нельзя сравнивать или присваивать два или
несколько элементов справочника или документов, находящихся в разных
базах. Для поиска соответствующего элемента или документа в OLE-базе
необходимо ИСПОЛЬЗОВать методы: НайтиПоКоду, НайтиПоНаименованию И Т. П.
В листинге 4.5 для заполнения контрагента в документе контакт использу-
ется элемент базы OLE, предварительно найденный по коду, соответствую-
щему коду контрагента в местной базе. Это же касается и объектов типа
"Счет".
Для доступа к регистрам используется тот же метод CreateObject (листинг 4.6).




РегистрОЬЕ = БазаОЬЕ.CreateObject("Регистр.Касса");
РегистрОЬЕ.ВыбратьИтоги();


Пока РегистрОЬЕ.ПолучитьИтог()=1 Цикл
Сообщить("Остаток в кассе " + РегистрОЬЕ.Касса.Наименование " = " +
РегистрОЬЕ.Сумма);
КонецЦикла;


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

| Листинг 4.7. Вычисление выражений

// Выполнение функции глобального модуля
ФорматированноеИмяПользователя = БазаОЬЕ.EvaiExpr
С'глДополнитьСтрокуП ( + ИмяПользователя + " " " , 255)");
" ,""
СуммаПрописью = БазаОЬЕ.EvaiExpr("глСуммаПрописью(" + Сумма + " " +
,
Валюта + " " ;
))
// Вычисление выражения используя стандартные функции
СуммаПрописью = БазаОЬЕ.EvaiExpr("Цел(Лог(2.2)) * 5м);


Во второй строке данного примера в функцию глСуммаПрописыо, в качестве
параметра валюта, необходимо передавать строку, т. к. данная функция
Использование OLE Automation /35

будет исполняться внутри подключаемого OLE-сервера, т. е. внешней под-
ключаемой базы данных.

Выполнение операторов
Для выполнения последовательности операторов в OLE-базе используется
метод ExecuteBatch, единственным параметром которого является строка, опи-
сывающая текст программы на встроенном языке системы "1С:Предприятие".
Метод ExecuteBatch возвращает значение логического типа (true — если
последовательность операторов выполнена успешно; false — если нет).
В OLE Automation значения true и false представляются соответственно
значениями -1 (минус единица) и о.
Ниже приведен пример выполнения процедур в OLE-базе (листинг 4.8).

эние операторов

СправочникОЬЕ = BasaOLE.EvalExpr("СоздатьСправочникФирмы()");
СправочникОЬЕ.ВыбратьЭлементы();
Пока СправочникОЬЕ.ПолучитьЭлемент() Цикл
Сообщить(СправочникОЬЕ.Наименование);
КонецЦикла;
// Выполнение процедур
БазаОЬЕ.ExecuteBatch("ПроцедураРегл!();ПроцедураРегл2()");


Использование OLE Automation сервера
в версии 8.0
Система "Ю.Предприятие 8.0" может использоваться внешними приложе-
ниями в качестве OLE Automation сервера.
Обычно в этих целях "Ю.Предприятие" используют для управления конфи-
гурациями системы программ "1С:Предприятие" из других приложений и
выполнения действий аналогичным интерактивным действиям пользователя
(например, построение отчетов).
Для запуска системы "1С:Предприятие" в качестве OLE Automation серве-
ра из внешнего приложения выполняется следующая последовательность
действий:
1. Создается OLE объект с идентификатором "vs.Application".
2. Выполняется инициализация системы "1С:Предприятие" методом Connect.
3. Вызываются свойства и методы системы "1С:Предприятие" как OLE
Automation сервера.
Глава 4
136

Приведем пример доступа к данным информационной базы посредством
OLE Automation сервера системы "1С:Предприятие 8.0" из Visual Basic
скрипта (листинг 4.9).




' Подключение к БД средствами OLE Automation
Set cc = CreateObject("v8.Application")
cc.Connect("File=C:\Progra˜l\lcv8\Db\Trade; изг=Иванов")
' Установка видимости приложения
cc.Visible = True

1
Задаем текст запроса
Text = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты"
' Создаем объект Запрос
Set Query = cc.NewObject("Запрос")
Query.Text = Text
' Выполнение запроса
Set Result = Query.Execute()
Set Choose = Result.Choose()
' Выборка результата выполнения запроса
Do While Choose.Next()
' Пример вывода сообщения в OLE-базе
cc.Message(Choose.Description)
Loop

' Пример вывода предупреждения в OLE-базе
cc.DoMessageBox "Форум для вопросов http://forum.erpg.ru", 10,
"Внимание!!!"

Данный пример последовательно выполняет все три перечисленные действия.
Некоторые версии внешних программ, в том числе и Visual Basic Script, об-
ращающихся к программе "1С:Предприятие" посредством OLE Automation,
могут неправильно интерпретировать русские идентификаторы объектов.

Примечание
Для обращения к свойствам и методам агрегатных типов данных системы
"1С:Предприятие" из внешних приложений рекомендуется использовать их анг-
лоязычные синонимы.
Использование OLE Automation 137

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

Кроме того, OLE Automation сервер имеет одно дополнительное свойство
и два метода с целью выполнения действий, специфичных для работы в ре-
жиме OLE Automation.
Единственное свойство visible имеет значение логического типа и позво-
ляет управлять видимостью пользовательского интерфейса системы
"1С:Предприятие". По умолчанию свойство имеет значение ложь.
Объект OLE-сервер системы "1С:Предприятие" в качестве своих методов
может использовать системные процедуры и функции, а также процедуры и
функции модуля приложения и общих модулей, объявленные с ключевым
словом Экспорт. Кроме того, OLE-сервер системы "Ю.Предприятие" имеет
два дополнительных метода: Connect и Newobject.
Метод connect выполняет инициализацию системы "ЮПредприятие" и
имеет единственный параметр — строку, используемую для соединения
с информационной базой. Метод возвращает истина, если инициализация
прошла успешно, или ложь, если нет.
Существует два варианта подключения к OLE-серверу системы
"ЮПредприятие", которые зависят от варианта использования информацион-
ной базы (файловый или клиент-серверный варианты). Приведем пример под-
ключения файловой и клиент-серверной версии системы "1С:Предприятие"
(листинг 4.10).
• • • • •нннннннннк
• • • • нннннннннн ""' " ""1
| Листинг 4.10. Варианты подключения к OLE-серверу

1
Подключение к БД файлового варианта
Set FileDb = CreateObject("v8.Application")
FileDb.Connect("File=C:\Progra˜l\lcv8\Db\Trade; Озг=Иванов; Pwd=super")

' Подключение к БД клиент-серверного варианта
Set ServerDb = CreateObject("v8.Application")
ServerDb.Connect("Srvr=ServerlC; Ref=Trade; изг=Иванов; Pwd=super")

Рассмотрим параметры подключения к базе данных в файловом варианте.
О File — указывает на каталог базы данных.
138 Глава 4

П us r — имя пользователя, под которым будет происходить авторизация.
П Pwd — пароль пользователя.
Для подключения к базе данных в клиент-серверном варианте используются
четыре параметра.
П Srvr — указывает имя сервера, на котором работает сервер приложений
системы "1С:Предприятие";
CD Ref — указывает имя базы данных на сервере приложений;
П Us r — определяет имя пользователя, под которым будет происходить ав-
торизация;
П Pwd — пароль пользователя.
Второй специальный метод OLE-сервера системы "1C:Предприятие" —
Newobject, который создает объект агрегатного типа данных системы
"1С:Предприятие" и возвращает ссылку на него. Единственный параметр
метода — строковое выражение, значение которого содержит имя агрегат-
ного типа данных, объявленного в конфигураторе.
В листинге 4.9 используется метод Newobject для создания объекта типа запрос.
Поскольку система "1С:Предприятие" может создавать и использовать OLE
Automation серверы, то из системы "1C:Предприятие" можно обращаться
к другим информационным базам.
В последующем материале книги будут показаны примеры использования
OLE Automation сервера системы "1С:Предприятие 8.0" из среды
"1С:Предприятия".

Доступ к объектам базы данных
Как уже было сказано ранее, для создания объектов агрегатного типа ис-
пользуется метод Newobject, но для доступа к константам и перечислениям
достаточно использовать свойства глобального контекста константы и
перечисления сервера приложения (листинг 4.11).

i и перечислениям

База = Новьм СОМОбъект("V8.Application");
База.Connect(СтрокаПодкгаочения);


// Доступ к константам
Сообщить(База.Константы.ОсновнаяВалюта.Получит().Наименование)


// Доступ к перечислениям
Сообщить(База.Перечисления.Периодичность.День);
Использование OLE Automation 139

Для доступа к справочникам и документам можно использовать метод
NewObject. Однако можно использовать и свойства глобального контекста
Справочники (листинг 4.12) и документы (листинг 4.13). После создания объ-
екта справочника или документа к нему применимы все методы, касающие-
ся соответствующего объекта в среде "1 (^Предприятие".



База = Новый СОМОбъект("V8.Application");
База.Connect(СтрокаПодключения);

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


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


Доступ к документам производится так же, как и к справочникам.

5. Доступ к документам

База = Новый СОМОбъект("V8.Application");
База.Connect(СтрокаПодключения);


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


// Создание нового документа
140 Глава 4
ДокументОЬЕ = База.Документы.ПоступлениеТоваров.СоздатьДокумент();
ДокументОЬЕ.Дата = ТекущаяДата();
ДокументОЬЕ.Контрагент = СпрЭлемент;
ДокументОЬЕ.УстановитьНовыйНомер();
ДокументОЬЕ.Записать();

Так же, как и в версии 7.7 системы "1С:Предприятие", в объектах OLE-базы
данных можно использовать только ее же объекты. В примере, рассмотрен-
ном выше (листинг 4.13), для заполнения реквизита документа контрагент
используется элемент справочника контрагенты той же OLE-базы. Это пра-
вило касается не только объектов агрегатных типов (справочников, доку-
ментов, регистров и т. п.), но и универсальных коллекций значений, таких
как массивы, структуры, списки значений и т. п.
Рассмотрим пример вывода курса доллара из регистра сведений (листинг 4.14).

Листинг 4.14. Доступ к регистрам сведений

База = Новый СОМОбъект("VS.Application"};
База.Connect(СтрокаПодключения);
// Доступ к регистрам сведений

// Поиск элемента справочника с наименованием "USD"
СправочникОЬЕ = База.Справочники.Валюты;
СпрЭлемент = СправочникОЬЕ.НайтиПоНаименованию("USD");

// Создаем структуру в OLE-базе
Структура = База.NewObject("Структура");
Структура.Вставить("Валюта", СпрЭлемент);

// Получаем курс доллара на текущую дату
РегистрСвденийОЬЕ = База.РегистрыСведений.КурсыВалют;
Структура = РегистрСведенийОЬЕ.ПолучитьПоследнее(ТекущаяДата(), Структура);
Сообщить("Курс доллара = " + Структура.Курс);
Сообщить("Кратность = " + Структура.Кратность);

В этом примере для использования фильтра применяется структура, которая
создается с помощью метода NewObject.

^ Примечание
Важно иметь в виду, что если создать структуру в исходной конфигурации с по-
мощью конструктора Новый Структура ( ) , то произойдет ошибка.
Использование OLE Automation 141

Как следует из кода, приведенного в листинге 4.14, работа с регистрами
полностью аналогична работе со справочниками и документами.

Использование запросов
В системе "1С:Предприятие" использование запросов является самым ос-
новным способом получения сводных данных, поэтому и при использова-
нии системы в качестве OLE Automation сервера очень важно уметь исполь-
зовать механизмы запросов.
Для выполнения запроса к данным OLE-базы достаточно с помощью метода
Newobject создать объект запрос и далее работать с ним стандартными ме-
тодами.
Рассмотрим простой пример вывода списка наименований контрагентов
(листинг 4.15).




База = Новый СОМОбъект("V8.Application");
База.Connect(СтрокаПодключения);

Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты";
// Создаем объект запрос
Запрос = База.NewObject("Запрос");
Запрос.Текст = Текст;
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Обход результата выполнения запроса
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

Вызов пользовательских интерфейсов
В предыдущем примере показана возможность выборки данных с помощью
запроса и вывода результатов запроса в основную базу. Эти же данные мож-
но визуализировать и в базе данных, используемой в качестве OLE Automa-
tion сервера.
Для начала необходимо показать основное окно приложения с помощью
свойства visible, а затем можно вызывать стандартные операторы — сооб-
щить, предупреждение, а также открывать формы объектов и формировать
отчеты (листинг 4.16).
142 Глава 4



База = Новый СОМОбъект("V8.Application");
// Шаг 1. Соединение с базой данных
База.Connect(СтрокаПодключения);


// Шаг 2. Установка видимости главного окна приложения
База.Visible = Истина;


// Шаг 3. Пример вывода сообщения в OLE-базе
База.Сообщить("Пример сообщения через OLE Automation");
// Пример вывода предупреждения в OLE-базе
База.Предупреждение("Форум для вопросов
http://forum.erpg.ru",,"Внимание!!!");


// Шаг 4. Открытие формы списка справочника
Форма = База.Справочники.Контрагенты.ПолучитьФорму("ФормаСписка");
Форма.Открыть();


// Шаг 5. Создание и формирование отчета
НовыйОтчет = База.Отчеты.Монитор.Создать();
НовыйОтчетФорма = НовыйОтчет.ПолучитьФорму();
ВыбраннаяНастройка = База.ВосстановитьЗначение("Монитор_настройка");


Если ВыбраннаяНастройкаоНеопределено Тогда
НовыйОтчетФорма.НачальноеЗначениеВыбора = ВыбраннаяНастройка;
КонецЕсли;


// Шаг 6. Открытие формы сформированного отчета
НовыйОтчетФорма.Открыть();


В приведенном примере последовательно выполняются следующие действия:
1. Соединение с базой данных.
2. Установка видимости главного окна приложения.
3. ВЫВОД сообщений С ПОМОЩЬЮ операторов Сообщить И Предупреждение.
4. Открытие формы списка справочника контрагенты.
5. Создание и формирование отчета монитор основных показателей.
6. Открытие формы сформированного отчета.
Использование OLE Automation 143

Данный пример полностью работоспособен на конфигурации "1С:Управление
торговлей" (редакция 10).
..

Доступ к метаданным
Для доступа к метаданным можно использовать свойство глобального кон-
текста Метаданные. Приведем пример вывода всех справочников и их рекви-
зитов для конфигурации, используемой в качестве OLE Automation сервера
(листинг 4.17).



База = Новый СОМОбъект("V8.Application");
База.Connect(СтрокаПодключения);

МетаСправочники = База.Метаданные.Справочники;
// Перебираем все справочники
Для каждого Справочник Из МетаСправочники Цикл
Сообщить(Справочник.Имя);
// Перебираем все реквизиты
Для каждого Реквизит Из Справочник.Реквизиты Цикл
Сообщить(Символы.Таб + Реквизит.Имя);
КонецЦикла;
КонецЦикла;


Использование СОМ-соединения в версии 8.0
Основная задача использования СОМ-соединения для конфигурации систе-
мы "1С:Предприятие 8.0" — это обеспечение надежного и быстрого про-
граммного доступа к объектам конфигурации из внешних приложений.
СОМ-сервер системы "1C:Предприятие 8.0" реализован в виде библиотеки
COMCntr.dll, которая выполняется в рамках исполняющего процесса.
Применение СОМ-соединения во многом похоже на использование OLE
Automation сервера, но существуют и очень важные отличия. Приведем не-
которые общесистемные отличия СОМ-соединения от OLE Automation.
При использовании СОМ-соединения:
П затрачиваются гораздо меньше системных ресурсов;
П происходит более быстрая установка соединения с базой данных;
П происходит более быстрое обращение к свойствам и методам объектов;
П полностью отсутствуют пользовательские интерфейсы.
144 Глава 4

Отличия в программном использовании СОМ-соединения можно опреде-
лить следующим образом:
О OLE-объект создается с идентификатором "vs.coMConnector";
П отсутствует свойство visible;
П не работают все методы системы "ЮПредприятие", касающиеся визуа-
лизации объектов;
П недоступен модуль приложения, но при этом доступен модуль внешнего
соединения;
П из общих модулей доступны только те, у которых установлено свойство
Внешнее соединение;
П метод connect возвращает объект соединения с базой данных (в OLE

<<

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

СОДЕРЖАНИЕ

>>