Как преобразовать JSON-строку или HTTP-ответ в объекты 1С без сохранения в файл

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними REST API по протоколу HTTP в ответе сервера часто приходит JSON-структура в виде текстовой строки. Создание временных файлов на диске для последующего разбора данных создает лишнюю нагрузку на дисковую подсистему. Встроенные средства платформы 1С позволяют распарсить JSON напрямую из строки или потока в объекты 1С (Соответствие, Структура, Массив).

Разберем подробнее, как правильно преобразовать JSON-строку в объекты 1С и какие нюансы следует учитывать.

Способ 1. Парсинг JSON-строки с помощью объектов ЧтениеJSON и ПрочитатьJSON

Рассмотрим базовый сценарий, когда в результате выполнения HTTP-запроса через метод HTTPОтвет.ПолучитьТелоКакСтроку() была получена JSON-строка. Для ее десериализации создается объект ЧтениеJSON, после чего вызывается глобальная функция ПрочитатьJSON().

Посмотрим на пример кода:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатТекст);
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();

Обратим внимание на второй параметр функции ПрочитатьJSON() — ПрочитатьВСоответствие:

  1. Значение Истина: платформенные объекты JSON преобразуются в коллекцию типа Соответствие. Это наиболее безопасный способ. Если ключи в JSON содержат дефисы, точки, пробелы или начинаются с цифры (например, "user-id" или "123"), Соответствие успешно их прочитает.
  2. Значение Ложь (по умолчанию): данные читаются в объект Структура. Если ключ JSON не соответствует правилам именования идентификаторов в 1С, платформа вызовет критическую ошибку.

Способ 2. Чтение JSON напрямую из потока HTTP-ответа

Начиная с платформы 8.3.10, у объекта HTTPОтвет доступен метод ПолучитьТелоКакПоток(). Это позволяет передавать данные из сети сразу в объект чтения JSON, избегая промежуточного формирования больших строк в оперативной памяти.

Проанализируем пример обработки сетевого ответа через поток:


// Выполнение HTTP-запроса
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);

// Чтение данных напрямую из потока
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьПоток(HTTPОтвет.ПолучитьТелоКакПоток());

// Десериализация JSON в объект 1С
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();

Использование потока оптимизирует работу с памятью и гарантирует правильную обработку кодировки UTF-8 и спецсимволов BOM (Byte Order Mark).

Важные особенности и ограничения при работе с JSON

Выясним ключевые нюансы, с которыми можно столкнуться при парсинге JSON-данных в 1С:

  1. Автоматическое чтение дат: По умолчанию платформа считывает значения дат как обычный тип Строка. Чтобы считывать их в тип Дата, в функцию ПрочитатьJSON() нужно передать массив или строку с именами полей в параметр ИменаСвойствСДатами и указать параметр ОжидаемыйФорматДаты (например, ФорматДатыJSON.ISO).
  2. Объем оперативной памяти: Метод ПрочитатьJSON() полностью загружает весь документ в память (DOM-модель). Если размер ответа составляет сотни мегабайт, предпочтительнее использовать последовательное потоковое чтение, перебирая узлы вызовом метода Прочитать() объекта ЧтениеJSON и анализируя свойство ВидУзла.
  3. Точность больших чисел: Большие 64-битные числовые идентификаторы при десериализации могут быть округлены из-за особенностей типа Число. Для таких значений рекомендуется использовать строковый формат на стороне сервиса или обрабатывать их потоковым методом.
← На главную