Как записать в JSON массив из структур в 1С?

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

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

Базовый способ: сериализация массива структур в файл

В платформе 1С объект типа Массив напрямую транслируется в JSON-массив [...], а объект Структура — в JSON-объект {...}. Чтобы получить массив объектов, достаточно создать массив и наполнить его структурами.

Обратим внимание на важное правило разработки: не следует называть переменные именами типов платформы (например, Структура = Новый Структура;). Рекомендуется использовать осмысленные имена, такие как ДанныеСотрудника или ЭлементДанных.

Рассмотрим пример формирования файла со списком физических лиц:


ИмяФайлаВыгрузки = КаталогВременныхФайлов() + "Сотрудники.json";

// 1. Формируем массив и наполняем его структурами
МассивДанных = Новый Массив;

// Первый сотрудник
ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить("ФИО", "Иванов Иван Иванович");
ДанныеСотрудника.Вставить("Должность", "Инженер");
ДанныеСотрудника.Вставить("Город", "Москва");
МассивДанных.Добавить(ДанныеСотрудника);

// Второй сотрудник
ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить("ФИО", "Сидоров Сидор Сидорович");
ДанныеСотрудника.Вставить("Должность", "Слесарь");
ДанныеСотрудника.Вставить("Город", "Санкт-Петербург");
МассивДанных.Добавить(ДанныеСотрудника);

// 2. Инициализируем запись JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);
ЗаписьJSON.ОткрытьФайл(ИмяФайлаВыгрузки, , , ПараметрыЗаписи);

// 3. Сериализуем коллекцию целиком
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
ЗаписьJSON.Закрыть();

Формирование JSON-строки в оперативной памяти

Если результат выгрузки требуется передать в HTTP-запрос или сохранить в строковую переменную без создания временного файла на диске, используем метод УстановитьСтроку() объекта ЗаписьJSON.

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


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

ЗаписатьJSON(ЗаписьJSON, МассивДанных);

РезультатСтрокой = ЗаписьJSON.Закрыть();

Использование Соответствия для ключей со спецсимволами

Проанализируем частую проблему: имена свойств в объекте Структура должны строго следовать правилам идентификаторов 1С (не могут содержать дефисы, пробелы или спецсимволы). Если внешний API ожидает ключи вида first-name или user_id, используем коллекцию Соответствие.

Разберем пример:


МассивДанных = Новый Массив;

Данные = Новый Соответствие;
Данные.Вставить("user-name", "Иванов Иван");
Данные.Вставить("user-role", "admin");

МассивДанных.Добавить(Данные);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
Результат = ЗаписьJSON.Закрыть();

Потоковая запись для больших объемов данных

Если необходимо выгрузить выборку из сотен тысяч строк (например, из результата запроса), сборка одного огромного массива в оперативной памяти приведет к повышенной нагрузке и перерасходу RAM. В этом случае применяем потоковую запись с помощью низкоуровневых методов.

Разберем по шагам потоковый алгоритм:

  1. Открываем файл или строковый буфер записи.
  2. Вызываем метод ЗаписатьНачалоМассива().
  3. В цикле обхода выборки данных формируем структуры для каждого элемента и записываем их через ЗаписатьJSON().
  4. После завершения цикла вызываем метод ЗаписатьКонецМассива() и закрываем запись.

Посмотрим на реализацию потоковой выгрузки:


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ИмяФайлаВыгрузки);

// Начинаем JSON-массив
ЗаписьJSON.ЗаписатьНачалоМассива();

// В цикле обхода данных записываем каждый объект порционно
Пока Выборка.Следующий() Цикл
    Элемент = Новый Структура;
    Элемент.Вставить("ФИО", Выборка.ФИО);
    Элемент.Вставить("Должность", Выборка.Должность);
    
    ЗаписатьJSON(ЗаписьJSON, Элемент);
КонецЦикла;

// Закрываем JSON-массив
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.Закрыть();

Особенности сериализации типов данных 1С

При выгрузке структур в JSON важно учитывать правила преобразования типов:

  1. Ссылочные типы: объекты типа СправочникСсылка или ДокументСсылка не сериализуются напрямую. Их необходимо предварительно приводить к строковому представлению (Строка(Ссылка)) либо передавать их уникальный идентификатор (Строка(Ссылка.УникальныйИдентификатор())).
  2. Формат дат: в объекте ПараметрыЗаписиJSON можно настроить стандарт форматирования даты, передав параметр ФорматСериализацииДатыJSON.ISO.
  3. Компактность: отключение переноса строк через ПереносСтрокJSON.Нет сокращает объем передаваемых данных по сети.
← На главную