Как в 1С сформировать JSON-строку с массивом вложенных структур?

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

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

Целевая JSON-структура, которую нам нужно получить, выглядит следующим образом:


{
    "route_points": [
        {
            "coordinates": [71.40182314019768, 51.13285146954383]
        },
        {
            "coordinates": [71.50529418933989, 51.13162822572868]
        }
    ]
}

Проанализируем эту структуру. В основе лежит объект (обозначается фигурными скобками {}), у которого есть одно свойство — "route_points". Значением этого свойства является массив (обозначается квадратными скобками []). Каждый элемент этого массива — это снова объект {} со свойством "coordinates". А значением "coordinates" является массив [] из двух чисел — долготы и широты.

В платформе 1С есть прямое соответствие между типами данных 1С и JSON:

Рассмотрим два основных способа решения этой задачи.

Способ 1. Использование объектов «Структура» и «Массив»

Этот метод является наиболее предпочтительным, так как он более наглядный, читаемый и простой в отладке. Мы сначала создаем вложенную структуру данных с помощью привычных объектов 1С, а затем одной командой преобразуем (сериализуем) ее в JSON-строку.

Разберем процесс по шагам, двигаясь от самых вложенных элементов к внешним.

  1. Создаем массивы с координатами. Каждая точка — это массив из двух чисел.
  2. Создаем структуры для точек. Каждая точка в JSON — это объект вида {"coordinates": [...]}. В 1С это будет Структура с одним ключом "coordinates", значением которого будет созданный на предыдущем шаге массив.
  3. Объединяем все точки в один массив. Основной массив "route_points" содержит все наши точки. Создадим для этого Массив и добавим в него структуры точек.
  4. Создаем корневую структуру. Весь JSON-документ — это объект. Создадим главную Структуру с ключом "route_points" и значением в виде массива из шага 3.
  5. Преобразуем (сериализуем) в JSON. Используем объекты ЗаписьJSON и процедуру ЗаписатьJSON(), чтобы получить итоговую строку.

Посмотрим на итоговый код, который реализует эти шаги:


// Шаг 1 и 2: Создаем первую точку маршрута
МассивКоординат1 = Новый Массив;
// Важно: координаты лучше передавать как числа, а не строки
МассивКоординат1.Добавить(71.40182314019768);
МассивКоординат1.Добавить(51.13285146954383);

СтруктураТочки1 = Новый Структура;
СтруктураТочки1.Вставить("coordinates", МассивКоординат1);

// Шаг 1 и 2: Создаем вторую точку маршрута
МассивКоординат2 = Новый Массив;
МассивКоординат2.Добавить(71.50529418933989);
МассивКоординат2.Добавить(51.13162822572868);

СтруктураТочки2 = Новый Структура;
СтруктураТочки2.Вставить("coordinates", МассивКоординат2);

// Шаг 3: Создаем общий массив точек маршрута
МассивТочекМаршрута = Новый Массив;
МассивТочекМаршрута.Добавить(СтруктураТочки1);
МассивТочекМаршрута.Добавить(СтруктураТочки2);
// ... сюда можно в цикле добавлять и другие точки

// Шаг 4: Создаем корневую структуру, которая станет корневым объектом JSON
КорневаяСтруктура = Новый Структура("route_points", МассивТочекМаршрута);

// Шаг 5: Сериализуем полученную структуру в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(); 
// Можно также настроить форматирование для читаемости
// ЗаписьJSON.ПробелыВФормате = Истина;

ЗаписатьJSON(ЗаписьJSON, КорневаяСтруктура);
РезультатJSON = ЗаписьJSON.Закрыть();

// Выводим результат
Сообщить(РезультатJSON);

Этот подход очень гибок. Если вам нужно добавить больше точек, вы просто в цикле создаете новые СтруктураТочки и добавляете их в МассивТочекМаршрута.

Способ 2. Прямое формирование JSON через объект «ЗаписьJSON»

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

Важно понимать, что вы должны вызывать методы в строгой последовательности, иначе платформа 1С выдаст ошибку о неверной структуре JSON.

Разберем пример кода для нашей задачи:


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();

// Начинаем корневой объект {}
ЗаписьJSON.ЗаписатьНачалоОбъекта();

    // Записываем имя свойства "route_points"
    ЗаписьJSON.ЗаписатьИмяСвойства("route_points");
    
    // Начинаем массив [] для точек
    ЗаписьJSON.ЗаписатьНачалоМассива();
    
        // --- Первая точка ---
        // Начинаем объект {} для первой точки
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
            // Записываем имя свойства "coordinates"
            ЗаписьJSON.ЗаписатьИмяСвойства("coordinates");
            // Начинаем массив [] для координат
            ЗаписьJSON.ЗаписатьНачалоМассива();
                // Записываем значения координат
                ЗаписьJSON.ЗаписатьЗначение(71.40182314019768);
                ЗаписьJSON.ЗаписатьЗначение(51.13285146954383);
            // Заканчиваем массив координат ]
            ЗаписьJSON.ЗаписатьКонецМассива();
        // Заканчиваем объект первой точки }
        ЗаписьJSON.ЗаписатьКонецОбъекта();
        
        // --- Вторая точка ---
        // Начинаем объект {} для второй точки
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
            ЗаписьJSON.ЗаписатьИмяСвойства("coordinates");
            ЗаписьJSON.ЗаписатьНачалоМассива();
                ЗаписьJSON.ЗаписатьЗначение(71.50529418933989);
                ЗаписьJSON.ЗаписатьЗначение(51.13162822572868);
            ЗаписьJSON.ЗаписатьКонецМассива();
        ЗаписьJSON.ЗаписатьКонецОбъекта();
        
    // Заканчиваем массив точек ]
    ЗаписьJSON.ЗаписатьКонецМассива();

// Заканчиваем корневой объект }
ЗаписьJSON.ЗаписатьКонецОбъекта();

// Получаем итоговую строку
РезультатJSON = ЗаписьJSON.Закрыть();

Сообщить(РезультатJSON);

Как видно, код получается более громоздким. Его стоит использовать, если у вас есть специфические требования к производительности или если структура данных настолько сложна, что ее неудобно описывать через стандартные объекты 1С.

Выводы

Для большинства задач по формированию JSON в 1С первый способ (через Структуру и Массив) является оптимальным. Он обеспечивает высокую читаемость кода, простоту его изменения и поддержки. Второй способ (через ЗаписьJSON) — это мощный инструмент для особых случаев, когда требуется максимальный контроль и производительность.

← На главную