1С и NTP - как подружить

21.06.21

Разработка - Универсальные функции

В статье расказывается, как мне удалось подружить 1С и NTP

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
1С и NTP - как подружить:
.epf 7,25Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Уже давно мучает проблема подружить 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.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3616    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    6716    DeerCven    15    

59

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    49682    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7390    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    62391    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9223    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ubnkfl 21.06.21 12:18 Сейчас в теме
А почему у пользователей вообще есть на это права (на изменение системного времени)?
Dragonim; +1 Ответить
2. betepon 71 22.06.21 07:45 Сейчас в теме
(1) Это вопрос к администрированию системы, а не к 1С.
Под словом "пользователи" подразумевается "пользователи 1С", которые одновременно могут являться "администраторами" (И на своем компьютере в том числе).
Вам видимо сразу представился сервер с "пользователями Windows" которые так-же являются и "пользователями 1С".
Все нормально. Профессиональная деформация.
3. DJ_Codebase 29.06.21 11:40 Сейчас в теме
Можно еще как вариант с Яндекса запрашивать
АдресСервера = "yandex.ru";    
АдресРесурса = "/time/sync.json?geo=" + КодЧасовогоПоясаЯндекс;  
НТТР = Новый HTTPСоединение(АдресСервера, 443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Ответ = НТТР.Получить(Новый HTTPЗапрос(АдресРесурса));   
Если Ответ.КодСостояния <> 200 Тогда     
	Возврат Неопределено;      
КонецЕсли;   
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
ВремяСтрокой = Формат(ДанныеОтвета.Получить("time"), "ЧГ=0");
ТекДата = ПрочитатьДатуJSON("new Date(" + ВремяСтрокой + ")", ФорматДатыJSON.JavaScript);
Показать
4. betepon 71 29.06.21 22:28 Сейчас в теме
(3) Я с Украины, у нас этот метод не пройдет.
Яндекс блокируют.
Показанный мной метод будет работать с любым сервером NTP.
Интересно было бы действительно реализовать работу с протоколом NTP средствами 1С.
Можно найти сайты с временем и парсить их, но периодически сайты закрываются, процедуры обновляются и нужно снова писать или изменять парсер.
Но как выловить NTP через HTTP я пока не нашел.
Правда у них по две буквы общих "ТР". Может что и нароется....
5. DJ_Codebase 29.06.21 23:23 Сейчас в теме
(4) Ох уж эта политика... Быть может есть еще что то подобное на других ресурсах. ТР хоть и пишется одинаково, но в одном случае это тайм, а в другой - транспорт)) как то так.
Для отправки сообщения требуется регистрация/авторизация