Разработка и Конфигурация · 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 раз меньше ожидаемого.
ДатаРезультат = Дата(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) + Секунды;
Часовые пояса и универсальное время
Главный источник ошибок при работе с секундами — путаница между локальным и универсальным временем. 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») — она нужна, когда внешняя система передаёт дату строкой, а не числом секунд.
Функции Год(), Месяц(), День(), Час(), Минута(), Секунда() извлекают составляющие уже готовой даты — они полезны для форматирования и анализа, но не для преобразования числа в дату. Собирать дату из компонентов через Дата(Год, Месяц, День, Час, Минута, Секунда) имеет смысл только если источник передаёт время именно разложенным по полям.
Сравнение вариантов
Основной способ для Unix-времени. Простой и быстрый, но требует ручного учёта часового пояса
Подходит, когда дата приходит строкой ISO 8601. Не работает с числовыми метками секунд
Удобен при сериализации целых структур с датами. Избыточен для одиночного значения
Правильный подход для мультипоясных баз. Требует доработки конфигурации, а не разового преобразования
Частые вопросы
Можно ли преобразовать секунды в дату без программирования, например в отчёте?
Да, если секунды хранятся в реквизите. В СКД или консоли запросов можно использовать выражение с добавлением секунд к дате через функцию ДОБАВИТЬКДАТЕ с параметром СЕКУНДА: ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(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 и проверяйте результат обратным преобразованием.