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

Разработка и Конфигурация · 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С прибавляет именно секунды, поэтому результат сразу получается корректным значением типа «Дата», которое можно выводить, записывать в реквизиты и сравнивать.

bsl
Секунды = 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, ЧасовойПоясСеанса());

Маршрут решения

Как выбрать действие

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

Ручное смещение опасно там, где возможен переход на летнее время или смена пояса: жёстко зашитые «+3 часа» со временем дадут ошибку. Функции платформы учитывают настройки операционной системы и предпочтительнее для долгоживущих решений.

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

Обратное преобразование нужно при отправке данных во внешние API: 1С должна передать дату в виде секунд. Здесь используется вычитание дат — результатом будет разность в секундах:

Функция СекундыИзДаты(ИсходнаяДата)

Возврат ИсходнаяДата - Дата(1970, 1, 1);

КонецФункции

Операция вычитания двух значений типа «Дата» возвращает число — количество секунд между ними. Если нужны миллисекунды для внешней системы, умножьте результат на 1000.

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

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

После преобразования результат стоит проверить, особенно на этапе отладки обмена. Самый быстрый способ — вывести значение через Сообщить() или посмотреть в отладчике и сверить с любым онлайн-конвертером Unix timestamp, указав там тот же часовой пояс.

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

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

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

Близок к текущему (разумный диапазон)

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

Год больше 50000 — вероятно, пришли миллисекунды, а не секунды

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

Совпадает с ожидаемым с учётом пояса

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

Расходится ровно на 2–11 часов — не учтён часовой пояс

Совпадение с онлайн-конвертером
Норма

Дата и время UTC совпадают полностью

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

Разница даже в UTC — проверьте базовую дату и единицы измерения

Тип значения после расчёта
Норма

Тип «Дата», доступны функции форматирования

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

Строка или число — преобразование не выполнено

Типичные ошибки
01
Прибавление миллисекунд как секунд — дата уходит на десятки тысяч лет вперёд или возникает переполнение
02
Игнорирование часового пояса — время расходится с реальным на величину смещения от UTC
03
Сложение даты со строкой вместо числа — ошибка исполнения; сначала вызовите Число()
04
Ручное смещение пояса, зашитое в код, — ломается при смене пояса или переходе сезонного времени
05
Вычитание базовой даты из локального времени без перевода в 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). Принцип сложения при этом не меняется — меняется только точка отсчёта.

Почему при сложении возникает ошибка «Преобразование значения к типу Число не может быть выполнено»?

Скорее всего, секунды пришли строкой или содержат нечисловые символы. Преобразуйте входное значение через Число() внутри Попытка/Исключение и проверьте источник данных.