Разработка и Конфигурация · 10 мин
Как из секунд получить дату в 1С
Как преобразовать секунды (Unix timestamp) в дату в 1С: формулы, примеры кода, учёт часовых поясов, типичные ошибки и проверка результата.
В обмене данными с внешними системами — веб-сервисами, API, файлами JSON и XML — дата нередко передаётся не в привычном виде «01.03.2026 12:30:00», а как число секунд. Чаще всего это Unix timestamp: количество секунд, прошедших с 1 января 1970 года 00:00:00 по UTC. Встроенной функции «из секунд в дату» во встроенном языке 1С нет, поэтому преобразование выполняется простой арифметикой: к базовой дате прибавляется нужное число секунд.
Базовая конструкция выглядит так: Дата = Дата(1970, 1, 1) + ЧислоСекунд;. Оператор «+» для типа «Дата» в 1С работает именно с секундами, поэтому дополнительных функций не требуется. Сложности начинаются не с самой формулы, а с окружающих условий: миллисекунды вместо секунд, часовые пояса, локальное время сервера и разница между UTC и временем пользователя.
Ниже разобраны основные сценарии: простое преобразование, работа с миллисекундами, учёт часового пояса, обратная задача (из даты в секунды), проверка результата и типичные ошибки, из-за которых дата «уезжает» на несколько часов или тысячелетий.
Откуда берутся секунды и что такое Unix timestamp
Unix timestamp (время Unix, POSIX-время) — это количество секунд, прошедших с полуночи 1 января 1970 года по всемирному координированному времени (UTC). Этот момент называют эпохой Unix. Такой формат удобен для машин: число легко хранить, сравнивать и передавать без учёта форматов дат разных стран.
В 1С секунды чаще всего приходят из трёх источников: ответы REST API (поля created, timestamp, date в JSON), выгрузки из сторонних баз и логов, а также интеграции с оборудованием — кассами, терминалами, системами мониторинга. Перед преобразованием важно выяснить, что именно прислала внешняя система: секунды или миллисекунды, и в каком часовом поясе сформировано значение (обычно UTC).
Быстрая проверка порядка величины: актуальные даты в секундах — это числа порядка 1,7–1,8 миллиарда (десять знаков). Если число содержит тринадцать знаков — это почти наверняка миллисекунды. Если знаков заметно меньше десяти — возможно, это не Unix timestamp, а, например, смещение от другой базовой даты.
Базовое преобразование секунд в дату
Самый простой случай — значение уже в секундах и отсчитано от эпохи Unix. Код преобразования занимает одну строку:
Функция ДатаИзСекунд(Секунды)
Возврат Дата(1970, 1, 1) + Секунды;
КонецФункции
Функция Дата(1970, 1, 1) создаёт значение типа «Дата», соответствующее 01.01.1970 00:00:00. Операция сложения даты и числа в 1С прибавляет именно секунды, поэтому результат сразу получается корректным значением типа «Дата», которое можно выводить, записывать в реквизиты и сравнивать.
Секунды = 1700000000;
Результат = Дата(1970, 1, 1) + Секунды;
Сообщить(Результат); // 14.11.2023 22:13:20 (UTC)Если значение приходит строкой (например, из JSON как текст), сначала преобразуйте его в число через Число() или ЗначениеВЧисло с обработкой возможной ошибки. Сложение даты со строкой вызовет ошибку исполнения.
Обратите внимание: полученная дата соответствует времени UTC. Если пользователь работает в другом часовом поясе, «человеческое» время будет отличаться — об этом отдельный раздел ниже.
Если значение в миллисекундах или микросекундах
Многие API (особенно в экосистеме Java и JavaScript) передают время в миллисекундах. Если такое число прибавить к базовой дате как есть, получится дата, отстоящая на десятки тысяч лет в будущее. Признак проблемы — год в результате больше 50000 или ошибка переполнения.
Решение — разделить значение на 1000 перед сложением. Деление удобно выполнять целочисленно, отбрасывая остаток, поскольку тип «Дата» в 1С хранит время с точностью до секунды и миллисекунды всё равно будут потеряны:
Функция ДатаИзМиллисекунд(Миллисекунды)
Секунды = Цел(Миллисекунды / 1000);
Возврат Дата(1970, 1, 1) + Секунды;
КонецФункции
Встречаются и микросекунды (шестнадцать знаков) — например, в некоторых логах. Принцип тот же: делите на 1 000 000. Универсальный приём — определять порядок по длине числа: 10 знаков — секунды, 13 — миллисекунды, 16 — микросекунды. Но надёжнее не гадать, а уточнить формат в документации внешней системы.
Учёт часового пояса при преобразовании
Unix timestamp всегда привязан к UTC, а пользователи 1С обычно хотят видеть местное время. Если этого не учесть, дата будет расходиться с ожиданиями на величину смещения пояса — например, на 3 часа для московского времени. Это самая частая причина жалоб «дата из API неправильная».
Простой способ — прибавить смещение вручную, если оно известно и постоянно:
СмещениеМосквы = 3 * 3600; // 3 часа в секундах
МестнаяДата = Дата(1970, 1, 1) + Секунды + СмещениеМосквы;
Более правильный путь — использовать штатные функции работы с часовыми поясами. Функция МестноеВремя() преобразует универсальное время в местное время сеанса, а УниверсальноеВремя() выполняет обратное преобразование:
ДатаUTC = Дата(1970, 1, 1) + Секунды;
МестнаяДата = МестноеВремя(ДатаUTC, ЧасовойПоясСеанса());
Как выбрать действие
Ручное смещение опасно там, где возможен переход на летнее время или смена пояса: жёстко зашитые «+3 часа» со временем дадут ошибку. Функции платформы учитывают настройки операционной системы и предпочтительнее для долгоживущих решений.
Обратная задача: получить секунды из даты
Обратное преобразование нужно при отправке данных во внешние API: 1С должна передать дату в виде секунд. Здесь используется вычитание дат — результатом будет разность в секундах:
Функция СекундыИзДаты(ИсходнаяДата)
Возврат ИсходнаяДата - Дата(1970, 1, 1);
КонецФункции
Операция вычитания двух значений типа «Дата» возвращает число — количество секунд между ними. Если нужны миллисекунды для внешней системы, умножьте результат на 1000.
Важный нюанс: если исходная дата — местное время пользователя, а внешняя система ждёт UTC, сначала переведите её через УниверсальноеВремя(), и только потом вычитайте базовую дату. Иначе у всех принимающих систем время сместится на величину вашего пояса.
Проверка результата и типичные ошибки
После преобразования результат стоит проверить, особенно на этапе отладки обмена. Самый быстрый способ — вывести значение через Сообщить() или посмотреть в отладчике и сверить с любым онлайн-конвертером Unix timestamp, указав там тот же часовой пояс.
Как проверить результат
Близок к текущему (разумный диапазон)
Год больше 50000 — вероятно, пришли миллисекунды, а не секунды
Совпадает с ожидаемым с учётом пояса
Расходится ровно на 2–11 часов — не учтён часовой пояс
Дата и время UTC совпадают полностью
Разница даже в UTC — проверьте базовую дату и единицы измерения
Тип «Дата», доступны функции форматирования
Строка или число — преобразование не выполнено
Отдельная ловушка — пустые и нулевые значения. Если внешняя система прислала 0 или пустую строку, преобразование даст 01.01.1970, что может быть принято за реальную дату. Перед расчётом проверяйте входное значение:
Если Не ЗначениеЗаполнено(Секунды) Или Секунды = 0 Тогда
Возврат Дата(1, 1, 1); // пустая дата 1С
КонецЕсли;
Удобно оформить преобразование как функцию в общем модуле с явным названием, например ДатаИзUnixTimestamp(Секунды, ВМиллисекундах). Тогда логика с часовыми поясами и проверками находится в одном месте, и при изменении правил обмена править придётся только её.
Альтернативные подходы и ограничения
Помимо прямой арифметики, в отдельных случаях применяют другие варианты. Если данные приходят в XML с типом dateTime, платформа может разобрать дату автоматически через механизмы XDTO или XMLЗначение — тогда ручное преобразование из секунд не нужно вовсе. При чтении JSON через ПрочитатьJSON с параметром «ПрочитатьВСоответствие» даты в строковом ISO-формате тоже можно конвертировать штатно, но числовые timestamp всё равно придётся обрабатывать вручную.
Ещё одно ограничение — диапазон типа «Дата» в 1С: от 01.01.0001 до 31.12.3999. Отрицательные timestamp (даты до 1970 года) преобразуются корректно, если попадают в этот диапазон, а экстремально большие значения вызовут ошибку. Для исторических дат раньше 1970 года убедитесь, что внешняя система действительно использует отрицательные значения, а не собственную базовую дату.
Что важно запомнить
Секунды превращаются в дату сложением: Дата(1970,1,1) + Секунды. Миллисекунды сначала делятся на 1000. Unix timestamp — это UTC, поэтому для отображения применяйте МестноеВремя(), а для хранения оставляйте UTC. Проверяйте порядок числа, входное значение на ноль и сверяйте результат с эталонным конвертером.
Частые вопросы
Почему после преобразования время отличается на 3 часа?
Потому что Unix timestamp отсчитывается от UTC, а вы, скорее всего, смотрите на московское время. Примените МестноеВремя(ДатаUTC) или прибавьте смещение пояса в секундах — расхождение исчезнет.
Число из API содержит 13 знаков — как его обработать?
Это миллисекунды. Разделите значение на 1000 (лучше целочисленно, через Цел()), а затем прибавьте результат к Дата(1970,1,1) как обычные секунды.
Как получить секунды из текущей даты в 1С?
Вычтите базовую дату: Секунды = ТекущаяДатаСеанса() - Дата(1970,1,1). Если внешняя система ждёт UTC, сначала переведите дату через УниверсальноеВремя().
Можно ли сохранить миллисекунды в реквизите типа «Дата»?
Нет, тип «Дата» хранит значения с точностью до секунды. Если миллисекунды важны, сохраняйте исходное числовое значение в отдельном числовом реквизите.
Что делать, если внешняя система отсчитывает секунды не от 1970 года?
Уточните её базовую дату в документации и подставьте её в формулу вместо Дата(1970,1,1). Принцип сложения при этом не меняется — меняется только точка отсчёта.
Почему при сложении возникает ошибка «Преобразование значения к типу Число не может быть выполнено»?
Скорее всего, секунды пришли строкой или содержат нечисловые символы. Преобразуйте входное значение через Число() внутри Попытка/Исключение и проверьте источник данных.