При интеграции 1С с внешними сервисами, такими как интернет-эквайринг Сбербанка, разработчики часто сталкиваются с ситуацией, когда вместо привычной строки с датой API возвращает длинное число, например, 1580977931223. Разберем подробно, что это за формат, как правильно перевести его в понятную дату 1С и какие нюансы при этом стоит учитывать.
Число, которое вы получаете в ответе JSON от шлюза Сбербанка, является так называемым Unix-временем (или POSIX-временем). В классическом понимании это количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года. Однако современные банковские системы и языки программирования (особенно на базе Java) используют расширенный стандарт — количество миллисекунд с той же даты.
Проанализируем структуру полученного числа 1 580 977 931 223:
Поскольку встроенный тип данных Дата в 1С:Предприятие 8 поддерживает точность только до секунды, при конвертации дробную часть (миллисекунды) мы будем отсекать.
Для того чтобы получить корректный объект типа Дата, нам необходимо взять «точку отсчета» (эпоху Unix) и прибавить к ней количество секунд, полученное из API. Рассмотрим, как это реализовать программно.
Посмотрим на пример кода, который выполняет это преобразование:
// Предположим, значение получено из JSON в переменную ЧисловаяДата
ЧисловаяДата = 1580977931223;
// 1. Переводим миллисекунды в секунды
КоличествоСекунд = ЧисловаяДата / 1000;
// 2. Прибавляем секунды к базовой дате 01.01.1970
ДатаРезультат = '19700101' + КоличествоСекунд;
// 3. Выводим результат
Сообщить(ДатаРезультат); // Получим дату в формате UTC
В данном примере мы используем особенность 1С: при сложении объекта типа Дата и числа, система интерпретирует число как количество секунд, которое нужно добавить к дате.
Важно помнить, что API Сбербанка возвращает время в формате UTC (универсальное координированное время). Если ваш бизнес-процесс требует отображения времени по Москве или другому местному времени, результат необходимо скорректировать. Рассмотрим два способа:
// Правильный способ с учетом локальных настроек сервера
ДатаUTC = '19700101' + (ЧисловаяДата / 1000);
ДатаЛокальная = МестноеВремя(ДатаUTC);
СмещениеМСК = 3 * 3600; // 3 часа по 3600 секунд
ДатаМСК = ('19700101' + (ЧисловаяДата / 1000)) + СмещениеМСК;
При работе с getOrderStatusExtended или аналогичными методами, данные обычно приходят в виде строки JSON. Разберем по шагам, как правильно извлечь и обработать это поле, чтобы избежать ошибок приведения типов.
// Пример обработки ответа от API
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстОтветаОтСбербанка);
СтруктураОтвета = ПрочитатьJSON(Чтение);
Если СтруктураОтвета.Свойство("date") Тогда
ЗначениеДаты = СтруктураОтвета.date; // Здесь может быть Число или Строка
// Приводим к числу на случай, если API вернуло строку
ЧисловаяДата = Число(ЗначениеДаты);
// Проверяем длину числа (10 знаков - секунды, 13 знаков - миллисекунды)
Если ЧисловаяДата > 10000000000 Тогда
СекундыДляДобавления = ЧисловаяДата / 1000;
Иначе
СекундыДляДобавления = ЧисловаяДата;
КонецЕсли;
ДатаЗаказа = '19700101' + СекундыДляДобавления;
КонецЕсли;
В документации Сбербанка могут встречаться разные поля. Проанализируем ситуацию, чтобы не перепутать время события:
Важный нюанс: В некоторых версиях API формат полей может различаться. Поле date чаще всего передается как Long (число), а authDateTime может прийти в виде отформатированной строки "2023-10-27 14:20:00". Перед обработкой всегда проверяйте тип данных через функцию ТипЗнч() или используйте универсальный парсер.
Для корректной работы с датами интернет-эквайринга Сбербанка в 1С:
Дата. Если они критичны для логов, сохраняйте исходное число в отдельный реквизит документа или справочника с типом Число(15,0).Использование этих простых правил позволит избежать ошибок при синхронизации оплат и обеспечит корректное отображение времени транзакций в вашей информационной базе.