Не перепутать миллисекунды 1С с timestamp внешнего API

Учебные задачи

Восстанавливаем UTC из счётчика 1С и сравниваем его с текущей датой UTC. Отдельно показываем дату сеанса, чтобы не выдавать её за универсальный момент.

Где и как запускать

Полный серверный общий модуль учебной копии. Только чтение настроек и вычисления в памяти.

Подготовка

  1. Работайте в отдельной учебной копии базы. Создайте серверный общий модуль УчебныеЗадачи, вставьте полный модуль урока и вызовите ВыполнитьПример() из серверного обработчика учебной команды.

  2. Код выполняется на сервере: часть функций локализации и часовых поясов недоступна непосредственно в тонком клиенте. Реквизиты пользователя, региональные настройки и часовые пояса код не меняет.

  3. Для двух уроков о метаданных используйте копию КА2 Progress: в исходном Languages/Русский.xml действительно есть язык Русский с КодЯзыка = ru. Остальные уроки не требуют объектов конкретной конфигурации.

Процедура ВыполнитьПример() Экспорт
    UTCДо = ТекущаяУниверсальнаяДата();
    Миллисекунды1С = ТекущаяУниверсальнаяДатаВМиллисекундах();
    UTCПосле = ТекущаяУниверсальнаяДата();
    ВосстановленноеUTC = Дата(1, 1, 1) + Цел(Миллисекунды1С / 1000);
    Сообщить(ТипЗнч(Миллисекунды1С) = Тип("Число"));
    Сообщить(ТипЗнч(ВосстановленноеUTC) = Тип("Дата"));
    Если UTCПосле >= UTCДо Тогда
        Сообщить(ВосстановленноеUTC >= UTCДо И ВосстановленноеUTC <= UTCПосле);
    Иначе
        Сообщить("Системные часы изменились между вызовами; интервальную проверку пропускаем");
    КонецЕсли;
    Сообщить("Восстановленное UTC: " + Формат(ВосстановленноеUTC, "ДФ=yyyy-MM-dd HH:mm:ss"));
    ДатаСеанса = ТекущаяДатаСеанса();
    Сообщить("Дата сеанса: " + Формат(ДатаСеанса, "ДФ=yyyy-MM-dd HH:mm:ss"));
    Сообщить("Пояс сеанса: " + ЧасовойПоясСеанса());
    УчебныйUTC = Дата(1970, 1, 1, 0, 0, 10);
    УчебныеМиллисекундыUnix = (УчебныйUTC - Дата(1970, 1, 1)) * 1000;
    Сообщить(УчебныеМиллисекундыUnix = 10000);
КонецПроцедуры

Разбор по шагам

  1. ТекущаяУниверсальнаяДатаВМиллисекундах считает миллисекунды с 01.01.0001. Делим на 1000 и берём целую часть, потому что обычная Дата имеет секундную точность.

  2. Дата(1, 1, 1) — начало шкалы счётчика 1С. Прибавление количества секунд восстанавливает UTC, а не местное время сервера.

  3. Два независимых чтения UTC ограничивают момент измерения. Обычно интервальная проверка истинна; системная корректировка часов может повлиять на диагностику. Это не монотонный таймер.

  4. ТекущаяДатаСеанса возвращает дату сервера в поясе сеанса; приоритет — пояс сеанса, затем базы, затем сервера. Это не второй способ получить UTC.

  5. Unix-миллисекунды имеют начало 01.01.1970. Последний расчёт только для своего явно заданного UTC: 10 секунд после начала дают 10000. Контракт реального внешнего API необходимо проверить отдельно.

Как проверить результат

  1. Две проверки типов — Истина. При неизменных часах интервальная проверка — Истина; учебный Unix-пример в конце — Истина.

  2. Значения текущего времени меняются при каждом запуске. Не сравнивайте их с жёстко заданной сегодняшней датой.

  3. В коде нет setter часового пояса, изменения системных часов или обращения к внешнему API.

Ожидаемый результат

Начинающий различает UTC, дату сеанса и две разные эпохи миллисекунд.

На что обратить внимание

  1. Нельзя передавать счётчик миллисекунд 1С в API, ожидающий Unix timestamp, без преобразования эпохи.

  2. Не оценивайте точную производительность по настенным часам: они могут корректироваться ОС.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.