При интеграции 1С со сторонними веб-сервисами, мобильными приложениями и сайтами часто возникает задача выгрузить список однотипных записей (например, список сотрудников, номенклатуры или заказов) в виде массива объектов JSON. Разберем по шагам, как правильно сформировать и сериализовать такую структуру данных в платформе 1С:Предприятие 8.3.
В платформе 1С объект типа Массив напрямую транслируется в JSON-массив [...], а объект Структура — в JSON-объект {...}. Чтобы получить массив объектов, достаточно создать массив и наполнить его структурами.
Обратим внимание на важное правило разработки: не следует называть переменные именами типов платформы (например, Структура = Новый Структура;). Рекомендуется использовать осмысленные имена, такие как ДанныеСотрудника или ЭлементДанных.
Рассмотрим пример формирования файла со списком физических лиц:
ИмяФайлаВыгрузки = КаталогВременныхФайлов() + "Сотрудники.json";
// 1. Формируем массив и наполняем его структурами
МассивДанных = Новый Массив;
// Первый сотрудник
ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить("ФИО", "Иванов Иван Иванович");
ДанныеСотрудника.Вставить("Должность", "Инженер");
ДанныеСотрудника.Вставить("Город", "Москва");
МассивДанных.Добавить(ДанныеСотрудника);
// Второй сотрудник
ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить("ФИО", "Сидоров Сидор Сидорович");
ДанныеСотрудника.Вставить("Должность", "Слесарь");
ДанныеСотрудника.Вставить("Город", "Санкт-Петербург");
МассивДанных.Добавить(ДанныеСотрудника);
// 2. Инициализируем запись JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);
ЗаписьJSON.ОткрытьФайл(ИмяФайлаВыгрузки, , , ПараметрыЗаписи);
// 3. Сериализуем коллекцию целиком
Записать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. В этом случае применяем потоковую запись с помощью низкоуровневых методов.
Разберем по шагам потоковый алгоритм:
ЗаписатьНачалоМассива().ЗаписатьJSON().ЗаписатьКонецМассива() и закрываем запись.Посмотрим на реализацию потоковой выгрузки:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ИмяФайлаВыгрузки);
// Начинаем JSON-массив
ЗаписьJSON.ЗаписатьНачалоМассива();
// В цикле обхода данных записываем каждый объект порционно
Пока Выборка.Следующий() Цикл
Элемент = Новый Структура;
Элемент.Вставить("ФИО", Выборка.ФИО);
Элемент.Вставить("Должность", Выборка.Должность);
ЗаписатьJSON(ЗаписьJSON, Элемент);
КонецЦикла;
// Закрываем JSON-массив
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.Закрыть();
При выгрузке структур в JSON важно учитывать правила преобразования типов:
СправочникСсылка или ДокументСсылка не сериализуются напрямую. Их необходимо предварительно приводить к строковому представлению (Строка(Ссылка)) либо передавать их уникальный идентификатор (Строка(Ссылка.УникальныйИдентификатор())).ПараметрыЗаписиJSON можно настроить стандарт форматирования даты, передав параметр ФорматСериализацииДатыJSON.ISO.ПереносСтрокJSON.Нет сокращает объем передаваемых данных по сети.