XDTO и работа с JSON

30.01.25

Разработка - Механизмы платформы 1С

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

В своей предыдущей статье «Гайд по XDTO для чайников» я подробно описал основные моменты работы с данным механизмом, однако не затронул тему использования JSON в XDTO, по поводу чего получил заслуженную критику в комментариях. Исправляюсь, и целиком посвящаю статью устранению данного пробела.

 

Введение в JSON и XDTO: сравнение с XML

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

XDTO (XML Data Transfer Objects) — это механизм 1С, созданный для работы с XML. Он позволяет формировать объекты, строго соответствующие XML-схемам (XSD), и автоматически сериализовать их в XML.

Несмотря на то, что XDTO ориентирован на XML, начиная с версии 8.3.7, 1С получила поддержку JSON-сериализации XDTO, что значительно упростило интеграцию с сервисами, работающими на JSON. Теперь можно использовать XDTO не только для XML, но и для JSON, при этом сохраняя строгую типизацию и преимущества XDTO.

Формат

Преимущества

Недостатки

XML

Строгая схема, удобство в XDTO, поддержка в 1С

Избыточность, сложность парсинга

JSON

Компактность, популярность, удобочитаемость

Нет встроенной строгой схемы, нюансы работы с типами

 

Таким образом, JSON становится хорошей альтернативой XML, особенно для веб-сервисов и интеграции с REST API.


Почему JSON набирает популярность в 1С

Старые SOAP-сервисы, использующие XML, постепенно уступают место REST API, работающим с JSON. Причины этого:

  • Меньший объём данных. JSON-код короче XML за счёт отсутствия закрывающих тегов.
  • Лёгкость обработки. JSON проще читать и парсить, особенно на стороне браузеров.
  • Широкая совместимость. Практически все современные API используют JSON.
  • Поддержка в 1С. Начиная с 8.3.7, XDTO умеет работать не только с XML, но и с JSON.

Если раньше разработчикам приходилось вручную преобразовывать JSON в XML и обратно, то теперь можно работать с JSON напрямую через XDTO. Это упрощает интеграцию и снижает вероятность ошибок.


Основные возможности XDTO для работы с JSON

Теперь XDTO поддерживает JSON-сериализацию и десериализацию без необходимости промежуточного преобразования в XML. Ключевые возможности:

  • Автоматическое преобразование XDTO-объектов в JSON.
  • Сохранение структуры данных в JSON.
  • Поддержка коллекций (массивов) в JSON.
  • Гибкая настройка сериализации (например, добавление информации о типах).
  • Чтение JSON-объектов и восстановление XDTO-структуры.

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


Сериализация XDTO в JSON

Общие принципы JSON-сериализации XDTO

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

Основные принципы работы с JSON в XDTO:

  • JSON-сериализация сохраняет структуру объекта XDTO.
  • Коллекции XDTO преобразуются в массивы JSON.
  • Типы данных могут быть сохранены или опущены в зависимости от настроек.
  • Пространства имён XML не сохраняются в JSON.

Использование СериализаторXDTO.ЗаписатьJSON()

Для сериализации XDTO-объекта в JSON используется метод ЗаписатьJSON(). Этот метод записывает объект в поток JSON, сохраняя его структуру.

Пример:

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектXDTO);
JSONСтрока = ЗаписьJSON.Закрыть();
Сообщить(JSONСтрока);

Этот код преобразует объект XDTO в JSON-строку и выводит её в интерфейс 1С.


Управление типами данных при сериализации (НазначениеТипаXML.Явное)

По умолчанию JSON-сериализация XDTO не добавляет информацию о типах данных. Это может привести к проблемам при десериализации. Чтобы включить явное указание типов, используется третий параметр НазначениеТипаXML.Явное.

Пример:

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектXDTO, НазначениеТипаXML.Явное);
JSONСтрока = ЗаписьJSON.Закрыть();
Сообщить(JSONСтрока);

В этом случае JSON будет включать информацию о типах, что облегчит последующую десериализацию.

Например, элемент справочника Валюты будет преобразован в строку JSON примерно такого вида:

{
"#type": "jcfg:CatalogObject.Валюты",
"#value": {
"Ref": "5b65bd8e-ea70-11e4-af93-e03f49b16069",
"DeletionMark": false,
"Code": "978",
"Description": "Евро",
"Курс": 54.659,
"ДатаКурса": "2015-04-25T00:00:00"
}
}

Как мы видим, появился элемент #type, который и описывает тип текущего элемента.


Особенности работы с коллекциями и пространствами имён

  • Коллекции XDTO в JSON представлены в виде массивов
  • {
  •   "Сотрудники": [
  •     { "ФИО": "Иван Иванов" },
  •     { "ФИО": "Пётр Петров" }
  •   ]
  • }

В отличие от XML, где коллекции хранятся в виде повторяющихся узлов, JSON использует массивы.

  • Пространства имён XML в JSON не сохраняются. Если объект XDTO содержит пространство имён, оно не будет включено в JSON-представление.
 

Теперь вы знаете, как сериализовать XDTO в JSON, управлять типами данных и работать с коллекциями. Далее мы рассмотрим процесс обратной десериализации JSON в XDTO.

 

Десериализация JSON в XDTO

Чтение JSON в объекты XDTO (СериализаторXDTO.ПрочитатьJSON())

Десериализация — это процесс преобразования JSON-данных обратно в объект XDTO. В 1С для этого используется метод СериализаторXDTO.ПрочитатьJSON().

Пример:

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Иван Иванов", "Возраст": 30 }');
ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("СправочникОбъект.Сотрудники"));
Сообщить(ОбъектXDTO.ФИО);

