Интеграции в 1С

Формат даты в JSON в 1С: как сериализовать и разобрать без потерь

Коротко

Стандартом де-факто для даты в JSON считается ISO 8601 в UTC: "2026-07-17T10:30:00Z". В 1С за это отвечает enum ФорматДатыJSON.ISO, который задаётся в ПараметрыЗаписиJSON и в параметрах ПрочитатьJSON().

Для сериализации: ЗаписатьJSON() с ПараметрыЗаписиJSON. Для чтения — ПрочитатьJSON() с явно перечисленными ИменаСвойствСоЗначениямиДата, иначе строка датой не станет. 1С хранит дату без TZ, поэтому границу UTC ↔ локальное время нужно проходить вручную.

Какой формат даты в JSON: ISO 8601, Unix, Microsoft

В спецификации JSON типа «дата» нет — есть только строки и числа. На практике внешние API используют один из трёх вариантов:

  • ISO 8601 — строка вида 2026-07-17T10:30:00Z или 2026-07-17T13:30:00+03:00. Это то, что отдают REST-сервисы, Swagger, .NET Core, Python (datetime.isoformat()), JS (Date.toISOString()).
  • Unix timestamp — число секунд или миллисекунд от 1970-01-01 UTC: 1784283000 или 1784283000000. Часто в JS-фронтах и IoT.
  • Microsoft/устаревший — строка "/Date(1784283000000)/" из старых WCF/ASP.NET. В 1С этому соответствует ФорматДатыJSON.Microsoft.

Первое, что надо сделать перед интеграцией — зафиксировать формат с обеих сторон. Далее в 1С выбираем соответствующее значение ФорматДатыJSON или делаем ручное преобразование.

ФорматДатыJSON: ISO, JavaScript, Microsoft

ФорматДатыJSON — системное перечисление 1С:Предприятие 8.3, задающее, как дата сериализуется в JSON и как строка разбирается обратно. Значения:

// три доступных значения формата даты в JSON 1С
ФорматДатыJSON.ISO           // "2026-07-17T10:30:00Z"          — рекомендуется
ФорматДатыJSON.JavaScript    // "Date(1784283000000)"           — через конструктор JS
ФорматДатыJSON.Microsoft     // "/Date(1784283000000)/"         — legacy WCF/ASP.NET
ФорматДатыJSON
ISOстрока ISO 8601, основной вариант для REST
JavaScriptвызов конструктора JS Date
Microsoftформат WCF/ASP.NET, оставлен для совместимости

В подавляющем большинстве интеграций правильный ответ — ISO. К Microsoft прибегают только когда внешняя сторона — старый .NET-сервис, который возвращает "/Date(...)/" и переучиваться не будет.

Что запомнить. ФорматДатыJSON управляет и записью, и чтением. Если отдаёте API в ISO — принимайте тоже в ISO, иначе на приёме дата не разберётся.

Сериализация даты 1С в JSON: ЗаписатьJSON и ПараметрыЗаписиJSON

Формат даты для записи задаётся через ПараметрыЗаписиJSON, которые передаются в метод ЗаписьJSON.УстановитьСтроку() / ОткрытьФайл(), а формат даты — отдельным параметром в ЗаписатьJSON():

// 1С → JSON: отдаём дату как ISO 8601
Данные = Новый Структура;
Данные.Вставить("Номер", "СЧТ-000123");
Данные.Вставить("Дата", ТекущаяДатаСеанса());
Данные.Вставить("Сумма", 1500.50);

ЗаписьJSON = Новый ЗаписьJSON;
Параметры  = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, "  ");
ЗаписьJSON.УстановитьСтроку(Параметры);

// именно ФорматДатыJSON.ISO → "2026-07-17T10:30:00"
ЗаписатьJSON(ЗаписьJSON, Данные, Новый НастройкиСериализацииJSON,
    "", ФорматДатыJSON.ISO);

Результат = ЗаписьJSON.Закрыть(); // готовая JSON-строка
ЗаписатьJSON
ЗаписьJSONинициализированный объект записи
Значениеструктура/соответствие/массив для сериализации
НастройкиСериализацииJSONуправляют преобразованием прикладных типов
ИмяФункцииПреобразованияcallback для нестандартных типов
ФорматДатыJSONISO / JavaScript / Microsoft
→ пишет в переданный ЗаписьJSON

