К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как преобразовать секунды в дату в 1С

Как преобразовать секунды в дату в 1С: работа с Unix-временем, функции МестноеВремя и УниверсальноеВремя, расчёт даты из числа секунд, примеры кода и типичные ошибки.

Задача преобразовать секунды в дату в 1С возникает в двух типовых ситуациях: когда из внешней системы, API или файла обмена приходит метка времени Unix (число секунд с 1 января 1970 года), и когда нужно вычислить дату, отложив от известной даты определённое количество секунд. В обоих случаях встроенный язык 1С даёт прямые инструменты, и отдельной функции «СекундыВДату» не требуется — достаточно арифметики дат.

Ключевой факт, который нужно понять сразу: тип «Дата» в 1С хранится с точностью до секунды, и к значению типа «Дата» можно прибавлять и вычитать целые числа — они интерпретируются именно как секунды. Поэтому преобразование сводится к простому сложению: базовая дата плюс число секунд. Сложности начинаются только там, где появляются часовые пояса, миллисекунды и разные стандарты отсчёта.

Как тип «Дата» работает с секундами в 1С

Во встроенном языке 1С дата — это не строка и не число, а отдельный примитивный тип. Его важная особенность: операции сложения и вычитания с числом выполняются в секундах. Выражение Дата("20260101120000") + 3600 вернёт дату на час позже, а разность двух дат Дата2 - Дата1 вернёт число — количество секунд между ними.

Именно эта особенность делает преобразование тривиальным: если у вас есть количество секунд, прошедших с некоторой точки отсчёта, достаточно прибавить его к этой точке. Никаких функций преобразования форматов, разбора строк или работы с составляющими даты (год, месяц, день) для базовой задачи не нужно.

Преобразование Unix-времени в дату 1С

Самый частый практический сценарий — интеграция с внешним сервисом, который возвращает время числом, например 1704067200. Поскольку Unix-время отсчитывается от полуночи 1 января 1970 года по UTC, преобразование выглядит так:

// Секунды из внешней системы

СекундыUnix = 1704067200;

// Дата в универсальном времени (UTC)

ДатаUTC = Дата(1970, 1, 1) + СекундыUnix;

// Дата в локальном часовом поясе сеанса

ДатаЛокальная = МестноеВремя(ДатаUTC);

Обратите внимание: конструктор Дата(1970, 1, 1) создаёт дату без привязки к поясу — это просто точка отсчёта. Результат сложения будет корректным универсальным временем, а функция МестноеВремя() переведёт его в часовой пояс текущего сеанса. Если пропустить этот шаг, время будет смещено на величину смещения вашего пояса относительно UTC.

Обратное преобразование: дата в секунды

Для отправки данных во внешнюю систему часто нужна обратная операция — получить число секунд из даты 1С. Здесь используется вычитание и функция УниверсальноеВремя():

ДатаДокумента = ТекущаяДатаСеанса();

ДатаUTC = УниверсальноеВремя(ДатаДокумента);

СекундыUnix = ДатаUTC - Дата(1970, 1, 1);

Прибавление секунд к произвольной дате

Вторая типовая задача — вычислить момент времени через заданный интервал: срок хранения, дедлайн задачи, время окончания резерва. Здесь базовой точкой служит не 1970 год, а любая нужная дата:

ДатаНачала = ТекущаяДатаСеанса();

ИнтервалСекунд = 2 60 60; // два часа

ДатаОкончания = ДатаНачала + ИнтервалСекунд;

Для читаемости кода большие интервалы удобно записывать произведением: 3 24 60 * 60 нагляднее, чем 259200, когда речь о трёх сутках. Платформа вычислит выражение один раз при выполнении, на производительность это не влияет.

Если интервал приходит извне в минутах или часах, переводите его в секунды умножением до сложения с датой. Попытка прибавить к дате «число минут» напрямую — распространённая ошибка: дата сместится на это число секунд, то есть в 60 раз меньше ожидаемого.

