Разработка интеграционных решений в экосистеме 1С:Предприятие практически всегда сталкивается с необходимостью обмена данными с внешними системами. Современным стандартом де-факто для таких обменов стал формат JSON, который обеспечивает легковесность и высокую скорость обработки информации. Однако, несмотря на кажущуюся простоту структуры, передача типов данных, специфичных для платформы 1С, часто вызывает затруднения у разработчиков.

Одной из самых частых проблем является корректная сериализация даты и времени. В отличие от простых строк или чисел, дата в 1С имеет сложную внутреннюю структуру и зависит от часового пояса сервера. Неправильная конвертация может привести к тому, что внешняя система получит неверное время, что критично для логистики, бухгалтерии и аудита действий пользователей.

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

Специфика хранения времени в 1С и JSON

Платформа 1С:Предприятие хранит значение типа Дата как количество секунд (или миллисекунд в зависимости от контекста), прошедших с начала эпохи, но с учетом локального времени сервера или клиента. В то же время, спецификация JSON не имеет выделенного типа данных для даты.

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

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

⚠️ Внимание: По умолчанию 1С может передавать дату в локальном формате без указания смещения часового пояса, если явно не заданы параметры сериализации. Это может вызвать рассинхронизацию времени на 3-4 часа при обмене с серверами, находящимися в другом регионе.

Для корректного взаимодействия необходимо явно контролировать формат вывода. Использование универсального координированного времени (UTC) является лучшей практикой для межсистемного обмена, так как оно исключает путаницу с летним и зимним временем.

💡

Всегда стремитесь передавать время в формате UTC (с суффиксом Z или явным смещением +00:00), чтобы принимающая система могла сама привести его к локальному времени пользователя.

Использование ЗаписьJSON для автоматической конвертации

Самый надежный и простой способ записать структуру данных, включая даты, в формат JSON — использовать встроенный объект ЗаписьJSON. Этот механизм автоматически обрабатывает типы данных 1С, преобразуя их в валидный JSON.

При записи объекта Структура или Соответствие, содержащего поля типа Дата, объект ЗаписьJSON по умолчанию выводит дату в формате, совместимом со стандартом ISO 8601. Важным параметром здесь является настройка использования экранирования и форматирования.

Рассмотрим пример кода, демонстрирующий базовую сериализацию даты:

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

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

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

СтрокаJSON = "";

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

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

Запись.ЗаписатьЗначение(СтруктураДанных);

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

В результате выполнения этого кода поле ДатаОперации будет представлено в строке JSON. Формат вывода зависит от версии платформы и настроек региона, но чаще всего это строка вида "2023-10-25T14:30:00".

  • 📅 Объект ЗаписьJSON автоматически определяет тип значения и выбирает правильный способ его представления.
  • 🛡️ Использование встроенных средств минимизирует риск синтаксических ошибок в формируемой строке.
  • ⚙️ Можно контролировать экранирование специальных символов через свойства объекта записи.

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

📊 Какой формат даты вы чаще всего используете в интеграциях?
ISO 8601 (полный)
Только дата (YYYY-MM-DD)
Unix Timestamp (число)
Локальный формат 1С

Ручное форматирование даты через Формат()

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

Функция Формат() в 1С поддерживает мощный синтаксис описания форматов. С ее помощью можно легко отделить дату от времени, добавить смещение часового пояса или изменить разделители.

Пример ручного форматирования даты перед записью в JSON:

ТекущаяДатаВрем = ТекущаяДата();

// Форматируем дату в строгий формат ISO 8601 с разделителем T

ФорматированнаяДата = Формат(ТекущаяДатаВрем, "ДФ='yyyy-MM-ddTHH:mm:ss'");

Структура = Новый Структура("Событие", ФорматированнаяДата);

// Далее запись в JSON стандартным способом

Использование такого подхода особенно актуально при работе с устаревшими системами, которые не понимают стандартный формат 1С или требуют специфического представления, например, только даты в формате DD.MM.YYYY.

Параметр формата Описание Пример результата
ДФ='yyyy-MM-dd' Только дата, год-месяц-день 2023-10-25
ДФ='HH:mm:ss' Только время, часы-минуты-секунды 14:30:00
ДФ='yyyy-MM-ddTHH:mm:ssZ' Полная дата с указанием зоны (Z - UTC) 2023-10-25T14:30:00Z
ДФ='unixtime' Конвертация в число секунд эпохи 1698244200

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

Работа с часовыми поясами и UTC

Одной из самых коварных проблем при интеграции является разница в часовых поясах. Сервер 1С может находиться в Москве, сервер базы данных в Лондоне, а клиентское приложение — в Нью-Йорке. Без унификации времени данные будут искажены.

В 1С существует метод УниверсальнаяДата() и функции работы со смещением. Для корректной записи даты в JSON рекомендуется приводить все даты к универсальному координированному времени (UTC) перед сериализацией.

