1С:Предприятие 8
Система программ
Архитектура платформы 1С:Предприятие
(версия 8.3.25)

JSON

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

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

Существует несколько основных сценариев использования JSON.
  • Интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т. д.;
  • Организация собственного HTTP интерфейса прикладного решения;
  • Обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами;
  • Использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.

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

Потоковое чтение и запись JSON

Объекты потоковой работы последовательно читают данные в формате JSON из файла или строки, или последовательно записывают их в файл или строку. Таким образом, чтение и запись данных происходят без формирования всего документа в памяти.

Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:

JSON

Результат такой записи:

  {
	"СвойствоТипаМассив": [
		"Значение строка",
		1.2345E1,
		true,
		{
			"СвойствоТипаСтрока": "Значение строка",
			"СвойствоТипаНеопределено": null
		}
	]
}

Сериализация примитивных типов и коллекций

Вторая группа средств работы с JSON хороша тем, что избавляет от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.

Основное назначение этих средств в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.

Пример сериализации (записи) в JSON может выглядеть так:

JSON

Результат записи:

{
	"Фамилия": "Иванов",
	"Имя": "Иван",
	"Отчество": "Иванович",
	"Возраст": 40,
	"Женат": true,
	"Телефоны": [
		"8-999-999-99-90",
		"8-999-999-99-91"
	]
}

Сериализация прикладных типов 1С:Предприятия

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

Простейший код, выполняющий сериализацию элемента справочника, может выглядеть так:

JSON

В результате будет получен файл JSON следующего содержания:

{
	"#type": "jcfg:CatalogObject.Контрагенты",
	"#value": {
		"IsFolder": false,
		"Ref": "3d710076-8d04-11dc-8ca0-000d8843cd1b",
		"DeletionMark": false,
		"Parent": "9d5c422c-8c4c-11db-a9b0-00055d49b45e",
		"Code": "000000012",
		"Description": "Мосхлеб ОАО",
		"Регион": "9d5c422f-8c4c-11db-a9b0-00055d49b45e",
		"Индекс": "456789",
		"Страна": "Россия",
		"Город": "Москва",
		"Улица": "Петровка",
		"Дом": "12",
		"Телефон": "+7(999)234-78-64",
		"ЭлектроннаяПочта": "mh@hleb.ru",
		"Факс": "",
		"ВебСайт": "",
		"ВидЦен": "9d5c4225-8c4c-11db-a9b0-00055d49b45e",
		"ДополнительнаяИнформация": "Поставка хлеба",
		"КонтактноеЛицо": "Громышева П.Р.",
		"Широта": 55.762744,
		"Долгота": 37.618102
	}
}

Функции преобразования и восстановления при сериализации

Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому существует возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.

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

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

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

Использование JSON в HTTP интерфейсах приложений

Автоматически генерируемый REST интерфейс прикладных решений

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

HTTP-сервисы прикладного решения

HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. При этом, при формировании тела ответа, есть возможность указать, следует ли использовать BOM (Byte Order Mark, метка порядка байтов). 

Взаимодействие со сторонними HTTP сервисами

При взаимодействии со сторонними HTTP интерфейсами также существует возможность сформировать тело запроса в JSON, а затем установить его в HTTP запрос.