Разработка интеграционных решений в экосистеме 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автоматически определяет тип значения и выбирает правильный способ его представления. - 🛡️ Использование встроенных средств минимизирует риск синтаксических ошибок в формируемой строке.
- ⚙️ Можно контролировать экранирование специальных символов через свойства объекта записи.
Однако, если требования к формату даты жестко регламентированы внешней системой (например, требуется только дата без времени или специфический разделитель), стандартного поведения может быть недостаточно.
Ручное форматирование даты через Формат()
В случаях, когда автоматическая сериализация не подходит, разработчик может воспользоваться функцией Формат() для явного преобразования даты в строку нужного вида перед записью в структуру. Это дает полный контроль над внешним представлением данных.
Функция Формат() в 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С, с помощью снифферов трафика или журнала регистрации.
☑️ Чек-лист проверки даты перед отправкой
Часто задаваемые вопросы (FAQ)
Как записать дату в JSON без времени (только число, месяц, год)?
Для этого необходимо предварительно отформатировать дату функцией Формат(Дата, "ДФ='yyyy-MM-dd'") и записать полученную строку в структуру. Либо обнулить время у объекта даты перед записью: НоваяДата = Дата(Год(СтараяДата), Месяц(СтараяДата), День(СтараяДата)).
Почему при чтении JSON в 1С дата приходит строкой, а не типом Дата?
Потому что в стандарте JSON нет типа "Дата". При чтении ЧтениеJSON видит строку и создает тип Строка. Вам необходимо явно преобразовать эту строку в дату функцией Дата() или ПолучитьДатуИзСтроки(), зная формат, в котором она была записана.
Можно ли передавать дату в 1С JSON как число (timestamp)?
Да, конечно. JSON поддерживает числовые типы. Вы можете рассчитать количество секунд от начала эпохи и записать это число в структуру. 1С запишет его как число без кавычек. Принимающая сторона должна быть готова обработать число как дату.
Как экранировать специальные символы в дате при записи JSON?
Объект ЗаписьJSON делает это автоматически. Если вы формируете JSON строку вручную (конкатенацией), вам нужно самостоятельно заменять кавычки и обратные слеши, но ручной метод формирования JSON категорически не рекомендуется использовать в продакшене.