При интеграции 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С.Рассмотрим два основных способа решения этой задачи.
Этот метод является наиболее предпочтительным, так как он более наглядный, читаемый и простой в отладке. Мы сначала создаем вложенную структуру данных с помощью привычных объектов 1С, а затем одной командой преобразуем (сериализуем) ее в JSON-строку.
Разберем процесс по шагам, двигаясь от самых вложенных элементов к внешним.
{"coordinates": [...]}. В 1С это будет Структура с одним ключом "coordinates", значением которого будет созданный на предыдущем шаге массив."route_points" содержит все наши точки. Создадим для этого Массив и добавим в него структуры точек.Структуру с ключом "route_points" и значением в виде массива из шага 3.Запись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);
Этот подход очень гибок. Если вам нужно добавить больше точек, вы просто в цикле создаете новые СтруктураТочки и добавляете их в МассивТочекМаршрута.
Этот способ является низкоуровневым и дает полный контроль над процессом генерации 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) — это мощный инструмент для особых случаев, когда требуется максимальный контроль и производительность.