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

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 1103 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 1103 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 1103 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С и при наличии ошибок - отправляет мне на е-маил.

Через время сообщу о результатах
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день