Этот код преобразует JSON-строку в объект XDTO, используя указанный тип данных.


Работа с JSON без явного указания типов

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

Пример:

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Пётр Петров", "Возраст": 40 }');
Данные = ЧтениеJSON.Прочитать();

ТипXDTO = ФабрикаXDTO.Тип("http://example.com/employees", "Сотрудник");
ОбъектXDTO = ФабрикаXDTO.Создать(ТипXDTO);
ОбъектXDTO.ФИО = Данные.ФИО;
ОбъектXDTO.Возраст = Данные.Возраст;

В этом примере JSON сначала читается как обычная структура 1С, а затем значения вручную переносятся в объект XDTO.


Использование функций восстановления при чтении

Функции восстановления позволяют подставлять значения по умолчанию или корректировать данные при десериализации, если в JSON-объекте отсутствуют или искажены некоторые поля.

Пример функции восстановления:

&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
    
    Если Свойство = "pressure" Тогда
        Возврат Значение*0.75;
    ИначеЕсли Свойство = "temp" Тогда
        Возврат Значение-273.15;
    ИначеЕсли Свойство = "speed" Тогда
        Возврат Значение*1.61;
    Иначе
        Возврат Значение;
    КонецЕсли;

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

Чтобы использовать эту функцию при чтении JSON, её необходимо передать в метод ПрочитатьJSON.

Пример чтения JSON с функцией восстановления:

&НаСервере
Процедура ЧтениеНаСервере()

    Чтение = Новый ЧтениеJSON;
    Чтение.ОткрытьФайл("c:\temp\weather.json");
    Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
    Чтение.Закрыть();

КонецПроцедуры

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

При разработке функции восстановления нужно учитывать, что в этой функции можно заменить значение, которое считано из JSON-документа, но нельзя изменить тип считываемого объекта. Функция восстановления также не будет вызываться для служебных свойств, которые создаются и используются системой «1С:Предприятие», например, #type#ns и т. д.


Ограничения и ошибки при десериализации

При работе с десериализацией JSON в XDTO могут возникнуть следующие ошибки:

  • Несовпадение типов. Если JSON содержит строку вместо числа, может возникнуть ошибка.
  • Отсутствие обязательных полей. Если в JSON нет обязательного атрибута, объект XDTO может быть некорректным.
  • Неизвестные структуры данных. Если JSON содержит дополнительные поля, не описанные в XDTO-схеме, это вызовет ошибку.

Для предотвращения этих проблем рекомендуется:

  • Использовать явное указание типов при сериализации (НазначениеТипаXML.Явное).
  • Проверять входные данные перед десериализацией.
  • Использовать обработку ошибок и предобработку значений.
 

Теперь вы знаете, как преобразовывать JSON-данные в XDTO, работать с динамическими JSON-структурами и избегать ошибок при чтении данных. Далее рассмотрим практическое применение XDTO и JSON в интеграции с API и веб-сервисами.

Практические примеры и рекомендации

Интеграция 1С с внешними API через JSON и XDTO

JSON стал стандартом при взаимодействии с веб-сервисами, особенно с REST API. Использование XDTO позволяет удобно сериализовать и десериализовать данные при обмене с внешними системами.

Пример запроса к API с использованием JSON:

Соединение = Новый HTTPСоединение(Хост, Порт);
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
    Сообщить(ОбъектXDTO.ФИО);
КонецЕсли;

Этот код отправляет HTTP-запрос, получает JSON-ответ и преобразует его в объект XDTO.


Конвертация JSON в XML и обратно

Иногда требуется преобразовать JSON-данные в XML и наоборот. В XDTO это можно сделать с использованием сериализаторов.

Пример преобразования JSON в XML:

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Иванов Иван", "Возраст": 30 }');
ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("СправочникОбъект.Сотрудники"));

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
XMLСтрока = ЗаписьXML.Закрыть();
Сообщить(XMLСтрока);

Этот код превращает строку в формате JSON в XML.


Советы по оптимизации работы с JSON в 1С

  1. Используйте явное указание типов (НазначениеТипаXML.Явное).
  2. Логируйте JSON-ответы API перед десериализацией для упрощения отладки.
  3. Используйте обработку ошибок при чтении JSON (Попытка...Исключение).
  4. Очищайте JSON-данные перед обработкой (удаление лишних пробелов, контроль формата).

Выводы

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

Основные выводы:

  1. Сериализация и десериализация JSON в XDTO работают автоматически, сохраняя структуру объектов и поддерживая коллекции.
  2. Можно управлять типами данных, используя НазначениеТипаXML.Явное, что упрощает последующую обработку.
  3. Функции восстановления значений помогают корректно загружать JSON-данные, даже если в них присутствуют некорректные или нестандартные значения.
  4. XDTO сохраняет строгую структуру данных, но остаётся достаточно гибким, чтобы адаптироваться к различным форматам JSON.
  5. Интеграция 1С с API через JSON упрощается благодаря использованию HTTP-запросов и XDTO-объектов, что позволяет легко обмениваться структурированными данными.
  6. При работе с JSON важно тестировать схемы XDTO и логировать JSON-ответы API, чтобы избежать неожиданных ошибок и упрощать отладку.

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

XDTO JSON

См. также

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    5565    dsdred    40    

91

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    9910    bayselonarrend    21    

160

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7149    dsdred    18    

81

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    23015    YA_418728146    28    

73

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    25293    SeiOkami    48    

136
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3776 30.01.25 08:14 Сейчас в теме
Ну вот, другое дело.
Спасибо, от меня плюсик.

ПС. Рекомендую в первой статье про XML добавить ссылку на эту.
user2122906; +1 Ответить
Оставьте свое сообщение