1c
ДатаРезультат = Дата(1970,1,1) + СекундыUnix; // Unix-время в дату 1С

Разбор секунд из строк, JSON и файлов обмена

На практике секунды редко приходят как готовое число — чаще это строка внутри JSON, XML или CSV. Перед сложением с датой строку нужно явно привести к числу, иначе платформа выдаст ошибку преобразования типов или, что хуже, в некоторых режимах совместимости выполнит неявное приведение с непредсказуемым результатом.

СтрокаИзJSON = "1704067200";

Секунды = Число(СтрокаИзJSON);

ДатаРезультат = Дата(1970, 1, 1) + Секунды;

Отдельный случай — метки времени в миллисекундах, которые используют многие веб-API (13-значные числа вместо 10-значных). Тип «Дата» в 1С не хранит миллисекунды, поэтому лишняя точность просто отсекается делением:

МиллисекундыUnix = 1704067200000;

Секунды = Цел(МиллисекундыUnix / 1000);

ДатаРезультат = Дата(1970, 1, 1) + Секунды;

Типичные ошибки
01
Прибавление миллисекунд без деления на 1000 — дата уходит в далёкое будущее, ошибка заметна не сразу
02
Игнорирование часового пояса: сравнение Unix-времени с ТекущаяДатаСеанса() без перевода через МестноеВремя() даёт смещение на несколько часов
03
Сложение даты со строкой вместо числа — ошибка преобразования типов в момент выполнения
04
Использование Дата(1970,1,1) как локальной даты: точка отсчёта Unix-времени задана в UTC, смешение поясов ломает расчёт

Часовые пояса и универсальное время

Главный источник ошибок при работе с секундами — путаница между локальным и универсальным временем. Unix-метка всегда относится к UTC. Функция ТекущаяДатаСеанса() возвращает локальное время сеанса. Смешивать их напрямую нельзя.

Правило простое: все вычисления с Unix-секундами выполняйте в UTC, а переводите в локальное время только на границах — при выводе пользователю или при сравнении с локальными датами документов. Для этого в платформе есть пара функций: МестноеВремя(УниверсальноеВремяДата) и УниверсальноеВремя(МестнаяДата).

Если база работает в нескольких часовых поясах (филиалы, облачное развёртывание), храните в реквизитах универсальное время и переводите его в пояс конкретного пользователя при отображении. Это избавит от расхождений, когда один и тот же документ у разных пользователей «создан» в разное время.

Проверка результата преобразования

После преобразования полезно убедиться, что дата получилась осмысленной. Простейшая проверка — вывести результат и сравнить с ожидаемым значением через любой онлайн-конвертер Unix-времени или обратным преобразованием:

ДатаРезультат = МестноеВремя(Дата(1970, 1, 1) + СекундыUnix);

Сообщить(ДатаРезультат);

// Обратная проверка: должны получить исходное число

Контроль = УниверсальноеВремя(ДатаРезультат) - Дата(1970, 1, 1);

Если Контроль <> СекундыUnix Тогда

// рассинхронизация поясов или потеря точности

КонецЕсли;

Дополнительные контрольные признаки: год результата должен попадать в разумный диапазон (не 1970 и не 2500), время суток не должно «прыгать» на ровно величину смещения пояса между соседними записями, а разница двух соседних меток должна соответствовать реальному интервалу событий.

Контрольные точки

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

Год полученной даты
Норма

Соответствует ожидаемому периоду данных

Тревожный признак

1970 год (секунды равны нулю) или далёкое будущее (миллисекунды не поделены на 1000)

Время суток
Норма

Совпадает с реальным временем события в локальном поясе

Тревожный признак

Постоянное смещение на 2–5 часов — не применено МестноеВремя()

Обратное преобразование
Норма

Дата → секунды возвращает исходное число

Тревожный признак

