IE2017

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

Программирование - Практика программирования

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

Сразу оговорюсь, эта реализация а-ля "дешево и сердито", т.е. три функции в глобальник и вперед, т.е. для "экстренных" случаев, в тоже время уже есть реализованный COM-Объект: //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
.zip 4,10Kb
15.04.10
49
.zip 4,10Kb 49 Скачать

См. также

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