Разработка и Конфигурация · 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
Читаем, понятен большинству систем и самой 1С. Рекомендуемый вариант по умолчанию.
Компактен, удобен для вычислений. Требует согласования часового пояса и единиц (секунды или миллисекунды).
Только по явному договору обмена. Высокий риск перепутать день и месяц на стороне приёмника.
Запись даты через Запись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, их подмена — частая причина неверного результата.
Если передать значение типа «Дата» в ЗаписатьЗначение() напрямую, без Формат(), результат зависит от настроек сериализации и может оказаться не тем, что ожидает приёмник. Явное форматирование — более предсказуемый путь.
Запись.ЗаписатьИмяСвойства("Дата");
Запись.ЗаписатьЗначение(Формат(ДатаДокумента, "ДФ=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") покажет, как дату увидит веб-приёмник.
Как проверить результат
2026-03-15T14:30:00 — год, месяц, день, время через T
15.03.2026 или 03/15/2026, если договаривались на ISO
Дата читается и совпадает с исходной
Строка читается как текст, дата не распознаётся
Совпадает с независимым конвертером с учётом UTC
Расхождение на величину часового пояса сервера
Типичные ошибки и как их избежать
Самая распространённая ошибка — перепутанные обозначения в форматной строке: mm вместо MM для месяца. В результате в позиции месяца оказываются минуты, дата получается бессмысленной, а ошибка заметна только при внимательном чтении строки.
Вторая группа проблем — пустые даты. Значение '00010101' при сериализации превращается в 0001-01-01T00:00:00, что многие приёмники трактуют как реальную дату. Проверяйте заполненность: Если ЗначениеЗаполнено(ДатаДокумента) Тогда ..., а для пустых значений записывайте ЗаписатьЗначение(Неопределено) с соответствующими настройками или пропускайте свойство.
Третья ошибка — потеря времени при форматировании только даты (ДФ=yyyy-MM-dd) там, где приёмник ожидает полное значение. Согласуйте точность заранее: для документов часто достаточно дня, для событий обмена и логов нужно время с секундами.
Частые вопросы
Как записать в 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 в форматной строке и всегда сверяйте результат обратным чтением.