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

Разработка и Конфигурация · 10 мин

1С: как записать дату в JSON

Как записать дату в JSON из 1С: ЗаписьJSON, сериализатор XDTO, форматы ISO 8601 и Unix. Примеры кода, типичные ошибки и проверка результата.

Запись даты в JSON из 1С — частая задача при обмене данными с веб-сервисами, сайтами и мобильными приложениями. Сложность в том, что в стандарте JSON нет отдельного типа «дата»: дату приходится передавать строкой или числом, и от выбранного формата зависит, сможет ли принимающая сторона её правильно распознать.

В 1С есть несколько способов сформировать JSON: низкоуровневый объект ЗаписьJSON, сериализатор XDTO (СериализаторXDTO.ЗаписатьJSON) и ручная сборка строки. Каждый подход по-разному обрабатывает значения типа «Дата», и именно здесь чаще всего возникают ошибки — дата уходит в неожиданном виде, теряет время или часовой пояс.

Ниже разобраны рабочие варианты кода, допустимые форматы даты, настройки сериализации и способы проверить, что приёмник на другой стороне получил именно то значение, которое вы отправляли.

Какие форматы даты допустимы в JSON

Спецификация JSON не определяет тип «дата», поэтому дату передают одним из трёх способов: строкой ISO 8601, числом (Unix timestamp) или строкой в произвольном согласованном формате. Выбор зависит от того, что ожидает принимающая система.

Формат ISO 8601 вида 2026-03-15T14:30:00 — фактический стандарт обмена. Его понимают JavaScript (new Date()), большинство REST-API, веб-сервисы и сама 1С при обратном чтении. Рекомендуется использовать его по умолчанию, если контракт обмена не требует иного.

Unix timestamp — количество секунд (или миллисекунд) с 1 января 1970 года. Компактен и удобен для сравнений, но не читается человеком и требует согласования часового пояса: timestamp всегда в UTC, а дата в 1С обычно хранится в локальном времени сеанса или сервера.

Произвольные форматы вроде 15.03.2026 допустимы, только если это явно прописано в соглашении об обмене. Иначе приёмник может распарсить день и месяц наоборот (проблема форматов DD.MM против MM.DD) и получить неверную дату без какой-либо ошибки.

Сравнение форматов даты в JSON

ISO 8601 (строка)

Читаем, понятен большинству систем и самой 1С. Рекомендуемый вариант по умолчанию.

Unix timestamp (число)

Компактен, удобен для вычислений. Требует согласования часового пояса и единиц (секунды или миллисекунды).

Произвольная строка (ДД.ММ.ГГГГ)

Только по явному договору обмена. Высокий риск перепутать день и месяц на стороне приёмника.

Запись даты через ЗаписьJSON

Объект ЗаписьJSON даёт полный контроль над структурой документа. Дату передают методом ЗаписатьЗначение(), предварительно преобразовав её в строку функцией Формат() с нужной форматной строкой.

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("ДатаДокумента");

