Как из JSON получить данные в 1С и загрузить их в таблицу?

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

Работа с внешними сервисами через API — одна из самых распространенных задач современного разработчика 1С. Чаще всего данные от сторонних систем приходят в формате JSON. Несмотря на наличие встроенных инструментов в платформе 8.3, начинающие программисты часто сталкиваются с трудностями при парсинге сложных структур и передаче полученных данных между контекстами выполнения кода. В этой статье мы подробно разберем, как правильно прочитать JSON, избежать типичных ошибок и эффективно перенести данные в таблицу.

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

Для обработки JSON в 1С 8.3 предусмотрено два основных механизма: объектное чтение и потоковое чтение. Чаще всего используется объектное чтение через функцию ПрочитатьJSON, которая сразу преобразует текстовую строку в привычные типы 1С: Структура, Массив или Соответствие. Рассмотрим базовый алгоритм, который мы будем использовать:

  1. Создаем объект ЧтениеJSON.
  2. Устанавливаем строку-источник с помощью метода УстановитьСтроку.
  3. Используем глобальную функцию ПрочитатьJSON для получения объекта.
  4. Закрываем чтение методом Закрыть.

Проанализируем пример функции, которая превращает строку JSON в структуру 1С:


Функция СтрокуJSONВСтруктуру(ЗначениеJSON)
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ЗначениеJSON);
    Результат = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    Возврат Результат;
КонецФункции

Решение проблемы передачи данных между клиентом и сервером

Разберем ситуацию, когда при попытке парсинга возникает ошибка: "Ошибка отображения типов: Отсутствует отображение для типа 'HTTPОтвет'". Выясним причину: объект HTTPОтвет, который мы получаем от сервера, является мутабельным (изменяемым) и привязан к контексту. Его нельзя передавать напрямую с сервера на клиент или использовать в параметрах процедур, пересекающих границу "сервер-клиент".

Чтобы избежать этой ошибки, выполним следующие действия:

  1. На сервере получаем тело ответа в виде строки с помощью метода ПолучитьТелоКакСтроку().
  2. Передаем на клиент или в функцию парсинга именно эту строку, а не весь объект ответа.
  3. На стороне приема работаем уже с текстовыми данными.

Это критически важный момент: в коде всегда разделяйте транспортный уровень (получение данных по HTTP) и уровень обработки данных (парсинг JSON).

Структура или Соответствие: выбираем правильно

Функция ПрочитатьJSON имеет второй параметр, который определяет, во что будут преобразованы объекты JSON. По умолчанию (если передать Ложь) объекты превращаются в Структуру. Однако, как мы знаем, ключи структуры в 1С должны соответствовать правилам именования переменных (нельзя использовать дефисы, пробелы, начинать с цифр).

Если во внешнем JSON ключи содержат "неправильные" символы (например, "item-price"), то при чтении в структуру произойдет ошибка. В таких случаях проанализируем ситуацию и используем Соответствие (Map), передав во второй параметр значение Истина:


// Чтение в Соответствие для поддержки любых имен ключей
Результат = ПрочитатьJSON(Чтение, Истина);

Разбор вложенных данных и заполнение таблицы

Когда мы получили результат (обычно это Массив структур или соответствий), нам нужно вывести его содержимое в таблицу (например, в ТаблицуЗначений или ДанныеФормыКоллекция). Посмотрим на пример кода, который обходит массив объектов и заполняет строки таблицы:


// Предположим, Результат - это массив, полученный из JSON
Для Каждого ЭлементМассива Из Результат Цикл
    НоваяСтрока = Объект.Товары.Добавить();
    
    // Если структура JSON совпадает с именами колонок таблицы
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМассива);
    
    // Если есть вложенные объекты, обращаемся к ним через точку
    Если ТипЗнч(ЭлементМассива.price) = Тип("Структура") Тогда
        НоваяСтрока.Цена = ЭлементМассива.price.value;
        НоваяСтрока.Валюта = ЭлементМассива.price.currency;
    КонецЕсли;
КонецЦикла;

Рассмотрим подробнее использование метода ЗаполнитьЗначенияСвойств. Это очень эффективный способ, если ключи в JSON совпадают с именами колонок вашей таблицы на форме. Он значительно сокращает объем кода и ускоряет работу программы.

Обработка сложных случаев: даты и пустые значения

Проанализируем еще несколько нюансов, которые часто встречаются на практике:

  1. Даты: Формат JSON не имеет встроенного типа "Дата". Даты обычно передаются как строки в формате ISO. Чтобы 1С автоматически распознала их, можно использовать третий параметр функции ПрочитатьJSON — функцию восстановления. Однако проще всего распарсить дату вручную после получения строки, используя Дата(СтрЗаменить(СтрЗаменить(СтрокаДаты, "T", ""), "Z", "")) или подобные преобразования.
  2. Тип Null: В JSON часто встречается значение null. В 1С при чтении оно превращается в Неопределено. Всегда проверяйте тип значения перед тем, как выполнять с ним арифметические операции или обращаться к его свойствам, чтобы избежать падения системы.
  3. Потоковое чтение: Если вам пришел JSON объемом в несколько сотен мегабайт, метод ПрочитатьJSON "съест" всю оперативную память. В таких случаях разберем использование объекта ЧтениеJSON в цикле: Пока Чтение.Прочитать() Цикл ... КонецЦикла. Это позволит обрабатывать данные последовательно, не загружая весь файл целиком.

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

← На главную