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

16.04.10

Интеграция - Внешние источники данных

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

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

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

Сразу оговорюсь, эта реализация а-ля "дешево и сердито", т.е. три функции в глобальник и вперед, т.е. для "экстренных" случаев, в тоже время уже есть реализованный 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 позволяет намного больше, чем просто просмотр свойств железа, но это уже совсем другая история…

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

 

См. также

Загрузка электронных листов нетрудоспособности (ЭЛН) в ЗиК 7.7

Зарплата Внешние источники данных Расчет 7.7 1С:Зарплата и кадры 7.7 Россия Бухгалтерский учет Абонемент ($m)

Загрузка электронных листов нетрудоспособности (электронных больничных) в ЗиК 7.7 из файлов, например, из СБИС. Не нашел похожих разработок, может, плохо искал, для 1С 7.7 ЗиК.

1 стартмани

14.04.2020    8486    4    hvv2002    2    

2

JSON: Туда и Обратно

Внешние источники данных Платформа 1С v7.7 Конфигурации 1cv7 Украина Абонемент ($m)

Рабочий механизм чтения/записи строк в формате JSON для 1С 7.7. Тестировалось на релизах 7.70.25 и 27.

1 стартмани

16.12.2019    21940    60    Volvo32    33    

25

Интеграция с системой управления складом WMS Exceed-4000 (exceed-infor.ru) XML-обмен для комплексной конфигурации 1С 7.7

Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 1С:Комплексная 7.7 Оптовая торговля, дистрибуция, логистика Управленческий учет Абонемент ($m)

Обработки обмена номенклатурой (SKU), дополнительными штрихкодами (AltSku), приемкой (AdvancedShipNotice), подтверждением приема (ASNClosed), выдачей (ShipmentOrder), подтверждением выдачи (CustomerOrderLoaded) для учетной системы 1С 7.7. Здесь выгрузка и загрузка для 1C 7.7.

1 стартмани

21.10.2019    15443    1    ksnik    0    

2

Универсальная выгрузка данных из 1С 7.7 в JSON

Внешние источники данных Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Обработка для универсальной выгрузки данных из конфигурации 7.7 в JSON. Может быть полезна для задач переноса данных из различных конфигураций в другие конфигурации, для перехода на другие версии 1С, для перехода на 8.3, для переноса данных в другие системы учета, для организации онлайн выгрузки с целью синхронизации разных систем учета. Выгрузка справочников, документов, результатов запросов, остатков по планам счетов.

2 стартмани

09.10.2019    16750    71    Malice    16    

12

Обмен с SalesWorks в 1С 7.7

Внешние источники данных Оптовая торговля Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Россия Управленческий учет Абонемент ($m)

Обработка позволяет реализовать обмен данными между решением SalesWorks и 1c 7.7.

5 стартмани

16.07.2019    15911    6    vv-adm    2    

2

Выгрузка контактных данных контрагентов и формирование файла vcf. 1С 7.7

Внешние источники данных Оперативный учет 7.7 1С:Торговля и склад 7.7 Абонемент ($m)

Обработка выгружает данные контрагентов и создает два файла: один текстовый со всеми данными, другой формата vcards.vcf для загрузки контактных данных в андроид.

1 стартмани

10.05.2019    9444    4    rid636674    1    

0
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. venger 2121 15.04.10 17:27 Сейчас в теме
(0) Решил поизвращаться в семерке;-)
7. fastwriter 6 16.08.10 16:34 Сейчас в теме
(1) Статья хорошая, найден вполне грамотный выход, не требущий внешних компонент.

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

Клюшки жили, клюшки живы, клюшки - Будут жить!
4. venger 2121 15.04.10 21:38 Сейчас в теме
(2),(3) Можно узнать, и где Вы тут увидели COMОбъект?
5. venger 2121 15.04.10 22:11 Сейчас в теме
(2),(3) +4, просто поймите правильно, тут три функции в глобальнике и вперед (дешево и сердито), а там COM-Объект скомпилированный (если я правильно понял), его надо скомпилированным иметь на машине, так что для разных случаев - разные реализации, все честно;-)
6. venger 2121 15.04.10 22:20 Сейчас в теме
(2),(3) +5, в любом случае дополнил в описании со ссылкой на него....
8. San40s 1 16.01.12 14:44 Сейчас в теме
А у меня выдало ошыбку
Возврат ScrptCtrl.Run("GetCountCollection",Коллекция);
{Глобальный модуль(10522)}: :
9. San40s 1 17.01.12 16:04 Сейчас в теме
Спасибо, очень помогло. Стояла задача проверить статус принтера перед выводом на печать. Локально все отлично осталось нормально доделать для сетевого принтера.
10. pizhenkov 213 14.03.12 22:11 Сейчас в теме
Спасибо! Нужно было получить серийник проца. Плюс. Спасибо
Оставьте свое сообщение