Уже давно мучает проблема подружить 1С и NTР. Дело в том, что недобросовестные пользователи наловчились переводить системные часы. И соответственно даты проводок оказываются неправильными или в базе возникают проблемы.
Некоторое время удавалось решить эти проблемы с помощью серверов NIST (стандарта DAYTIME). Однако это не надежно, потому что этот протокол рассчитан в своей работе до 2036 года.
NTP протокол 1С не поддерживается. Решение (для windows) заключается в использовании службы w32tm.
Вызов w32tm.exe /monitor /computers:ntp.ru даст нам следующий результат:
ntp.ru[95.140.150.140:123]:
ICMP: ошибка IP_REQ_TIMED_OUT - нет ответа в 1000ms
NTP: -86388.7325586s смещение относительно локального времени
RefID: time1.stupi.se [192.36.143.150]
Страта: 2
где число 86388.7325586 - это расхождение между временем сервера и временем компьютера в секундах.
- означает что ваши часы спешат относительно сервера
+ означает что ваши часы отстают от времени сервера.
Нужно также помнить, что расхождение указано в секундах. В одних сутках 86400 секунд.
Таким образом родились две простые процедуры.
Процедура ТочноеВремяПоNTP(РежимВозврта, КодСообщения) Экспорт
Попытка
КатВрем = КаталогВременныхФайлов();
ВремФайлПуть1 = КатВрем + "NTP1.TMP" ;
ВремСтр1 = "C:\Windows\System32\w32tm.exe /monitor /computers:ntp.ru > " + ВремФайлПуть1;
КомандаСистемы(ВремСтр1, "");
NTPAnswer = ПрочитатьФайлNTP(ВремФайлПуть1);
DeleteFiles(ВремФайлПуть1);
Исключение
КодСообщения = "011";
Сообщить(ОписаниеОшибки());
КонецПопытки;
// NTPAnswer - Расхождение времени сервера и времени компьютера в секундах.
// 86400 - секунд в сутках
Если Число(NTPAnswer) <= 3600 Тогда
// Расхождение меньше часа
РежимВозврта = Ложь;
Иначе
// Расхождение больше часа Блокируем работу.
КодСообщения = "013";
РежимВозврта = Истина;
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьФайлNTP (ИмяФайлаNTP)
Текст = Новый ЧтениеТекста;
Текст.Открыть(ИмяФайлаNTP);
Т_Строка = Текст.ПрочитатьСтроку();
Пока Т_Строка <> Неопределено Цикл //строки читаются до символа перевода строки
//манипуляции со строкой
Позиция = Найти(Т_Строка, "NTP:");
Если Позиция > 0 Тогда
Т_НачальнаяПозиция = Позиция + 6;
Т_КонечнаяПозиция = СтрНайти(Т_Строка,"s",НаправлениеПоиска.СНачала,Т_НачальнаяПозиция,1);
СмещениеNTPСекунд = СокрЛП(Сред(Т_Строка, Т_НачальнаяПозиция, Т_КонечнаяПозиция - Т_НачальнаяПозиция));
КонецЕсли;
Т_Строка = Текст.ПрочитатьСтроку();
КонецЦикла;
Возврат (СмещениеNTPСекунд)
КонецФункции
Вызываем сравнение времени между локальным компьютером и сервером ntp.ru
Результат сохраняем в файл. Обрабатываем файл в поисках характерной строки. Получаем из строки смещение в секундах. Сравниваем полученное смещение с заранее заданным значением и принимаем решение.
Замеченный минус один - при выполнении КомандаСистемы на некоторое время появляется черное окно. Побороть это другими методами запуска не удалось.
Во вложении - тестовая обработка на управляемых формах, которая демонстрирует применение указанного алгоритма. Алгоритм не завязан на конкретные конфигурации и платформы, будет работать в среде Windows (начиная с XP) во всех конфигурациях с режимом совместимости больше 8.3.6.