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

Разработка и Конфигурация · 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 timestamp1710495000Дата(1970,1,1) + число секунд
Произвольная строка"15.03.2026 10:30"Только ручной разбор по шаблону

Прежде чем писать код, откройте реальный пример JSON от контрагента или сервиса и зафиксируйте точный вид значения: есть ли секунды, миллисекунды, суффикс «Z» (UTC) или смещение часового пояса. От этого зависит выбор способа преобразования.

Автоматическое преобразование через ПрочитатьJSON

Встроенная функция ПрочитатьJSON при чтении в структуру или соответствие умеет распознавать строки ISO 8601 и превращать их в значения типа Дата. Для этого используется параметр ПрочитатьВСоответствие со значением Истина — тогда дата, время и некоторые другие типы распознаются автоматически.

bsl
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();

ДатаДокумента = Данные["date"]; // уже тип Дата, если формат ISO

Если чтение идёт в структуру, автоматическое распознавание дат не всегда срабатывает предсказуемо — поведение зависит от версии платформы и точного вида строки. Поэтому после чтения обязательно проверяйте тип полученного значения через ТипЗнч(), прежде чем записывать его в реквизит объекта.

Ограничение способа: он работает только для строк, строго соответствующих ISO 8601. Unix timestamp, даты с русскими разделителями или нестандартные шаблоны останутся строками или числами и потребуют ручной обработки.

Ручной разбор строки ISO 8601

Когда автоматика не срабатывает или формат содержит смещение часового пояса, строку разбирают вручную. Самый надёжный подход — вырезать из строки составные части и собрать дату функцией Дата(Год, Месяц, День, Час, Минута, Секунда).

bsl
Функция ДатаИзISO(СтрокаДаты)
    Строка = СтрЗаменить(СтрокаДаты, "T", " ");
    Строка = СтрЗаменить(Строка, "-", "");
    Строка = СтрЗаменить(Строка, ":", "");
    Строка = СтрЗаменить(Строка, " ", "");
    // теперь формат ГГГГММДДЧЧММСС
    Возврат Дата(Лев(Строка, 14));
КонецФункции

Конструктор Дата() из строки принимает 14 цифр в порядке «ГГГГММДДЧЧММСС» — это удобный приём, избавляющий от множества вызовов Число(). Если строка содержит миллисекунды или смещение вида «+03:00», их нужно предварительно отсечь: найти позицию символа «.» или «+» и взять левую часть.

Отдельный нюанс — суффикс «Z», означающий время UTC. Если учёт в 1С ведётся в локальном времени, а сервис отдаёт UTC, даты будут «уезжать» на величину смещения. Решите заранее, приводить ли время к локальному, и зафиксируйте это в коде явно, а не «как получилось».

Преобразование Unix timestamp

Unix timestamp — это число секунд, прошедших с 1 января 1970 года по UTC. В JSON он приходит числом (иногда строкой-числом), и преобразование сводится к простой арифметике.

bsl
Функция ДатаИзUnix(Метка)
    Возврат Дата(1970, 1, 1) + Метка; // Метка — число секунд
КонецФункции

Два подводных камня. Первый: некоторые сервисы отдают метку в миллисекундах — тогда значение будет на три порядка больше, и его нужно предварительно разделить на 1000. Признак проблемы — получившаяся дата уходит в далёкое будущее. Второй: метка всегда в UTC, поэтому к результату обычно прибавляют смещение локального часового пояса в секундах.

Проверить корректность просто: известная метка, соответствующая конкретному моменту, должна после преобразования дать ожидаемую дату и время. Возьмите тестовое значение из документации сервиса и сверьте результат.

Разбор произвольных строковых форматов

Наихудший сценарий — даты вида «15.03.2026» или «03/15/2026», где порядок дня и месяца зависит от региональных настроек отправителя. Здесь нет универсальной функции: строку разбирают по разделителям и собирают дату из частей, жёстко зафиксировав порядок компонентов в коде.

bsl
Функция ДатаИзСтрокиДМГ(СтрокаДаты) // "15.03.2026"
    Части = СтрРазделить(СтрокаДаты, ".");
    Если Части.Количество() <> 3 Тогда
        Возврат Дата(1, 1, 1); // пустая дата как признак ошибки
    КонецЕсли;
    Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецФункции

Критически важно не полагаться на неявное преобразование строки в дату — оно зависит от региональных настроек сеанса и на разных серверах может дать разный результат. Явный разбор по шаблону делает код предсказуемым везде.

Типичные ошибки
01
Доверять неявному преобразованию строки в дату — на сервере с другими региональными настройками день и месяц меняются местами
02
Игнорировать миллисекунды в Unix timestamp — дата улетает на тысячи лет вперёд
03
Не проверять результат на пустоту — в документ записывается дата 01.01.0001 без единого предупреждения
04
Смешивать UTC и локальное время в одном обмене без явного пересчёта

Проверка результата и обработка ошибок

Любое преобразование даты из внешних данных должно заканчиваться проверкой. Минимальный набор: тип значения — Дата, значение не пустое (не равно Дата(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) осознанно, с протоколированием, а не пытаются разбирать пустое значение парсером.