По теме из базы знаний
- Всякие полезности
- ADODB: загрузка документов из 1С7.7 в 1С8.1. Получаем время документа
- Одна ККТ для розничного магазина и Интернет-сайта
- Замена дерева групп в интернет-магазине при обмене с 1С: Предприятие (расширение конфигурации)
- Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Конечно, можно связаться с главным доменным сервером
net time \\server_domain >> d:\temp\time.txt
получить:
"
Текущее время на \\Сервер_Домена равно 6/25/2012 15:16 PM
Команда выполнена успешно.
"
и разобрать эту строку.
Но может есть более красивое решение?
net time \\server_domain >> d:\temp\time.txt
получить:
"
Текущее время на \\Сервер_Домена равно 6/25/2012 15:16 PM
Команда выполнена успешно.
"
и разобрать эту строку.
Но может есть более красивое решение?
Как вариант (не знаю насколько изящнее) парсить можно не файл, а перехваченый результат работы консоли. Плюс только один - немножко быстрее и проще.
Это возвращает сетевое время консольным сообщением. Парсить можно или потом или в самой функции до возврата.
А это с парсингом дает готовый результат Ч:М, но через vbs:
Функция ВремяСети()
шелл = CreateObject("WScript.Shell");
консоль = шелл.Exec("cmd.exe /q /k echo off");
поток = консоль.StdOut;
консоль.StdIn.WriteLine("net time");
консоль.StdIn.WriteLine("exit");
Возврат поток.ReadAll();
КонецФункции
А это с парсингом дает готовый результат Ч:М, но через vbs:
Функция СетевоеВремя()
Скрипт = "
|Function NetTime()
| Set WshShell = CreateObject(""WScript.Shell"")
| Set WshExec = WshShell.Exec(""cmd.exe /q /k echo off"")
| Set TextStream = WshExec.StdOut
| WshExec.StdIn.WriteLine ""net time""
| WshExec.StdIn.WriteLine ""exit""
| Str = TextStream.ReadAll
| fp = InStr(str,"":"")
| ms = Int(Mid(str,fp+1,2))
| if InStr(Mid(str,fp+2,4),""P"")>0 Then
| hs=Int(Mid(str,fp-2,2))+12
| Else
| hs=Int(Mid(str,fp-2,2))
| End if
| NetTime = hs&"":""&ms
|End Function
|";
ИспСкрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
ИспСкрипт.Language="vbscript";
ИспСкрипт.AddCode(Скрипт);
Возврат ИспСкрипт.Modules("Global").CodeObject.NetTime();
КонецФункции
Показать
(18)
<quote>Функция ВремяСети()
шелл = CreateObject("WScript.Shell");
консоль = шелл.Exec("cmd.exe /q /k echo off");
поток = консоль.StdOut;
консоль.StdIn.WriteLine("net time");
консоль.StdIn.WriteLine("exit");
Возврат поток.ReadAll();
КонецФункции</quote>
Красивый вариант, не нужно с файлом заморачиваться.
Но есть маленький недостаток - при таком получении потока нельзя управлять кодировкой. 1С 7.7 не понимает.
Хотя, если нужно только время, цифры то видны.
И первой строкой можно обойтись
<quote>Функция ВремяСети()
шелл = CreateObject("WScript.Shell");
консоль = шелл.Exec("cmd.exe /q /k echo off");
поток = консоль.StdOut;
консоль.StdIn.WriteLine("net time");
консоль.StdIn.WriteLine("exit");
Возврат поток.ReadAll();
КонецФункции</quote>
Красивый вариант, не нужно с файлом заморачиваться.
Но есть маленький недостаток - при таком получении потока нельзя управлять кодировкой. 1С 7.7 не понимает.
Хотя, если нужно только время, цифры то видны.
И первой строкой можно обойтись
Возврат поток.ReadLine();
(27) simply1, Да, кирилица выходит кашей, но парсить то нужно цифры и латиницу (PM или AM). Функция на vbs вполне это делает и там, кстати, тоже кодировка кирилицы - мрак. Решать в любом случае Вам. Здесь уже вариантов масса...
Не забудьте написать на чем остановитесь, для будущих посетителей топика, так как никто развернутого конечного решения не предложил - Вы первый кто столкнулся с такой проблемой и Ваш опыт будет весьм ценен другим.
Не забудьте написать на чем остановитесь, для будущих посетителей топика, так как никто развернутого конечного решения не предложил - Вы первый кто столкнулся с такой проблемой и Ваш опыт будет весьм ценен другим.
(18)
<quote>Функция СетевоеВремя()
Скрипт = "
|Function NetTime()
| Set WshShell = CreateObject(""WScript.Shell"")
| Set WshExec = WshShell.Exec(""cmd.exe /q /k echo off"")
| Set TextStream = WshExec.StdOut
| WshExec.StdIn.WriteLine ""net time""
| WshExec.StdIn.WriteLine ""exit""
| Str = TextStream.ReadAll
| fp = InStr(str,"":"")
| ms = Int(Mid(str,fp+1,2))
| if InStr(Mid(str,fp+2,4),""P"")>0 Then
| hs=Int(Mid(str,fp-2,2))+12
| Else
| hs=Int(Mid(str,fp-2,2))
| End if
| NetTime = hs&"":""&ms
|End Function
|";
ИспСкрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
ИспСкрипт.Language="vbscript";
ИспСкрипт.AddCode(Скрипт);
Возврат ИспСкрипт.Modules("Global").CodeObject.NetTime();
КонецФункции</quote>
Просто супер! Уже распарсено!
Еще раз спасибо!
<quote>Функция СетевоеВремя()
Скрипт = "
|Function NetTime()
| Set WshShell = CreateObject(""WScript.Shell"")
| Set WshExec = WshShell.Exec(""cmd.exe /q /k echo off"")
| Set TextStream = WshExec.StdOut
| WshExec.StdIn.WriteLine ""net time""
| WshExec.StdIn.WriteLine ""exit""
| Str = TextStream.ReadAll
| fp = InStr(str,"":"")
| ms = Int(Mid(str,fp+1,2))
| if InStr(Mid(str,fp+2,4),""P"")>0 Then
| hs=Int(Mid(str,fp-2,2))+12
| Else
| hs=Int(Mid(str,fp-2,2))
| End if
| NetTime = hs&"":""&ms
|End Function
|";
ИспСкрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
ИспСкрипт.Language="vbscript";
ИспСкрипт.AddCode(Скрипт);
Возврат ИспСкрипт.Modules("Global").CodeObject.NetTime();
КонецФункции</quote>
Просто супер! Уже распарсено!
Еще раз спасибо!
(40) simply1, А вот и не знаю:( CMD в любом случае активизирется, а после этого стандартный Shell не может активировать окно 1С. Точнее может, но хитро и по-разному. У меня не взлетел ни один способ. А так у кого какой получается сюдя по форумам. Универсального способа скорее всего нет, а значит (если потеря активации окна 1С критична) лучше искать другой способ или экспериментировать пока не получится.
Скорее всего Windows блокирует где-то возможности wshShell.appActivate, так что от версии винды и нужно плясать.
Почитать можноздесь и здесь .
Скорее всего Windows блокирует где-то возможности wshShell.appActivate, так что от версии винды и нужно плясать.
Почитать можно
можно парсить не обязательно команду - можно страничку html
http://www.direct-time.ru/index.php?id=2
Останавливаюсь на Вашем варианте с VBS.
Вчера быстренько набросать свой парсинг из файла - получилось 70 строк кода 1С.
А у Вас - 20!
Логику вижу следующую:
1) При подключении фискального регистратора проверяю доступность контролера домена.
2) Если доступен - получаю время через Ваш код VBS и если разница составляет более 120 секунд (ИХМО, не критическое расхождение), то обновляю время в ФР.
3) Если нет интернета - ничего не делаю.
Где то так.
Вчера быстренько набросать свой парсинг из файла - получилось 70 строк кода 1С.
А у Вас - 20!
Логику вижу следующую:
1) При подключении фискального регистратора проверяю доступность контролера домена.
2) Если доступен - получаю время через Ваш код VBS и если разница составляет более 120 секунд (ИХМО, не критическое расхождение), то обновляю время в ФР.
3) Если нет интернета - ничего не делаю.
Где то так.
Прикольно:
Результа: 12:41:31
"=16" в конце веб-ссылки - это киевское время.
Там есть и другие города
ах=СоздатьОбъект("MSXML2.XMLHTTP");
ах.Open("get", "http://www.direct-time.ru/index.php?id=16",0);
ах.Send();
стрОтвет=ах.Responsetext;
чСимв=Найти(стрОтвет,"<td id=""local_time"">");
стрТекВремя=Сред(стрОтвет,чСимв+20,8);
Сообщить(стрТекВремя);
Результа: 12:41:31
"=16" в конце веб-ссылки - это киевское время.
Там есть и другие города
Из любопытства отлажу во времени оба варианта:
глИнформация() - пишет в лог 1С и при наличии ошибок - отправляет мне на е-маил.
Через время сообщу о результатах
//==================================================
// Определяет время контролера домена
// Возвращает строку:
// - со временем (успешно)
// - пустую (ошибки)
//
Функция ВремяДомена() Экспорт
Результат = "";
КодОшб=ПроверитьДоступностьУзла(СерверИмя);
Если КодОшб>0 Тогда
глИнформация("Ошибка пинга контролера домена = "+КодОшб+" (ВремяДомена)","Класс",_ИмяКласса);
Возврат Результат;
КонецЕсли;
Попытка
ТекстСкрипта =
"Function NetTime()
| Set WshShell = CreateObject(""WScript.Shell"")
| Set WshExec = WshShell.Exec(""cmd.exe /q /k echo off"")
| Set TextStream = WshExec.StdOut
| WshExec.StdIn.WriteLine ""net time""
| WshExec.StdIn.WriteLine ""exit""
| Str = TextStream.ReadAll
| fp = InStr(str,"":"")
| ms = Int(Mid(str,fp+1,2))
| if InStr(Mid(str,fp+2,4),""P"")>0 Then
| hs=Int(Mid(str,fp-2,2))+12
| Else
| hs=Int(Mid(str,fp-2,2))
| End if
| NetTime = hs&"":""&ms
|End Function
|"
;
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbscript";
Скрипт.AddCode(ТекстСкрипта);
Результат = Скрипт.Modules("Global").CodeObject.NetTime();
ТекстСкрипта=Пусто; Скрипт=Пусто;
Исключение
глИнформация("Ошибка получения времени домена = <"+ОписаниеОшибки()+">","Класс",_ИмяКласса);
КонецПопытки;
КодОшб=Пусто;
Возврат Результат;
КонецФункции // ВремяДомена
//==================================================
// Определяет киевское время на WEB-узле www.direct-time.ru
// Возвращает строку:
// - со временем (успешно)
// - пустую (ошибки)
//
Функция ВремяВеб() Экспорт
Результат = "";
КодОшб=ПроверитьДоступностьУзла(СерверИмя);
Если КодОшб>0 Тогда
глИнформация("Ошибка пинга контролера домена = "+КодОшб+" (ВремяВеб)","Класс",_ИмяКласса);
Возврат Результат;
КонецЕсли;
Попытка
ах=СоздатьОбъект("MSXML2.XMLHTTP");
ах.Open("get", "http://www.direct-time.ru/index.php?id=16",0);
ах.Send();
стрОтвет=ах.ResponseText;
чСимв=Найти(стрОтвет,"<td id=""local_time"">");
Если чСимв>0 Тогда
Результат=СокрЛП(Сред(стрОтвет,чСимв+20,8));
Иначе
глИнформация("Ошибка! Не найден тег '<td id=""local_time"">' в тексте длиной "+СтрДлина(стрОтвет),"Класс",_ИмяКласса);
КонецЕсли;
ах=Пусто; стрОтвет=Пусто; чСимв=Пусто;
Исключение
глИнформация("Ошибка получения времени веб = <"+ОписаниеОшибки()+">","Класс",_ИмяКласса);
КонецПопытки;
Возврат Результат;
КонецФункции // ВремяВеб
Пусто=ПолучитьПустоеЗначение();
ПоказатьглИнформация() - пишет в лог 1С и при наличии ошибок - отправляет мне на е-маил.
Через время сообщу о результатах
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот