Получить время из Интернет

1. simply1 6 25.06.12 16:01 Сейчас в теме
Долго "курю" гугл и ни как не могу найти работающее решение по вопросу:
"Как получить время из Интернет?".
Просто получить. И не более.
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. simply1 6 25.06.12 16:02 Сейчас в теме
Может кто-нибудь помочь?
3. DenisCh 25.06.12 16:08 Сейчас в теме
КомандаСистемы("net time /setsntp:time.microsoft.com");
КомандаСистемы9"net time > c:\temp\time.txt");
текст = Новый ТекстовыйДокумент;
текст.Прочитать("c:\temp\time.txt");

и дальше прочитать этот файл
7. simply1 6 25.06.12 16:12 Сейчас в теме
(3) net time - устанавливает.
Не подходит, т.к. у доменного пользователя нет прав.
11. DenisCh 25.06.12 16:17 Сейчас в теме
(7) simply1, что, правда устанавливает? А что тогда в параметрах команды делает ключ /SET ?
13. simply1 6 25.06.12 16:23 Сейчас в теме
(11) и (12)
"Системная ошибка 1314.

Клиент не обладает требуемыми правами."
4. Ёпрст 1063 25.06.12 16:08 Сейчас в теме
что есть "время из Интернет" в вашем понимании ?
5. Ёпрст 1063 25.06.12 16:11 Сейчас в теме
имеется ввиду, получить время с ntp-серваков, типа ntp.mobatime.ru ?
8. simply1 6 25.06.12 16:12 Сейчас в теме
6. Ёпрст 1063 25.06.12 16:12 Сейчас в теме
9. ArikiteSun 25.06.12 16:13 Сейчас в теме
Для каких целей, в какое приложение нужно получить сверенное время?
10. simply1 6 25.06.12 16:13 Сейчас в теме
(9) в 1С 7.7, для сверки с временем в фискальном регистраторе
12. Ёпрст 1063 25.06.12 16:20 Сейчас в теме
Дык

net time <контролер домена> /set /yes

и всего делов
14. simply1 6 25.06.12 16:23 Сейчас в теме
Конечно, можно связаться с главным доменным сервером
net time \\server_domain >> d:\temp\time.txt

получить:
"
Текущее время на \\Сервер_Домена равно 6/25/2012 15:16 PM

Команда выполнена успешно.
"

и разобрать эту строку.

Но может есть более красивое решение?
15. simply1 6 25.06.12 16:36 Сейчас в теме
значит более красивого решения нет.

Большое спасибо всем попытавшимся помочь!
16. asved.ru 36 25.06.12 18:35 Сейчас в теме
19. simply1 6 25.06.12 18:50 Сейчас в теме
(16) Спасибо! Интересная компонента.
Надо будет потестить.
26. simply1 6 26.06.12 11:42 Сейчас в теме
(16) Ребекс - платная штука ... Отпадает
17. asved.ru 36 25.06.12 18:37 Сейчас в теме
ЗЫ возможно, есть и стандартный wmi или com, поищите на течнете
18. dusha0020 1104 25.06.12 18:45 Сейчас в теме
Как вариант (не знаю насколько изящнее) парсить можно не файл, а перехваченый результат работы консоли. Плюс только один - немножко быстрее и проще.
Функция ВремяСети()
	шелл = 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();
КонецФункции
Показать
dicwork; simply1; +2 Ответить
20. simply1 6 25.06.12 18:50 Сейчас в теме
(18)
Очень интересное решение!
Спасибо большое!

Завтра же проверю.
27. simply1 6 26.06.12 12:54 Сейчас в теме
(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 не понимает.
Хотя, если нужно только время, цифры то видны.
И первой строкой можно обойтись
Возврат поток.ReadLine();
30. dusha0020 1104 26.06.12 13:02 Сейчас в теме
(27) simply1, Да, кирилица выходит кашей, но парсить то нужно цифры и латиницу (PM или AM). Функция на vbs вполне это делает и там, кстати, тоже кодировка кирилицы - мрак. Решать в любом случае Вам. Здесь уже вариантов масса...
Не забудьте написать на чем остановитесь, для будущих посетителей топика, так как никто развернутого конечного решения не предложил - Вы первый кто столкнулся с такой проблемой и Ваш опыт будет весьм ценен другим.
28. simply1 6 26.06.12 12:58 Сейчас в теме
(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>
Просто супер! Уже распарсено!
Еще раз спасибо!
39. simply1 6 26.06.12 16:05 Сейчас в теме
(18) dusha0020, после отработки скрипта окно 1С становиться не активным.
Как избавиться?
40. simply1 6 26.06.12 16:58 Сейчас в теме
+ (39)
на мгновение открывается окно консоли, а после закрытия активным становится окно, открытое перед окном 1С
41. dusha0020 1104 26.06.12 19:59 Сейчас в теме
(40) simply1, А вот и не знаю:( CMD в любом случае активизирется, а после этого стандартный Shell не может активировать окно 1С. Точнее может, но хитро и по-разному. У меня не взлетел ни один способ. А так у кого какой получается сюдя по форумам. Универсального способа скорее всего нет, а значит (если потеря активации окна 1С критична) лучше искать другой способ или экспериментировать пока не получится.
Скорее всего Windows блокирует где-то возможности wshShell.appActivate, так что от версии винды и нужно плясать.
Почитать можно здесь и здесь .
42. simply1 6 09.08.12 11:00 Сейчас в теме
Вот и время прошло.

Вариант через сайт начал присылать фидбеки:
- msxml3.dll: The system cannot locate the resource specified.
- msxml3.dll: Системная ошибка: -2146697211.

Подключил вариант (18) dusha0020 через vbs. Каждый раз когда сбоит через сайт - запускаю скрипт.
21. brunet 39 25.06.12 18:52 Сейчас в теме
а может лучше синхронизировать время на компьютере, а потом брать текущееВремя()
22. simply1 6 25.06.12 18:54 Сейчас в теме
(21) доменным пользователям запрещено категорически. И я полностью с этим согласен.
Надо в групполиси покопаться, чтобы само синхронизировалось быстро и качественно.

Может и впрямь, зачем огород городить?
23. asved.ru 36 25.06.12 18:56 Сейчас в теме
(21) brunet, Сказано же, правов нет.

Впрочем, кто мешает запускать синхронизацию с DC из планировщика?

И даже более того, раздайте NTP-сервер по DHCP - и будет вам счастье.
24. simply1 6 25.06.12 19:03 Сейчас в теме
(23)
да, спасибо!
Синхронизировать винду - вариантов много.
25. simply1 6 25.06.12 19:03 Сейчас в теме
+(24) и это на много проще :)
29. simply1 6 26.06.12 13:00 Сейчас в теме
Есть варианты с NTP-сервера получить?
31. sman 26.06.12 13:06 Сейчас в теме
можно парсить не обязательно команду - можно страничку html
http://www.direct-time.ru/index.php?id=2
33. simply1 6 26.06.12 13:32 Сейчас в теме
(31) Спасибо! Интересный сайт! Хорошо расписано.
Сейчас попробую
32. simply1 6 26.06.12 13:11 Сейчас в теме
Останавливаюсь на Вашем варианте с VBS.
Вчера быстренько набросать свой парсинг из файла - получилось 70 строк кода 1С.
А у Вас - 20!

Логику вижу следующую:

1) При подключении фискального регистратора проверяю доступность контролера домена.
2) Если доступен - получаю время через Ваш код VBS и если разница составляет более 120 секунд (ИХМО, не критическое расхождение), то обновляю время в ФР.
3) Если нет интернета - ничего не делаю.

Где то так.
34. simply1 6 26.06.12 13:45 Сейчас в теме
Прикольно:
	ах=СоздатьОбъект("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" в конце веб-ссылки - это киевское время.
Там есть и другие города
35. simply1 6 26.06.12 13:55 Сейчас в теме
(34) но не надежно - изменится дизайн страницы и ищи тег заново ...
36. sman 26.06.12 14:47 Сейчас в теме
если есть свой http сервер то можно свое поднять ..
37. simply1 6 26.06.12 14:49 Сейчас в теме
(36) sman,
хорошая мысль, но увы, нет
38. simply1 6 26.06.12 15:00 Сейчас в теме
Из любопытства отлажу во времени оба варианта:
//==================================================
// Определяет время контролера домена
// Возвращает строку:
//	- со временем (успешно)
//	- пустую (ошибки)
//
Функция ВремяДомена() Экспорт
	Результат = "";
	
	КодОшб=ПроверитьДоступностьУзла(СерверИмя);
	Если КодОшб>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С и при наличии ошибок - отправляет мне на е-маил.

Через время сообщу о результатах
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот