Разработка и Конфигурация · 9 мин
Как перевести дату в секунды в 1С
Как перевести дату в секунды в 1С: функция UnixTimestamp, расчёт через разность дат, универсальное время, обратное преобразование и типичные ошибки.
Перевод даты в секунды в 1С чаще всего означает получение Unix timestamp — количества секунд, прошедших с 1 января 1970 года. Такое представление требуется при обмене с внешними API, веб-сервисами, при формировании подписей запросов, логировании и интеграции с системами, написанными на других языках.
В платформе 1С:Предприятие 8.3 задача решается двумя способами: штатной функцией глобального контекста UnixTimestamp() (появилась в версии 8.3.22) или вычислением разности между нужной датой и датой начала эпохи Unix. Второй способ работает на любой версии платформы и не требует обновления.
Критичный нюанс — часовой пояс. Unix timestamp считается от универсального времени (UTC), а дата в 1С по умолчанию хранится в локальном или сеансовом времени. Если не учесть смещение, результат будет отличаться на несколько часов, что приведёт к ошибкам в подписях запросов и расхождениям с внешними системами.
Что такое дата в секундах и когда она нужна
Unix timestamp (время Unix, POSIX-время) — это целое число секунд, прошедших с полуночи 1 января 1970 года по UTC. Например, дата 01.01.2026 00:00:00 UTC соответствует значению 1704067200. Дробной части в классическом варианте нет, хотя некоторые системы работают с миллисекундами — тогда число умножается на 1000.
В 1С такой формат встречается в типовых сценариях интеграции: подпись запросов к REST API (многие сервисы требуют параметр timestamp для защиты от повторной отправки), обмен с мобильными приложениями, выгрузка данных в аналитические платформы, сравнение дат с внешними логами. Также секунды удобны для точной сортировки и вычисления интервалов между событиями.
Способ 1: функция UnixTimestamp в платформе 8.3.22 и новее
Начиная с версии платформы 8.3.22, во встроенном языке появилась пара функций: UnixTimestamp() — преобразует дату в секунды Unix, и ДатаИзUnixTimestamp() — выполняет обратное преобразование. Функции работают на сервере и на клиенте.
Функция ожидает дату в универсальном времени. Если передать локальную дату без приведения, результат будет смещён на величину часового пояса. Правильный вариант вызова:
ЛокальнаяДата = ТекущаяДатаСеанса();
УниверсальнаяДата = УниверсальноеВремя(ЛокальнаяДата);
Секунды = UnixTimestamp(УниверсальнаяДата);
ЛокальнаяДата = ТекущаяДатаСеанса();
УниверсальнаяДата = УниверсальноеВремя(ЛокальнаяДата);
Секунды = UnixTimestamp(УниверсальнаяДата);
Сообщить(Секунды);Если требуется timestamp в миллисекундах (некоторые API, например биржевые и платёжные шлюзы, работают именно так), умножьте результат на 1000. Учтите, что дата в 1С хранится с точностью до секунды, поэтому реальных миллисекунд из неё не извлечь — дробная часть всегда будет нулевой.
Способ 2: расчёт через разность дат для любой версии платформы
Оператор вычитания дат во встроенном языке 1С возвращает именно число секунд между ними. Это поведение задокументировано и стабильно на всех версиях платформы 8.x. Поэтому универсальная формула выглядит так:
Функция ДатаВСекунды(ИсходнаяДата) Экспорт
УниверсальнаяДата = УниверсальноеВремя(ИсходнаяДата);
Возврат УниверсальнаяДата - Дата(1970, 1, 1, 0, 0, 0);
КонецФункции
Обратите внимание на литерал Дата(1970, 1, 1, 0, 0, 0) — это начало эпохи Unix. В старых примерах встречается запись Дата(1970,1,1,1,0,0) с часом равным 1: так компенсировали часовой пояс в конкретных условиях, но механически копировать эту единицу не нужно — она даст ошибку на час, если смещение уже учтено через УниверсальноеВремя().
Как правильно учесть часовой пояс
Главный источник ошибок — несоответствие временных зон. В 1С одновременно существуют текущая дата сеанса (с учётом часового пояса сеанса), локальная дата сервера и универсальное время. Для перевода в секунды всегда нужна дата в UTC.
Функция УниверсальноеВремя(ЛокальнаяДата) использует часовой пояс сеанса или переданный вторым параметром пояс. Если дата пришла из документа, записанного в другом часовом поясе, или из внешней системы, сначала убедитесь, в каком времени она выражена. Для проверки смещения используйте СмещениеСтандартногоВремени() и СмещениеЛетнегоВремени().
Как выбрать действие
Обратное преобразование: из секунд в дату
Обратная задача — получить дату 1С из числа секунд — решается сложением: Дата(1970,1,1) + Секунды. Результатом будет дата в UTC. Чтобы показать её пользователю в локальном времени, примените МестноеВремя(УниверсальнаяДата).
На платформе 8.3.22+ доступна штатная ДатаИзUnixTimestamp(Секунды), которая возвращает дату в универсальном времени. Если входное значение в миллисекундах, предварительно разделите его на 1000 с отбрасыванием остатка через Цел().
УниверсальнаяДата = Дата(1970, 1, 1) + Секунды;
ЛокальнаяДата = МестноеВремя(УниверсальнаяДата);
- 1Определите, в каком времени выражена исходная дата: локальное, сеансовое или UTC
- 2Приведите дату к универсальному времени функцией УниверсальноеВремя()
- 3Проверьте версию платформы: 8.3.22+ — используйте UnixTimestamp(), иначе — разность с Дата(1970,1,1)
- 4Сравните результат с эталонным значением на любом онлайн-конвертере Unix time
- 5При обратном преобразовании добавьте секунды к Дата(1970,1,1) и переведите в местное время
Проверка результата и типичные ошибки
После реализации обязательно сверьте вычисленный timestamp с независимым источником для контрольной даты, например для 01.01.2026 00:00:00 UTC должно получиться 1704067200. Расхождение ровно на 3600, 7200 или 10800 секунд — верный признак неучтённого часового пояса (1, 2 или 3 часа).
Ещё одна частая проблема — переполнение или неверный тип при передаче числа в JSON. Timestamp за границей разумных дат (например, тринадцатизначное число вместо десятизначного) означает, что внешняя система ждёт миллисекунды или, наоборот, секунды. Уточните формат в документации API.
Как проверить результат
1704067200
Значение отличается на 3600/7200/10800 — не учтён часовой пояс
10 цифр для секунд, 13 для миллисекунд
13 цифр при запросе секунд — лишнее умножение на 1000
Дата(1970,1,1) + Секунды возвращает исходную дату в UTC
Сдвиг на целые часы — перепутаны локальное и универсальное время
Ограничения и особенности платформы
Тип «Дата» в 1С хранит значения с точностью до секунды в диапазоне от 01.01.0001 до 31.12.3999. Дат раньше 1970 года в Unix timestamp быть не может в положительном виде — вычитание даст отрицательное число, что корректно математически, но не все внешние системы принимают отрицательные значения.
Функция ТекущаяДата() на клиенте возвращает время компьютера пользователя, которое может быть неточным или намеренно изменённым. Для подписей запросов и аудита используйте ТекущаяДатаСеанса() или дату, полученную на сервере, — это снижает риск рассинхронизации с внешним сервисом, проверяющим допустимое окно времени.
Частые вопросы
Чем отличается UnixTimestamp() от вычитания дат?
Результат одинаков — число секунд с 01.01.1970 UTC. Разница в удобстве и совместимости: UnixTimestamp() читается понятнее, но доступна только с платформы 8.3.22. Формула с разностью дат работает везде, включая старые релизы.
Как получить timestamp в миллисекундах?
Умножьте результат в секундах на 1000. Учтите, что дата в 1С не хранит доли секунды, поэтому реальная точность останется секундной — миллисекунды будут всегда оканчиваться на три нуля.
Почему мой timestamp отличается от онлайн-конвертера на несколько часов?
Вы передали локальную дату вместо универсальной. Оберните исходную дату в УниверсальноеВремя() перед переводом в секунды, и значения совпадут.
Как перевести дату в секунды в запросе 1С?
Язык запросов не имеет функции Unix timestamp. Варианты: вычислить значение в коде и передать параметром, либо использовать РАЗНОСТЬДАТ(ДатаВремя(1970,1,1), ПолеДаты, СЕКУНДА) — но помните, что функция не учитывает часовые пояса.
Что делать с датами раньше 1970 года?
Разность дат вернёт отрицательное число — это корректный timestamp по стандарту. Однако многие внешние API отрицательные значения не принимают, поэтому проверяйте требования конкретной системы и при необходимости ограничивайте диапазон входных данных.
Можно ли хранить даты документов сразу в секундах?
Технически можно, но не рекомендуется: теряются штатные возможности запросов, отборов по периоду и представления дат. Храните стандартный тип «Дата», а в секунды переводите только на границе обмена с внешними системами.
Что важно запомнить
Для перевода даты в секунды приведите её к универсальному времени и используйте UnixTimestamp() на платформе 8.3.22+ или разность с Дата(1970,1,1) на любой версии. Обратное преобразование — сложение секунд с началом эпохи и перевод в местное время. Всегда проверяйте результат на контрольной дате: смещение на целые часы означает ошибку с часовым поясом.