Разработка и Конфигурация · 9 мин
Как преобразовать дату из JSON в 1С
Разбираем, как преобразовать дату из JSON в формат даты 1С: чтение ISO 8601, Unix timestamp, функция ПрочитатьJSON, готовый код и разбор типичных ошибок.
При обмене данными через HTTP-сервисы, веб-API и файлы выгрузки даты почти всегда приходят в виде строк JSON — в формате ISO 8601, Unix timestamp или в произвольном текстовом виде. Встроенный механизм ПрочитатьJSON в 1С умеет автоматически распознавать часть этих форматов, но далеко не все, поэтому разработчику нередко приходится писать собственное преобразование.
Ошибка на этом этапе дорого обходится: документы записываются с пустой датой, проводки попадают не в тот период, а синхронизация молча пропускает записи. Ниже разобраны основные форматы дат в JSON, штатные способы их чтения в 1С и готовые функции преобразования с проверкой результата.
Какие форматы дат встречаются в JSON
Стандарт JSON не содержит типа «дата» — дата всегда передаётся строкой или числом, и договорённость о формате лежит на стороне обменивающихся систем. На практике в интеграциях с 1С чаще всего встречаются четыре варианта.
| Формат | Пример в JSON | Как читается в 1С |
|---|---|---|
| ISO 8601 | "2026-03-15T10:30:00" | Автоматически при ПрочитатьВСоответствие или вручную |
| ISO 8601 с часовым поясом | "2026-03-15T10:30:00+03:00" | Ручной разбор, смещение обрезается или учитывается |
| Unix timestamp | 1710495000 | Дата(1970,1,1) + число секунд |
| Произвольная строка | "15.03.2026 10:30" | Только ручной разбор по шаблону |
Прежде чем писать код, откройте реальный пример JSON от контрагента или сервиса и зафиксируйте точный вид значения: есть ли секунды, миллисекунды, суффикс «Z» (UTC) или смещение часового пояса. От этого зависит выбор способа преобразования.
Автоматическое преобразование через ПрочитатьJSON
Встроенная функция ПрочитатьJSON при чтении в структуру или соответствие умеет распознавать строки ISO 8601 и превращать их в значения типа Дата. Для этого используется параметр ПрочитатьВСоответствие со значением Истина — тогда дата, время и некоторые другие типы распознаются автоматически.
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
ДатаДокумента = Данные["date"]; // уже тип Дата, если формат ISOЕсли чтение идёт в структуру, автоматическое распознавание дат не всегда срабатывает предсказуемо — поведение зависит от версии платформы и точного вида строки. Поэтому после чтения обязательно проверяйте тип полученного значения через ТипЗнч(), прежде чем записывать его в реквизит объекта.
Ограничение способа: он работает только для строк, строго соответствующих ISO 8601. Unix timestamp, даты с русскими разделителями или нестандартные шаблоны останутся строками или числами и потребуют ручной обработки.
Ручной разбор строки ISO 8601
Когда автоматика не срабатывает или формат содержит смещение часового пояса, строку разбирают вручную. Самый надёжный подход — вырезать из строки составные части и собрать дату функцией Дата(Год, Месяц, День, Час, Минута, Секунда).
Функция ДатаИзISO(СтрокаДаты)
Строка = СтрЗаменить(СтрокаДаты, "T", " ");
Строка = СтрЗаменить(Строка, "-", "");
Строка = СтрЗаменить(Строка, ":", "");
Строка = СтрЗаменить(Строка, " ", "");
// теперь формат ГГГГММДДЧЧММСС
Возврат Дата(Лев(Строка, 14));
КонецФункцииКонструктор Дата() из строки принимает 14 цифр в порядке «ГГГГММДДЧЧММСС» — это удобный приём, избавляющий от множества вызовов Число(). Если строка содержит миллисекунды или смещение вида «+03:00», их нужно предварительно отсечь: найти позицию символа «.» или «+» и взять левую часть.
Отдельный нюанс — суффикс «Z», означающий время UTC. Если учёт в 1С ведётся в локальном времени, а сервис отдаёт UTC, даты будут «уезжать» на величину смещения. Решите заранее, приводить ли время к локальному, и зафиксируйте это в коде явно, а не «как получилось».
Преобразование Unix timestamp
Unix timestamp — это число секунд, прошедших с 1 января 1970 года по UTC. В JSON он приходит числом (иногда строкой-числом), и преобразование сводится к простой арифметике.
Функция ДатаИзUnix(Метка)
Возврат Дата(1970, 1, 1) + Метка; // Метка — число секунд
КонецФункцииДва подводных камня. Первый: некоторые сервисы отдают метку в миллисекундах — тогда значение будет на три порядка больше, и его нужно предварительно разделить на 1000. Признак проблемы — получившаяся дата уходит в далёкое будущее. Второй: метка всегда в UTC, поэтому к результату обычно прибавляют смещение локального часового пояса в секундах.
Проверить корректность просто: известная метка, соответствующая конкретному моменту, должна после преобразования дать ожидаемую дату и время. Возьмите тестовое значение из документации сервиса и сверьте результат.
Разбор произвольных строковых форматов
Наихудший сценарий — даты вида «15.03.2026» или «03/15/2026», где порядок дня и месяца зависит от региональных настроек отправителя. Здесь нет универсальной функции: строку разбирают по разделителям и собирают дату из частей, жёстко зафиксировав порядок компонентов в коде.
Функция ДатаИзСтрокиДМГ(СтрокаДаты) // "15.03.2026"
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() <> 3 Тогда
Возврат Дата(1, 1, 1); // пустая дата как признак ошибки
КонецЕсли;
Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецФункцииКритически важно не полагаться на неявное преобразование строки в дату — оно зависит от региональных настроек сеанса и на разных серверах может дать разный результат. Явный разбор по шаблону делает код предсказуемым везде.
Проверка результата и обработка ошибок
Любое преобразование даты из внешних данных должно заканчиваться проверкой. Минимальный набор: тип значения — Дата, значение не пустое (не равно Дата(1,1,1)), дата попадает в разумный диапазон для вашей задачи — например, не раньше даты начала учёта и не позже следующего года.
Как проверить результат
ТипЗнч возвращает Дата
Строка или Число — автоматика не сработала, нужен ручной разбор
Попадает в ожидаемый период учёта
01.01.0001 или дата в далёком будущем — ошибка формата
Документы за 23:00–01:00 попадают в правильный день
Сдвиг на сутки — не учтён часовой пояс
Если преобразование не удалось, не записывайте пустую дату молча. Правильнее зафиксировать ошибку в журнале регистрации с исходным значением строки — это позволит потом найти проблемные записи и понять, какой именно формат прислал источник.
Обратная задача: отправка даты из 1С в JSON
При формировании JSON из 1С дату обычно сериализуют в ISO 8601. Штатный ЗаписатьJSON с параметром ЗаписатьВСоответствие умеет выводить даты в стандартном виде, но если принимающая сторона ждёт конкретный шаблон, надёжнее сформировать строку вручную через Формат(ДатаЗначения, "ДФ=yyyy-MM-ddTHH:mm:ss").
Обратите внимание на регистр шаблона в функции Формат: «MM» — месяц, «mm» — минуты. Перепутанный шаблон — частая причина того, что в поле месяца оказываются минуты, и принимающая система отвергает дату или, что хуже, молча искажает её.
Что важно запомнить
Сначала зафиксируйте точный формат даты в JSON, затем выберите способ: ПрочитатьJSON с ПрочитатьВСоответствие для ISO 8601, ручной разбор для нестандартных строк, арифметику от 01.01.1970 для Unix timestamp. Всегда проверяйте тип и значение результата и явно решайте вопрос часового пояса.
Частые вопросы
Почему ПрочитатьJSON вернул строку вместо даты?
Автоматическое распознавание срабатывает только для строгого ISO 8601 и при включённом параметре ПрочитатьВСоответствие. Если в строке есть миллисекунды, нестандартный разделитель или отсутствует время, значение остаётся строкой — проверьте исходный формат и добавьте ручной разбор.
Как понять, что timestamp пришёл в миллисекундах?
Сравните порядок числа: метка в секундах для текущего времени содержит около 10 знаков, в миллисекундах — около 13. Если после преобразования дата ушла на десятки тысяч лет вперёд, разделите исходное число на 1000.
Что делать с суффиксом Z или смещением +03:00 в строке даты?
Перед разбором отсеките всё после секунд: найдите позицию символа «Z», «+» или «-» во временной части и возьмите левую часть строки. Затем решите, нужно ли прибавлять смещение, чтобы привести время к локальному.
Можно ли доверять неявному преобразованию строки в дату?
Нет. Результат зависит от региональных настроек сеанса, и на сервере с другой локалью «03/04/2026» может прочитаться как 3 апреля или 4 марта. Используйте только явный разбор по известному шаблону.
Как записать дату из 1С в JSON в нужном формате?
Используйте Формат(Дата, "ДФ=yyyy-MM-ddTHH:mm:ss") для ISO 8601. Следите за регистром шаблона: MM — это месяц, mm — минуты, их перепутывание искажает дату на стороне получателя.
Что делать, если в JSON иногда приходит null вместо даты?
Проверяйте значение на Неопределено и пустую строку до преобразования. Для null обычно записывают пустую дату Дата(1,1,1) осознанно, с протоколированием, а не пытаются разбирать пустое значение парсером.