Разработка и Конфигурация · 8 мин
Как из даты получить секунды в 1С
Как в 1С преобразовать дату в секунды Unix timestamp: формулы, готовые функции, обратное преобразование, учёт часовых поясов и типичные ошибки разработчиков.
Задача получить из даты количество секунд возникает в 1С чаще всего при обмене данными с внешними системами: REST API, веб-сервисы, подпись запросов, JWT-токены и интеграции с сайтами ожидают время в формате Unix timestamp — числа секунд, прошедших с 1 января 1970 года. Во встроенном языке 1С нет готовой функции «ДатаВСекунды», поэтому преобразование выполняется вручную через вычитание дат.
Механизм простой: в 1С разность двух значений типа «Дата» даёт число секунд между ними. Если вычесть из нужной даты начало эпохи Unix (01.01.1970 00:00:00), результатом будет искомый timestamp. Вся дальнейшая работа — это корректный учёт часового пояса, миллисекунд и граничных случаев.
Почему разность дат в 1С даёт секунды
Во встроенном языке 1С тип «Дата» поддерживает арифметические операции. Вычитание одной даты из другой возвращает число — количество секунд между моментами. Это базовое поведение платформы, оно одинаково работает в тонком, толстом и веб-клиенте, а также на сервере.
Обратная операция тоже доступна: прибавив к дате число, вы сдвинете её на указанное количество секунд. Например, Дата(2026,1,1) + 3600 даст 01.01.2026 01:00:00. Этим же приёмом выполняется обратное преобразование timestamp в дату.
Базовая формула преобразования даты в секунды
Минимальный вариант выглядит так:
ДатаНачалаЭпохи = Дата(1970, 1, 1, 0, 0, 0);
СекундыUnix = МояДата - ДатаНачалаЭпохи;
Переменная СекундыUnix будет содержать целое число секунд. Такой код подходит, когда исходная дата уже задана в UTC или когда обе стороны обмена договорились работать в одном часовом поясе.
Если нужна текущая дата в секундах, используйте:
СекундыUnix = ТекущаяДатаСеанса() - Дата(1970, 1, 1);
Для прикладных решений удобнее оформить преобразование функцией в общем модуле, чтобы не дублировать константу начала эпохи по всему коду.
Функция ДатаВСекундыUnix(Знач Дата) Экспорт
Возврат Дата - Дата(1970, 1, 1, 0, 0, 0);
КонецФункцииКак учесть часовой пояс
Главный подводный камень — разница между локальным временем и UTC. Unix timestamp по определению отсчитывается от UTC, а ТекущаяДатаСеанса() возвращает время в часовом поясе сеанса. Если напрямую вычесть начало эпохи из локальной даты, результат будет смещён на величину смещения пояса.
Для корректного результата переведите дату в универсальное время. В типовых конфигурациях есть функция УниверсальноеВремя() из общего модуля работы с датами, либо можно вычислить смещение самостоятельно:
Смещение = СмещениеСтандартногоВремени(ЧасовойПоясСеанса())
+ СмещениеЛетнегоВремени(ЧасовойПоясСеанса());
СекундыUnixUTC = МояДата - Смещение - Дата(1970, 1, 1);
Проверить правильность просто: сравните полученное число с любым онлайн-конвертером Unix timestamp для той же даты в UTC. Совпадение до секунды означает, что пояс учтён верно.
Обратное преобразование: из секунд в дату
Чтобы восстановить дату из timestamp, прибавьте число секунд к началу эпохи:
ДатаИзСекунд = Дата(1970, 1, 1) + СекундыUnix;
Результат будет в UTC. Если нужно показать пользователю локальное время, добавьте смещение часового пояса сеанса тем же способом, что описан выше.
Обратите внимание: некоторые системы передают время в миллисекундах (13-значное число). В этом случае перед преобразованием разделите значение на 1000, иначе получите дату далёкого будущего.
Миллисекунды и повышенная точность
Тип «Дата» в 1С хранит время с точностью до секунды, поэтому «родных» миллисекунд в нём нет. Если внешняя система требует timestamp в миллисекундах, умножьте результат на 1000:
МиллисекундыUnix = (МояДата - Дата(1970, 1, 1)) * 1000;
Для измерения коротких интервалов внутри кода (например, длительности операции) вместо дат используйте ТекущаяУниверсальнаяДатаВМиллисекундах() — она возвращает число миллисекунд с начала эпохи и подходит для замеров производительности.
Практические сценарии использования
Подпись запросов к API
Многие API требуют включать timestamp в подпись HMAC. Здесь критично использовать UTC и сверять расхождение часов сервера 1С с сервером API: при разнице больше допустимого окна запросы будут отклоняться.
Хранение времени в регистрах и JSON
При выгрузке в JSON удобно передавать дату числом секунд — это убирает неоднозначность форматов строк (ISO 8601, локальные шаблоны). При загрузке обратно не забудьте про миллисекунды и пояс.
Вычисление интервалов
Разность двух дат в секундах удобна для расчёта длительности: делением на 60, 3600 и 86400 получают минуты, часы и сутки. Для интервалов больше суток с учётом календаря надёжнее использовать запросы с функцией РАЗНОСТЬДАТ.
Как проверить результат
Числа совпадают до секунды
Расхождение ровно на величину часового пояса
Дата(1970,1,1) + Секунды = исходная дата
Дата смещена или ушла в далёкое будущее — вероятно, миллисекунды приняты за секунды
10 знаков для секунд, 13 для миллисекунд
13 знаков там, где система ждёт секунды
Ограничения и граничные случаи
Даты раньше 01.01.1970 дадут отрицательное число секунд — не все внешние системы это принимают. Пустая дата 1С (01.01.0001) превратится в большое отрицательное значение, поэтому перед преобразованием проверяйте заполненность: Если ЗначениеЗаполнено(МояДата) Тогда ....
Диапазон типа «Дата» в 1С (с 01.01.0001 по 31.12.3999) шире, чем у 32-битного timestamp, который переполняется в 2038 году. Если внешняя система использует 32-битное целое, даты после 19.01.2038 могут обрабатываться ею некорректно — это ограничение принимающей стороны, а не 1С.
Что важно запомнить
Секунды из даты в 1С получают вычитанием начала эпохи: Дата - Дата(1970,1,1). Для Unix timestamp используйте UTC, учитывайте миллисекунды и проверяйте результат обратным преобразованием.
Частые вопросы
Как получить текущее время в секундах Unix в 1С?
Используйте выражение ТекущаяДатаСеанса() - Дата(1970,1,1) для локального времени или Цел(ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000) для корректного UTC-значения. Второй вариант предпочтительнее для обмена с внешними системами.
Почему мой timestamp отличается от эталонного на несколько часов?
Вы вычитаете начало эпохи из локальной даты. Unix timestamp отсчитывается от UTC, поэтому из даты нужно вычесть смещение часового пояса (стандартное плюс летнее) или использовать универсальное время.
Как преобразовать 13-значное число из JSON в дату 1С?
Это миллисекунды. Разделите число на 1000, возьмите целую часть и прибавьте к началу эпохи: Дата(1970,1,1) + Цел(Значение / 1000). Результат будет в UTC — при необходимости добавьте смещение пояса.
Можно ли получить секунды из даты в запросе 1С?
В языке запросов нет прямой функции Unix timestamp, но есть РАЗНОСТЬДАТ(ДатаНачала, ДатаКонца, СЕКУНДА). Она вернёт разность двух дат в секундах, что решает задачу вычисления интервалов прямо в запросе.
Что будет, если дата пустая?
Пустая дата 1С равна 01.01.0001, и вычитание даст большое отрицательное число. Всегда проверяйте дату через ЗначениеЗаполнено() перед преобразованием, особенно при обработке данных из документов и регистров.
Как измерить длительность выполнения кода в секундах?
Запомните ТекущаяУниверсальнаяДатаВМиллисекундах() до и после операции, разность разделите на 1000. Это точнее, чем замер по ТекущаяДатаСеанса(), у которой дискретность — секунда.