Как загрузить массив из JSON в табличную часть 1С без лишних усилий?

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

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

Постановка задачи

Предположим, мы получаем от веб-сервиса массив структур следующего вида:


[
    {
        "id": 4,
        "name": "Без ОПФ",
        "legalForm": 1,
        "legalFormName": "ЮрЛицо"
    },
    {
        "id": 5,
        "name": "ООО",
        "legalForm": 1,
        "legalFormName": "ЮрЛицо"
    }
]

В нашей конфигурации имеется табличная часть ТЧСправочникФормЛиц с реквизитами, чьи идентификаторы полностью совпадают с ключами в JSON (id, name, legalForm, legalFormName). Наша цель — загрузить эти данные с минимальным количеством строк кода.

Основное решение: Использование метода ЗаполнитьЗначенияСвойств

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

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


// Предположим, Переменная ответWEB уже содержит десериализованный массив структур
Для Каждого ЭлементИзJSON Из ответWEB Цикл         
    НоваяСтрока = Объект.ТЧСправочникФормЛиц.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементИзJSON); 
КонецЦикла;

В данном фрагменте мы обходим массив ответWEB. На каждой итерации создаем новую строку в табличной части с помощью метода Добавить. Функция ЗаполнитьЗначенияСвойств берет на себя всю рутину по копированию данных: если в структуре есть ключ name и в табличной части есть колонка name, данные будут перенесены автоматически.

Почему нельзя использовать метод Загрузить() напрямую?

Часто возникает вопрос: существует ли метод вроде ТабличнаяЧасть.ЗагрузитьИзJSON()? К сожалению, на текущий момент в платформе такого «магического» метода нет. Это связано со строгой типизацией табличных частей. JSON по своей природе слаботипизирован, в то время как реквизиты 1С имеют четко заданные типы (Число, Строка, Дата, Ссылка). Промежуточный обход в цикле необходим платформе для корректного приведения типов.

Ранее предлагались схемы типа JSON -> Массив структур -> Таблица значений -> Табличная часть. Проанализируем этот путь: метод ТЧ.Загрузить(ТаблицаЗначений) работает быстро, но требует предварительного создания и заполнения таблицы значений. Как показывает практика, прямое добавление строк в ТЧ (как в примере выше) работает эффективнее, так как исключает лишний этап копирования данных в промежуточную таблицу значений в памяти.

Обработка больших объемов данных (Потоковое чтение)

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

В таких ситуациях мы рекомендуем использовать объект ЧтениеДанныхJSON. Разберем, как организовать потоковую обработку:

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

Этот подход гарантирует минимальное потребление ресурсов, так как в памяти одновременно находится только один объект из массива.

Важные нюансы при работе с типами данных

Использование ЗаполнитьЗначенияСвойств эффективно, но имеет свои границы, о которых важно помнить:

Использование XDTO для автоматизации

Выясним причину, по которой иногда стоит выбрать более сложный путь через XDTO. Если структура JSON сложная и иерархичная, вы можете создать в конфигурации XDTO-пакет, описывающий эту структуру. Метод ФабрикаXDTO.ПрочитатьJSON() позволит десериализовать данные в объект XDTO. Это дает преимущество в виде проверки валидности данных еще на этапе чтения, хотя для заполнения табличной части всё равно потребуется цикл.

Заключение

Подводя итог, можно сказать, что для большинства повседневных задач по интеграции наиболее оптимальным является использование цикла Для Каждого в сочетании с методом ЗаполнитьЗначенияСвойств. Это обеспечивает баланс между скоростью разработки и производительностью системы. Помните о типах данных и используйте потоковое чтение для больших файлов, чтобы ваши решения оставались стабильными и быстрыми.

← На главную