Запись.ЗаписатьЗначение(Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-ddTHH:mm:ss"));

Запись.ЗаписатьИмяСвойства("Номер");

Запись.ЗаписатьЗначение("А-00125");

Запись.ЗаписатьКонецОбъекта();

Результат = Запись.Закрыть();

Форматная строка ДФ=yyyy-MM-ddTHH:mm:ss даёт классический ISO-вид: 2026-03-15T14:30:00. Если нужен только день без времени, используйте ДФ=yyyy-MM-dd. Обратите внимание: в форматных строках 1С месяц обозначается заглавной MM, а минуты — строчной mm, их подмена — частая причина неверного результата.

Если передать значение типа «Дата» в ЗаписатьЗначение() напрямую, без Формат(), результат зависит от настроек сериализации и может оказаться не тем, что ожидает приёмник. Явное форматирование — более предсказуемый путь.

bsl
Запись.ЗаписатьИмяСвойства("Дата");
Запись.ЗаписатьЗначение(Формат(ДатаДокумента, "ДФ=yyyy-MM-ddTHH:mm:ss"));

Сериализация даты через СериализаторXDTO

Если нужно быстро выгрузить готовый объект (структуру, ссылку на документ, результат запроса), удобен СериализаторXDTO.ЗаписатьJSON(). Он сам обходит поля и преобразует значения типа «Дата» в строку формата ISO 8601.

Данные = Новый Структура;

Данные.Вставить("ДатаОтгрузки", ТекущаяДатаСеанса());

Данные.Вставить("Сумма", 1500.50);

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

СериализаторXDTO.ЗаписатьJSON(Запись, Данные);

ТекстJSON = Запись.Закрыть();

Плюс подхода — минимум кода и корректная обработка вложенных структур, массивов и ссылок. Минус — меньше контроля: имена свойств определяются сериализатором, а пустые даты ('00010101') могут записаться в виде, который приёмник не примет.

Перед использованием этого способа в продуктивном обмене сформируйте тестовый JSON и покажите его разработчику принимающей системы — так вы заранее согласуете вид дат и имена полей.

Запись даты числом: Unix timestamp

Если контракт обмена требует числовую дату, вычислите разницу между нужной датой и началом эпохи Unix. В 1С это делается вычитанием дат — результат в секундах.

НачалоЭпохи = Дата(1970, 1, 1, 0, 0, 0);

Timestamp = ТекущаяДатаСеанса() - НачалоЭпохи;

Запись.ЗаписатьИмяСвойства("ДатаUnix");

Запись.ЗаписатьЗначение(Timestamp);

Главный подводный камень — часовой пояс. Unix timestamp по определению отсчитывается от полуночи UTC, а ТекущаяДатаСеанса() возвращает локальное время. Если сервер 1С работает в часовом поясе UTC+3, вычисленный timestamp будет смещён на три часа, и приёмник покажет неверное время.

Для корректного результата сначала приведите дату к универсальному времени. В типовых конфигурациях и расширениях для этого используют функции работы с часовыми поясами либо вычисляют смещение через ТекущаяУниверсальнаяДата().

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

После формирования JSON выведите строку в сообщение или журнал и проверьте три вещи: вид даты, корректность структуры и обратное чтение. Обратное чтение — самый надёжный тест: прочитайте сформированный JSON через ЧтениеJSON и сравните полученную дату с исходной.

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(ТекстJSON);

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда

ИмяСвойства = Чтение.ТекущееЗначение;

КонецЕсли;

КонецЦикла;

Дополнительно вставьте полученную строку в любой онлайн-валидатор JSON или в консоль браузера: JSON.parse() подтвердит синтаксическую корректность, а new Date("2026-03-15T14:30:00") покажет, как дату увидит веб-приёмник.

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

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

Вид даты в строке JSON
Норма

2026-03-15T14:30:00 — год, месяц, день, время через T

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

15.03.2026 или 03/15/2026, если договаривались на ISO

Обратное чтение через ЧтениеJSON
Норма

Дата читается и совпадает с исходной

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

Строка читается как текст, дата не распознаётся

Unix timestamp
Норма

Совпадает с независимым конвертером с учётом UTC

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

Расхождение на величину часового пояса сервера

Типичные ошибки и как их избежать

Самая распространённая ошибка — перепутанные обозначения в форматной строке: mm вместо MM для месяца. В результате в позиции месяца оказываются минуты, дата получается бессмысленной, а ошибка заметна только при внимательном чтении строки.

Вторая группа проблем — пустые даты. Значение '00010101' при сериализации превращается в 0001-01-01T00:00:00, что многие приёмники трактуют как реальную дату. Проверяйте заполненность: Если ЗначениеЗаполнено(ДатаДокумента) Тогда ..., а для пустых значений записывайте ЗаписатьЗначение(Неопределено) с соответствующими настройками или пропускайте свойство.

Третья ошибка — потеря времени при форматировании только даты (ДФ=yyyy-MM-dd) там, где приёмник ожидает полное значение. Согласуйте точность заранее: для документов часто достаточно дня, для событий обмена и логов нужно время с секундами.

Типичные ошибки
01
mm вместо MM в форматной строке — вместо месяца записываются минуты, дата искажается без ошибки выполнения
02
Выгрузка пустой даты 0001-01-01 — приёмник сохраняет фиктивную дату вместо отсутствия значения
03
Игнорирование часового пояса при Unix timestamp — смещение времени на несколько часов
04
Передача даты в формате ДД.ММ.ГГГГ без договорённости — приёмник путает день и месяц

Частые вопросы

Как записать в JSON только дату без времени?

Используйте форматную строку Формат(ДатаДокумента, "ДФ=yyyy-MM-dd") — получится строка вида 2026-03-15. Убедитесь, что приёмник ожидает именно дату без времени, иначе он может дополнить значение полуночью в своём часовом поясе.

Что делать с пустой датой при записи в JSON?

Проверяйте её через ЗначениеЗаполнено() до записи. Оптимальный вариант — не включать свойство в JSON вовсе либо записать null. Выгрузка 0001-01-01 почти всегда приводит к фиктивным датам в принимающей системе.

Можно ли передать дату объектом Дата напрямую в ЗаписатьЗначение?

Технически метод примет значение, но итоговое представление будет зависеть от механизмов сериализации платформы и может не совпасть с ожиданиями приёмника. Надёжнее явно преобразовать дату функцией Формат() в строку нужного вида.

Как учесть часовой пояс при выгрузке даты?

Для строк ISO добавляйте смещение в конец (например, +03:00), если приёмник его поддерживает. Для Unix timestamp приводите дату к универсальному времени — сравните ТекущаяДатаСеанса() и ТекущаяУниверсальнаяДата(), чтобы определить смещение сервера.

Чем отличается ЗаписьJSON от СериализаторXDTO для дат?

ЗаписьJSON требует ручного форматирования каждой даты, но даёт полный контроль над видом значения. СериализаторXDTO преобразует даты в ISO-строки автоматически и удобен для готовых структур, но хуже контролирует пустые значения и имена полей.

Как проверить, что приёмник правильно понял дату?

Отправьте тестовое значение с однозначными компонентами, например 2026-03-15 (месяц больше 12 невозможен), и попросите подтвердить, какая дата отобразилась на той стороне. Дополнительно прочитайте свой JSON обратно через ЧтениеJSON и сверьте с исходным значением.

Итог

Что важно запомнить

В JSON нет типа «дата» — передавайте её строкой ISO 8601 через Формат() или числом Unix timestamp по договорённости с приёмником. Проверяйте пустые даты, не путайте MM и mm в форматной строке и всегда сверяйте результат обратным чтением.