Имя: Пароль:
1C
1С v8
v8: Проверить доступность хоста (x64)?
0 Liris
 
11.09.12
10:11
Доброго времени суток!
Исходные данные: ОС Windows 2008 Server x64, 1С:Предприятие 8.2 (8.2.15.318), Сервер 1С:Предприятия х64.
Есть необходимость в проверке на доступность хоста по ip-адресу.
Для этого написал функцию (в общем модуле):

Функция плХостДоступен(АдресХоста) Экспорт

   Результат = Ложь;
   ОбъектMSSC    =    Новый COMОбъект("MSScriptControl.ScriptControl");
   ОбъектMSSC.Language="javascript";
   ОбъектMSSC.AddCode("
   |var IsAlive = function() {
   |    var oLoc = new ActiveXObject('WbemScripting.SWbemLocator');
   |    var oSrv = oLoc.ConnectServer(null,'/root/cimv2');
   |    var ePng = new Enumerator(oSrv.ExecQuery('SELECT * FROM Win32_PingStatus WHERE Address = """ + АдресХоста + """'));
   |    ePng.moveFirst();
   |    return (ePng.item().StatusCode==0) ? 1 : 0 ;
   |};
   |");
   
   Результат = ?(ОбъектMSSC.Run("IsAlive") = 1, Истина, Ложь);
   Возврат Результат;
   
КонецФункции // ХостДоступен()


Из сеанса 1С:Предприятия функция работает без ошибок. Но в контексте регламентного задания (вызывается при выполнении регламентного задания) возникает ошибка "Ошибка при вызове конструктора (COMОбъект): Класс не зарегистрирован".
Путем анализа стало понятно, что класс "MSScriptControl" не работает под x64.
Может кто-то сталкивался с подобной ситуацией?
Может есть простой способ определить доступность хоста из 1Cv82?
Спасибо.

P.S. На форуме обсуждалась ситуация с SOAP, не помогло.
1 kolanych
 
11.09.12
10:13
На форуме обсуждались и ситуации с правами.
2 Heckfy
 
11.09.12
10:15
Может просто пингануть с выводом в файл, а потом файл прочитать.... Ну, как вариант....
3 Heckfy
 
11.09.12
10:17
Или по шаре проверить:

Файл (File)
Существует (Exist)
Синтаксис:

Существует()
Возвращаемое значение:

Тип: Булево.
Истина - файл существует; Ложь - в противном случае.
Описание:

Определяет, существует ли файл, соответствующий данному объекту.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание:

Для работы метода на веб-клиенте, необходимо предварительно подключить расширение работы с файлами.
Пример:

Функция ПроверитьСуществованиеКаталога(ИмяКаталога) Экспорт
   КаталогНаДиске = Новый Файл(ИмяКаталога);
   Если КаталогНаДиске.Существует() Тогда
       Возврат Истина;
   Иначе
       Ответ = Вопрос("Каталог не существует. Создать?",
                       РежимДиалогаВопрос.ОКОтмена);
       Если Ответ = КодВозвратаДиалога.ОК Тогда
           СоздатьКаталог(ИмяКаталога);
           Возврат Истина;
       Иначе
           Возврат Ложь;
       КонецЕсли;
   КонецЕсли;
КонецФункции
4 Liris
 
11.09.12
10:22
(3) Дело в том, что удаленные хосты - POS-системы на WIN CE 4.2. Они крайне медленно отзываются на проверку расшаренного ресурса. И чтобы экономить время мне нужно проверить доступность POS-системы вообще.
5 pumbaEO
 
11.09.12
10:24
ping 192.168.1.1 > ping.txt
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.Прочитать(ping.txt) .......
6 Liris
 
11.09.12
10:26
(2)(5) Не вариант. И не красиво.
Хотел так сделать, но самому стало не по-себе от "костылей".
На это же смешно смотреть, коллеги.
7 pumbaEO
 
11.09.12
10:33
(5) будет работать даже если ты вдруг переставишь сервер или перенесешь на другой, так что твой вариант с правами и регистрации работы 86х com объектов для работы с 64х программами в случаи чего фиг кто вспомнит.
8 Liris
 
11.09.12
10:55
Думаю, стоит попробовать вот так:

oLoc = Новый COMОбъект("WbemScripting.SWbemLocator");
oSrv = oLoc.ConnectServer(0,"/root/cimv2");

Только как записать строку:

ePng = new Enumerator(oSrv.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = """ + АдресХоста + """"));

Что такое Enumerator для 1С?
9 Liris
 
11.09.12
12:16
Сделал вот так:

Функция плХостДоступен(АдресХоста) Экспорт

   Результат = Ложь;
   
   oLoc = Новый COMОбъект("WbemScripting.SWbemLocator");
   oSrv = oLoc.ConnectServer(0,"/root/cimv2");
   ePng = oSrv.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = """ + АдресХоста + """");
   Для Каждого СтатусХоста из ePng Цикл
       Результат = ?(СтатусХоста.StatusCode = 0, Истина, Ложь);
   КонецЦикла;
   
   Возврат Результат;
   
КонецФункции // ХостДоступен()


Работает. :-)