Обратите внимание: даты в 1С не хранят часовой пояс. При ФорматДатыJSON.ISO платформа сериализует дату «как есть», без суффикса Z и без смещения. Если внешняя сторона ждёт именно UTC (...Z) — дату нужно предварительно перевести в UTC вручную (см. раздел про часовые пояса).

Разобрать дату из JSON в 1С: ПрочитатьJSON и ИменаСвойствСоЗначениямиДата

Ключевая ловушка при чтении: ПрочитатьJSON() по умолчанию превращает всё в строки. Чтобы конкретные поля стали датой, их имена перечисляют явно параметром ИменаСвойствСоЗначениямиДата.

// внешний API отдал JSON вида:
// {"Номер":"СЧТ-000123","Дата":"2026-07-17T10:30:00Z","Оплачено":"2026-07-18T09:00:00Z"}

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);

Результат = ПрочитатьJSON(
    ЧтениеJSON,
    Ложь,                                       // читаем как соответствие
    "Дата,Оплачено",                            // ← поля, которые надо превратить в дату
    ФорматДатыJSON.ISO);

ЧтениеJSON.Закрыть();

Сообщить(Результат["Дата"]);      // тип: Дата
Сообщить(Результат["Оплачено"]);  // тип: Дата
ПрочитатьJSON
ЧтениеJSONобъект чтения с установленной строкой
ПрочитатьВСоответствиеИстина — Структура, Ложь — Соответствие
ИменаСвойствСоЗначениямиДатасписок полей через запятую
ФорматДатыJSONISO / JavaScript / Microsoft
ИмяФункцииВосстановленияcallback для кастомных типов
Соответствие / Структура / Массив

Если параметр ИменаСвойствСоЗначениямиДата не задать — поля "Дата" и "Оплачено" останутся строками "2026-07-17T10:30:00Z", и придётся парсить их вручную. Именно эта фраза «дата в json 1с приходит строкой» — самый частый вопрос в поиске.

Часовой пояс: UTC в JSON и локальное время в 1С

Внешние REST-сервисы почти всегда работают в UTC (суффикс Z или смещение +03:00). 1С хранит даты без часового пояса — обычно в локальном времени сервера или пользователя. Мост между двумя мирами делается вручную:

// 1С → API: локальная дата в UTC-строку для JSON
Локальная = ТекущаяДатаСеанса();                       // например, 13:30 МСК
СмещениеСек = ЧасовойПояс().СмещениеПоУниверсальномуВремени; // 10800 для МСК (+3ч)
ВремяUTC   = Локальная - СмещениеСек;                  // 10:30 UTC

СтрокаISO = Формат(ВремяUTC, "ДФ=yyyy-MM-ddTHH:mm:ss") + "Z";
// СтрокаISO = "2026-07-17T10:30:00Z" — то, что примет любой REST-API

// API → 1С: строка UTC в локальную дату сеанса
ПришлаUTC  = Дата(2026,7,17,10,30,0);      // распарсили ISO
Локальная  = ПришлаUTC + СмещениеСек;      // получили 13:30 МСК для отображения
Правило. На границе с внешним API всегда явно фиксируйте, в каком поясе едет время. Если сомневаетесь — храните и отдавайте UTC, а в интерфейс показывайте локальное, преобразованное через ЧасовойПояс().

Нестандартный формат даты в JSON: ручное преобразование

Иногда внешний сервис ждёт «свой» формат: "2026-07-17 10:30:00", "17.07.2026", Unix-секунды. В этом случае ФорматДатыJSON не помогает — дату собираем строкой сами, а в JSON пишем как обычное поле:

// 1) свободный формат даты в json 1с через Формат()
Дата1 = ТекущаяДатаСеанса();
СтрокаДаты = Формат(Дата1, "ДФ=yyyy-MM-dd HH:mm:ss");   // "2026-07-17 10:30:00"

Тело = Новый Структура;
Тело.Вставить("created_at", СтрокаДаты);                // обычная строка в JSON

