Обмен данными в формате JSON стал стандартом для интеграции 1С с веб-сервисами, сайтами и сторонними приложениями. Многие разработчики сталкиваются с необходимостью парсинга входящих JSON-строк или формирования ответов в этом формате. В данной статье мы подробно разберем, как использовать встроенные инструменты платформы 1С:Предприятие 8.3 для работы с JSON, проанализируем примеры кода и рассмотрим нюансы сериализации данных.
Для работы с этим форматом в платформе предусмотрены специальные объекты. Рассмотрим их подробнее:
ПрочитатьJSON и ЗаписатьJSON — функции, которые упрощают процесс преобразования данных 1С (структур, массивов) в JSON и обратно.Разберем каждую операцию по шагам, начиная с чтения данных, так как это наиболее частая задача при получении ответов от API.
Представим ситуацию, что мы получили строку с данными о товарах от внешнего интернет-магазина. Наша задача — превратить эту строку в понятные для 1С коллекции (Массив или Структуру).
Для начала нам необходимо инициализировать объект чтения и указать источник данных. Посмотрим на базовый алгоритм:
// Исходная строка JSON
СтрокаJSON = "[{""Product"": ""Ноутбук"", ""Price"": 50000}, {""Product"": ""Мышь"", ""Price"": 1500}]";
// Создаем объект чтения
Чтение = Новый ЧтениеJSON;
// Устанавливаем строку, которую будем читать
Чтение.УстановитьСтроку(СтрокаJSON);
// Преобразуем JSON в объекты 1С (в данном случае в Массив Структур)
Результат = ПрочитатьJSON(Чтение);
// Не забываем закрыть чтение
Чтение.Закрыть();
В переменной Результат теперь содержится массив, который мы можем обойти циклом Для Каждого. Это самый простой способ, который подходит для большинства задач. Однако, проанализируем ситуацию, когда JSON хранится в файле на диске.
В этом случае метод УстановитьСтроку заменяется на открытие файла:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\Exchange\data.json");
// Читаем данные
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Важно: При чтении дат из JSON стандартный формат 1С может отличаться от формата, который присылает внешний сервис (например, ISO 8601). Если метод ПрочитатьJSON выдает ошибку преобразования даты, необходимо использовать функцию восстановления (параметр метода), где мы вручную опишем логику парсинга строки в дату.
Теперь рассмотрим обратную задачу: нам нужно сформировать JSON-ответ для отправки на сайт. Для этого используем объект ЗаписьJSON.
Создадим структуру с данными и запишем её в строковом виде. Разберем код:
// Подготовим данные
ДанныеДляОтвета = Новый Структура;
ДанныеДляОтвета.Вставить("Status", "OK");
ДанныеДляОтвета.Вставить("Code", 200);
ДанныеДляОтвета.Вставить("Message", "Данные успешно загружены");
// Настроим параметры записи для красивого форматирования (отступы, переносы)
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокиJSON.Авто, " ", Истина);
// Инициализируем запись
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(ПараметрыЗаписи);
// Записываем данные
ЗаписатьJSON(Запись, ДанныеДляОтвета);
// Получаем итоговую строку
РезультатСтрока = Запись.Закрыть();
Обратите внимание на использование объекта ПараметрыЗаписиJSON. Он позволяет сделать итоговый JSON читаемым для человека (pretty print). Если вам важен минимальный размер передаваемых данных, этот параметр можно не использовать, тогда весь JSON будет записан в одну строку без пробелов.
Часто возникает вопрос: что произойдет, если мы попытаемся записать в JSON ссылку на справочник или документ? Стандартный метод ЗаписатьJSON не умеет напрямую работать со ссылочными типами данных и выдаст ошибку, так как JSON поддерживает только строки, числа, булево и массивы/объекты.
Для решения этой проблемы существует два подхода:
Рассмотрим подробнее второй способ, так как он более универсален. Для этого в методы ПрочитатьJSON и ЗаписатьJSON передается объект СериализаторXDTO.
// Пример записи ссылки на номенклатуру
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00001");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
// Используем глобальный сериализатор XDTO
ЗаписатьJSON(Запись, НоменклатураСсылка, ПараметрыЗаписиJSON, СериализаторXDTO);
СтрокаСДанными = Запись.Закрыть();
В результате мы получим JSON-объект специального формата, который содержит UUID ссылки и информацию о типе. Это позволяет другой базе 1С "понять", что это именно ссылка, и при чтении попытаться найти такой объект.
Если нам необходимо выгрузить очень большой объем данных (например, миллионы записей), формирование единой структуры в памяти может привести к ошибке нехватки памяти. В таком случае, проанализируем использование методов потоковой записи.
Вместо того чтобы готовить огромный массив заранее, мы будем записывать файл по частям:
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\BigData.json");
// Начало массива
Запись.ЗаписатьНачалоМассива();
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Начало объекта (элемента массива)
Запись.ЗаписатьНачалоОбъекта();
// Записываем свойства по одному
Запись.ЗаписатьИмяСвойства("Name");
Запись.ЗаписатьЗначение(Выборка.Наименование);
Запись.ЗаписатьИмяСвойства("Code");
Запись.ЗаписатьЗначение(Выборка.Код);
// Конец объекта
Запись.ЗаписатьКонецОбъекта();
КонецЦикла;
// Конец массива
Запись.ЗаписатьКонецМассива();
Запись.Закрыть();
Такой подход позволяет генерировать файлы любого размера, используя минимум оперативной памяти, так как данные сбрасываются в файл порциями.
Мы рассмотрели основные сценарии работы с JSON в 1С. Давайте закрепим ключевые моменты:
УстановитьСтроку и глобальные функции ПрочитатьJSON / ЗаписатьJSON.ОткрытьФайл.СериализаторXDTO в качестве параметра записи.ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства), чтобы избежать переполнения памяти.Используя эти методы, вы сможете настроить надежный и быстрый обмен данными с любыми внешними системами.