Пример приведения даты к UTC перед записью:

ЛокальнаяДата = ТекущаяДата();

// Получаем смещение локального времени относительно UTC

Смещение = ПолучениеСмещенияЧасовогоПояса(ЛокальнаяДата);

// Вычитаем смещение, чтобы получить UTC

ДатаUTC = ЛокальнаяДата - Смещение;

Структура = Новый Структура("ВремяСобытия", ДатаUTC);

При использовании формата ISO 8601, к строке даты в UTC принято добавлять символ Z (Zulu time), что явно указывает на отсутствие смещения. Это позволяет парсерам на других языках программирования однозначно понять, что время универсальное.

⚠️ Внимание: Функция ТекущаяДата() возвращает время по часам сервера 1С. Если сервер переведен на летнее время вручную, а ОС нет (или наоборот), могут возникнуть ошибки в расчетах смещения. Всегда проверяйте настройки сервера.

💡

Золотое правило интеграции: храните и передавайте время в UTC, а отображайте в локальном времени только на стороне клиента (в интерфейсе).

Альтернативный способ: Unix Timestamp

В некоторых сценариях, особенно при работе с высоконагруженными системами или мобильными приложениями, передача даты в виде строки считается избыточной. В таких случаях используется формат Unix Timestamp — количество секунд (или миллисекунд), прошедших с 1 января 1970 года.

В 1С нет встроенной функции для прямой конвертации в Unix Timestamp одной строкой кода в старых версиях, но это легко реализуется математически. Преимущество такого подхода — дата передается как Число, что занимает меньше места и проще обрабатывается.

Пример конвертации даты 1С в Unix Timestamp (секунды):

Функция ДатаВUnix(Дата1С)

// Начало эпохи Unix

НачалоЭпохи = '19700101';

// Разница в секундах

Возврат РазностьДат(Дата1С, НачалоЭпохи, "Секунда");

КонецФункции

При записи такого значения в структуру, объект ЗаписьJSON запишет его как обычное число, без кавычек. Это валидный JSON, где значение даты является числовым типом.

  • 🚀 Числовой формат даты занимает меньше байт в сети по сравнению со строкой ISO.
  • 🧮 Упрощает математические операции с датами на стороне клиента (JavaScript, Python).
  • ⚠️ Требует явной договоренности о единицах измерения (секунды или миллисекунды).

Обратная конвертация также проста: к полученному числу нужно прибавить дату начала эпохи. Этот метод часто используется в REST API современных веб-сервисов.

Нюанс миллисекунд

JavaScript использует миллисекунды для Unix времени, а 1С и многие бэкенд-системы — секунды. При интеграции с фронтендом часто требуется умножать значение на 1000.

Типовые ошибки и способы их устранения

Даже при знании теории, на практике разработчики сталкиваются с рядом проблем. Чаще всего они связаны с неявным преобразованием типов или особенностями парсинга JSON на стороне получателя.

Одна из частых ошибок — передача даты в формате, который 1С считает строкой, но который не является валидной датой для парсера. Например, использование точек вместо дефисов в дате (25.10.2023) может быть корректно прочитано человеком, но вызовет ошибку в строгом валидаторе JSON Schema.

Также стоит остерегаться проблемы "конца дня". В 1С время 23:59:59 часто используется для обозначения конца периода. При конвертации в UTC это может перенести дату на следующий день, что нарушит логику отчетов за период.

⚠️ Внимание: При передаче интервалов дат убедитесь, что конечная дата включает в себя весь день. Лучше передавать дату начала следующего дня с временем 00:00:00, чем 23:59:59 текущего дня.

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

☑️ Чек-лист проверки даты перед отправкой

Выполнено: 0 / 4

Часто задаваемые вопросы (FAQ)

Как записать дату в JSON без времени (только число, месяц, год)?

Для этого необходимо предварительно отформатировать дату функцией Формат(Дата, "ДФ='yyyy-MM-dd'") и записать полученную строку в структуру. Либо обнулить время у объекта даты перед записью: НоваяДата = Дата(Год(СтараяДата), Месяц(СтараяДата), День(СтараяДата)).

Почему при чтении JSON в 1С дата приходит строкой, а не типом Дата?

Потому что в стандарте JSON нет типа "Дата". При чтении ЧтениеJSON видит строку и создает тип Строка. Вам необходимо явно преобразовать эту строку в дату функцией Дата() или ПолучитьДатуИзСтроки(), зная формат, в котором она была записана.

Можно ли передавать дату в 1С JSON как число (timestamp)?

Да, конечно. JSON поддерживает числовые типы. Вы можете рассчитать количество секунд от начала эпохи и записать это число в структуру. 1С запишет его как число без кавычек. Принимающая сторона должна быть готова обработать число как дату.

Как экранировать специальные символы в дате при записи JSON?

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