// 2) Unix timestamp
Эпоха = Дата(1970,1,1,0,0,0);
Секунд = Число((Дата1 - Эпоха));                        // разница в секундах
Тело.Вставить("ts", Секунд);                            // JSON-число

// 3) разобрать нестандартный формат из API
Строка = "17.07.2026 10:30:00";
Год    = Число(Сред(Строка, 7, 4));
Месяц  = Число(Сред(Строка, 4, 2));
День   = Число(Сред(Строка, 1, 2));
Час    = Число(Сред(Строка, 12, 2));
Мин    = Число(Сред(Строка, 15, 2));
Дата2  = Дата(Год, Месяц, День, Час, Мин, 0);

Для Unix timestamp помните: дата до 1970 года так не отдаётся — секунд с эпохи получится отрицательное число, часть парсеров это не примет. Для исторических дат (день рождения, дата документа за 1960-е) используйте ISO 8601 — там ограничения нет.

Пустая дата и null: как передавать «нет значения»

Пустая дата в 1С — это Дата(1,1,1). При ФорматДатыJSON.ISO она сериализуется как "0001-01-01T00:00:00", что большинство клиентов не поймёт как «пусто». Правильно передавать null:

// перед сериализацией пустую дату превращаем в Неопределено → null в JSON
Если Данные.ДатаОплаты = '00010101' Тогда
    Данные.ДатаОплаты = Неопределено;   // ← в JSON уйдёт "ДатаОплаты": null
КонецЕсли;

ЗаписатьJSON(ЗаписьJSON, Данные, Новый НастройкиСериализацииJSON,
    "", ФорматДатыJSON.ISO);

На чтении обратная логика: если поле "ДатаОплаты": null — в ПрочитатьJSON() получим Неопределено, и его нужно превратить в пустую дату '00010101' перед сохранением в реквизит типа «Дата», иначе будет ошибка присваивания.

Частые ошибки формата даты в JSON в 1С

  • Дата в json 1с приходит строкой. В ПрочитатьJSON() не задан ИменаСвойствСоЗначениямиДата. Перечислите поля через запятую — «Дата,Создано,Оплачено».
  • Час «поехал» на 3 (или на другое смещение). Сериализовали локальную дату, а сервер ждал UTC. Явно вычтите ЧасовойПояс().СмещениеПоУниверсальномуВремени перед сериализацией.
  • «0001-01-01…» вместо пропуска поля. Пустую дату Дата(1,1,1) заменяйте на Неопределено — тогда в JSON улетит null.
  • Ошибка «Неверный формат представления даты». Формат в API не совпал с ФорматДатыJSON. Если пришло "2026-07-17 10:30:00" (пробел вместо T) — ISO не разберёт, парсите строку вручную.
  • Год до 1970 в Unix timestamp. Отрицательное число секунд — не гарантирует корректный парсинг у клиента. Для исторических дат — только ISO 8601.
  • ФорматДатыJSON.Microsoft «просто на всякий случай». Формат "/Date(...)/" — legacy, современные фронты его не понимают. Используйте только при интеграции со старым .NET.

Частые вопросы по формату даты в JSON в 1С

Как в 1С отдать дату в JSON в формате ISO 8601 с Z на конце?

ФорматДатыJSON.ISO отдаёт время без часового пояса. Чтобы получить строку "2026-07-17T10:30:00Z", переведите дату в UTC вручную (вычтите ЧасовойПояс().СмещениеПоУниверсальномуВремени) и добавьте "Z" через Формат(), либо задайте формат даты через конкатенацию строки.

Почему после ПрочитатьJSON поле осталось строкой, а не датой?

Не заполнен параметр ИменаСвойствСоЗначениямиДата. Перечислите в нём имена полей, содержащих дату, через запятую — тогда для них будет применён ФорматДатыJSON и получится тип Дата.

Как передать пустую дату во внешний API?

Перед сериализацией замените пустую дату '00010101' на Неопределено — в JSON уйдёт null. Строка "0001-01-01T00:00:00" редко воспринимается системами как «нет значения» и часто ломает приёмник.