gifts2017

Доступ к объектам WMI и работа с коллекциями из 1С 7.7

Опубликовал Александр Венгер (venger) в раздел Программирование - Практика программирования

На самом деле существует несколько ограничений для использования средств WMI в 1С 7.7. Это и отсутствие конструкции перебора элементов коллекции, как в 1С 8.х, т.е. «Для каждого...Из...Цикл...КонецЦикла;». И отсутствие аналога восьмерочной функции «ПолучитьCOMОбъект».
Но используя пару приведенных функций (как упрощенные примеры), вполне можно разрешить эти проблемы, не вдаваясь в написание своих COM-Объектов, dll’к (внешних компонент) или написания всего кода работы с WMI объектами на других языках и выполнения его из 1С 7.7.

Сразу оговорюсь, эта реализация а-ля "дешево и сердито", т.е. три функции в глобальник и вперед, т.е. для "экстренных" случаев, в тоже время уже есть реализованный COM-Объект: http://infostart.ru/public/14386/

Итак, собственно простенькие функции:

 


//==================================================

Функция глПолучитьЭлементКоллекцииПоНомеру(Коллекция,Номер) Экспорт Далее

Функция
глПолучитьКолВоЭлементовКоллекции(Коллекция) Экспорт Далее

Функция
глПолучитьCOMОбъект(СтрокаПараметров) Экспорт Далее

//==================================================



//==================================================

// Функция возвращает элемент коллекции по номеру,

// так как в 1С 7.7 нет цикла, аналогичному

// конструкции "Для каждого...Из...Цикл...КонецЦикла;",

// которая есть в 1С 8.х

Функция глПолучитьЭлементКоллекцииПоНомеру(Коллекция,Номер) Экспорт

   
ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");

   
ScrptCtrl.Language="vbscript";



   
ScrptCtrl.AddCode("

        |Function EnumerateCollection(ObjSet,Number)

        |   Count = 0

        |   For Each Obj In ObjSet

        |       If Count = Number Then

        |           Set EnumerateCollection = Obj

        |           Exit Function

        |       End If

        |       Count = Count + 1

        |   Next

        |End Function

        |"
);



    Возврат
ScrptCtrl.Run("EnumerateCollection",Коллекция,Номер);

КонецФункции   
// глПолучитьЭлементКоллекцииПоНомеру

//==================================================



//==================================================

// Функция возвращает количество элементов коллекции

// т.к. не каждый класс имеет свойство Count. Если оно

// отсутствует, то для определения количества элементов

// в коллекции применяется эта функция

Функция глПолучитьКолВоЭлементовКоллекции(Коллекция) Экспорт

   
ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");

   
ScrptCtrl.Language="vbscript";



   
ScrptCtrl.AddCode("

        |Function GetCountCollection(ObjSet)

        |   Count = 0

        |   For Each Obj In ObjSet

        |       Count = Count + 1

        |   Next

        |   GetCountCollection = Count

        |End Function

        |"
);



    Возврат
ScrptCtrl.Run("GetCountCollection",Коллекция);

КонецФункции   
// глПолучитьКолВоЭлементовКоллекции

//==================================================



//==================================================

// Функция возвращает СОМОбъект по моникеру или имени файла

// Фактически заменяет функцию ПолучитьCOMОбъект в версии 1С 8.х

Функция глПолучитьCOMОбъект(СтрокаПараметров) Экспорт

   
ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");

   
ScrptCtrl.Language="vbscript";



   
ScrptCtrl.AddCode("

        |Function GetCOMObject(Str)

        |   Set GetCOMObject = GetObject(Str)

        |End Function

        |"
);



    Возврат
ScrptCtrl.Run("GetCOMObject",СтрокаПараметров);

КонецФункции   
// глПолучитьCOMОбъект

//==================================================



 

 

Примеры использования:

 


//==================================================

Процедура Выполнить()

   
// Таким образом, например, мы можем перебрать все дисковые накопители

    // (HDD) на локальном компьютере из 1С 7.7

   
Сообщить("==============================================");

   
ИмяСервера = ".";

   
ServicesSet = глПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +

                                       
ИмяСервера + "\root\cimv2");

   
ObjectSet = ServicesSet.ExecQuery("Select * from Win32_DiskDrive");

    Для
Ном = 0 По глПолучитьКолВоЭлементовКоллекции(ObjectSet)-1 Цикл

       
Item = глПолучитьЭлементКоллекцииПоНомеру(ObjectSet,Ном);

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

    КонецЦикла;

    Сообщить(
"==============================================");





   
// Или, например, посмотреть все свойства процессоров на локальном

    // компьютере из 1С 7.7

   
Locator = СоздатьОбъект("WbemScripting.SWbemLocator");

   
ServicesSet = Locator.ConnectServer(".");

   
ObjectSet = ServicesSet.InstancesOf("Win32_Processor");

    Для
Ном = 0 По глПолучитьКолВоЭлементовКоллекции(ObjectSet)-1 Цикл

       
Item = глПолучитьЭлементКоллекцииПоНомеру(ObjectSet,Ном);

        Сообщить(
"==============================================");

        Для
Ном2=0 По глПолучитьКолВоЭлементовКоллекции(Item.Properties_)-1 Цикл

           
Prop=глПолучитьЭлементКоллекцииПоНомеру(Item.Properties_,Ном2);

            Сообщить(
Prop.Name+" =" + Prop.Value);

        КонецЦикла;

        Сообщить(
"==============================================");

    КонецЦикла;

КонецПроцедуры 
// Выполнить

//==================================================



 

На самом деле технология WMI позволяет намного больше, чем просто просмотр свойств железа, но это уже совсем другая история…

З.Ы. В обработке - готовая демонстрация изложенных подходов...

 

Скачать файлы

Наименование Файл Версия Размер
AccessWMI.zip 49
.zip 4,10Kb
15.04.10
49
.zip 4,10Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Венгер (venger) 15.04.10 17:27
(0) Решил поизвращаться в семерке;-)
4. Александр Венгер (venger) 15.04.10 21:38
(2),(3) Можно узнать, и где Вы тут увидели COMОбъект?
5. Александр Венгер (venger) 15.04.10 22:11
(2),(3) +4, просто поймите правильно, тут три функции в глобальнике и вперед (дешево и сердито), а там COM-Объект скомпилированный (если я правильно понял), его надо скомпилированным иметь на машине, так что для разных случаев - разные реализации, все честно;-)
6. Александр Венгер (venger) 15.04.10 22:20
(2),(3) +5, в любом случае дополнил в описании со ссылкой на него....
7. fastwriter (fastwriter) 16.08.10 16:34
(1) Статья хорошая, найден вполне грамотный выход, не требущий внешних компонент.

После прочтения данной статьи решил возвращаться к семерке :) Каламбур однако.

Клюшки жили, клюшки живы, клюшки - Будут жить!
8. Sasha Pro (San40s) 16.01.12 14:44
А у меня выдало ошыбку
Возврат ScrptCtrl.Run("GetCountCollection",Коллекция);
{Глобальный модуль(10522)}: :
9. Sasha Pro (San40s) 17.01.12 16:04
Спасибо, очень помогло. Стояла задача проверить статус принтера перед выводом на печать. Локально все отлично осталось нормально доделать для сетевого принтера.
10. artem2922 (pizhenkov) 14.03.12 22:11
Спасибо! Нужно было получить серийник проца. Плюс. Спасибо