Формат даты в 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
В подавляющем большинстве интеграций правильный ответ — 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-строка
Обратите внимание: даты в 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.Закрыть();
Сообщить(Результат["Дата"]); // тип: Дата
Сообщить(Результат["Оплачено"]); // тип: Дата
Если параметр ИменаСвойствСоЗначениямиДата не задать — поля
"Дата" и "Оплачено" останутся строками
"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 МСК для отображения
ЧасовойПояс().
Нестандартный формат даты в 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" редко воспринимается системами как «нет значения» и
часто ломает приёмник.