Число отличается — ошибка в переводе поясов или потере точности

Альтернативные подходы и их границы

Помимо прямой арифметики, в 1С есть смежные инструменты, которые иногда путают с преобразованием секунд. Функция ПрочитатьДатуJSON() разбирает строковые представления дат из JSON (например, формат ISO 8601 вида «2026-01-01T00:00:00Z») — она нужна, когда внешняя система передаёт дату строкой, а не числом секунд.

Функции Год(), Месяц(), День(), Час(), Минута(), Секунда() извлекают составляющие уже готовой даты — они полезны для форматирования и анализа, но не для преобразования числа в дату. Собирать дату из компонентов через Дата(Год, Месяц, День, Час, Минута, Секунда) имеет смысл только если источник передаёт время именно разложенным по полям.

Сравнение вариантов

Арифметика: Дата(1970,1,1) + Секунды

Основной способ для Unix-времени. Простой и быстрый, но требует ручного учёта часового пояса

ПрочитатьДатуJSON()

Подходит, когда дата приходит строкой ISO 8601. Не работает с числовыми метками секунд

ЗаписьJSON с вариантом УниверсальнаяДата

Удобен при сериализации целых структур с датами. Избыточен для одиночного значения

Хранение универсального времени в реквизитах

Правильный подход для мультипоясных баз. Требует доработки конфигурации, а не разового преобразования

Частые вопросы

Можно ли преобразовать секунды в дату без программирования, например в отчёте?

Да, если секунды хранятся в реквизите. В СКД или консоли запросов можно использовать выражение с добавлением секунд к дате через функцию ДОБАВИТЬКДАТЕ с параметром СЕКУНДА: ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1970,1,1), СЕКУНДА, ПолеСекунды). Результат будет полноценной датой, доступной для группировок и отборов.

Почему после преобразования время отличается ровно на несколько часов?

Это верный признак отсутствия перевода часового пояса. Unix-метка задана в UTC, а вы сравниваете её с локальным временем. Оберните результат в МестноеВремя() — смещение исчезнет. Величина смещения равна разнице вашего пояса с UTC.

Что делать, если число секунд 13-значное?

Это миллисекунды. Разделите значение на 1000 с помощью Цел(Число / 1000) и дальше работайте как с обычными секундами. Доли секунды тип «Дата» в 1С не хранит, поэтому они в любом случае будут отброшены.

Как преобразовать секунды в дату в запросе 1С?

В языке запросов используйте функцию ДОБАВИТЬКДАТЕ: ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1970, 1, 1), СЕКУНДА, &Секунды). Обратная операция — РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1970,1,1), ПолеДаты, СЕКУНДА). Учтите, что в запросах нет функций работы с часовыми поясами — перевод пояса делайте в коде после выборки.

Есть ли ограничение на максимальное число секунд?

Тип «Дата» в 1С поддерживает диапазон примерно с 1 января 0001 года до конца 3999 года, поэтому практических ограничений для реальных Unix-меток нет. Проблемы возникают только при ошибках входных данных — например, при передаче миллисекунд без деления дата уходит за допустимые границы и платформа выдаёт ошибку.

Чем ТекущаяДатаСеанса() лучше ТекущаяДата() для таких расчётов?

ТекущаяДатаСеанса() учитывает настройки часового пояса сеанса и корректно работает в клиент-серверном режиме, тогда как ТекущаяДата() в тонком и веб-клиенте может возвращать время клиентского компьютера. Для расчётов с секундами и Unix-временем используйте ТекущаяДатаСеанса() в связке с УниверсальноеВремя().

Итог

Что важно запомнить

Секунды преобразуются в дату простым сложением: Дата(1970,1,1) + ЧислоСекунд. Unix-метки всегда в UTC — переводите результат через МестноеВремя() и УниверсальноеВремя(). Делите 13-значные миллисекунды на 1000 и проверяйте результат обратным преобразованием.