При разработке интеграций и создании HTTP-сервисов на платформе 1С программисты часто сталкиваются с необходимостью передать не просто плоский массив данных, а полноценный объект, содержащий метаданные. Например, помимо самого списка товаров или документов, принимающей стороне часто требуется знать общее количество записей, дату формирования пакета или версию API. Если использовать стандартный СериализаторXDTO для выгрузки массива, мы получим на выходе простой JSON-массив, в который сложно «подмешать» посторонние данные без нарушения структуры.
В этой статье мы подробно разберем, как правильно структурировать данные для СериализаторXDTO, рассмотрим вопросы производительности и научимся формировать сложные JSON-ответы, которые будут легко читаться любыми внешними системами.
Проанализируем базовую задачу: у нас есть массив объектов, и мы хотим добавить к нему поле Количество. Самая распространенная ошибка новичков — пытаться добавить числовое значение прямо в массив с данными. Это приводит к тому, что массив становится «грязным», так как содержит разнородные типы данных, что неудобно для обработки на стороне получателя.
Правильным решением является создание вспомогательного объекта типа Структура. Рассмотрим, как это реализовать на практике:
// 1. Формируем массив с данными из выборки
МассивJSON = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Важно: здесь мы добавляем ссылку или объект
МассивJSON.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
// 2. Создаем структуру-обертку, в которую помещаем наш массив и метаданные
ДанныеОтвета = Новый Структура;
ДанныеОтвета.Вставить("Количество", МассивJSON.Количество());
ДанныеОтвета.Вставить("ДатаФормирования", ТекущаяДата());
ДанныеОтвета.Вставить("Данные", МассивJSON);
// 3. Сериализуем структуру целиком
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ДанныеОтвета);
Результат = ЗаписьJSON.Закрыть();
В результате такого подхода получатель увидит не просто список [...], а объект { "Количество": 10, "ДатаФормирования": "...", "Данные": [...] }. Это позволяет соблюдать стандарты разработки API.
Давайте выясним причину, по которой в данном контексте СериализаторXDTO предпочтительнее стандартного метода ЗаписатьJSON(). Дело в том, что стандартная функция ЗаписатьJSON умеет работать только с примитивными типами данных (строки, числа, булево, даты, массивы и структуры). Если вы попытаетесь передать ей СправочникСсылка или ДокументОбъект, система выдаст ошибку, так как она «не знает», как превратить сложный объект 1С в строку.
Преимущества СериализаторXDTO:
ХранилищеЗначения или УникальныйИдентификатор.Если проект требует строгого соблюдения имен полей (например, если в JSON должны быть дефисы, которые запрещены в именах ключей Структуры 1С), нам следует использовать Фабрику XDTO. Рассмотрим этот алгоритм подробнее:
В дереве метаданных конфигурации можно создать Пакет XDTO. Это дает нам полный контроль над итоговым файлом:
int, а "Данные" — это список объектов определенного типа.total-count или 1c_data, что невозможно сделать через обычную Структуру.Проверить() объекта XDTO позволит убедиться, что вы не забыли заполнить обязательные поля перед отправкой.Проанализируем типичную ошибку в коде, когда в цикле используется Выборка.Ссылка.ПолучитьОбъект(). Для формирования JSON-ответа это крайне неэффективно по нескольким причинам:
ПолучитьОбъект() считывает из базы данных абсолютно все поля объекта, включая табличные части и тяжелые реквизиты, которые могут быть не нужны в ответе.Рекомендация: Если вам нужно передать только набор определенных полей, лучше создать Структуру для каждого элемента массива вручную, заполняя её данными из выборки запроса. Если же нужно передать объект «как есть», СериализаторXDTO прекрасно справляется с типом СправочникСсылка без вызова ПолучитьОбъект().
Рассмотрим ситуацию, когда в ответе нужно передать десятки тысяч элементов. Если мы создадим один гигантский массив в памяти, а затем попытаемся его сериализовать, мы рискуем получить ошибку «Нехватка памяти».
В таких случаях мы применим метод потоковой записи. Разберем по шагам, как это реализовать:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// Записываем начало нашего "объекта-обертки" вручную
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("ОбщееКоличество");
ЗаписьJSON.ЗаписатьЗначение(ВсегоЗаписей);
// Начинаем массив данных
ЗаписьJSON.ЗаписатьИмяСвойства("Данные");
ЗаписьJSON.ЗаписатьНачалоМассива();
Пока Выборка.Следующий() Цикл
// Сериализуем каждый элемент отдельно через XDTO в текущий поток JSON
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Выборка.Ссылка);
КонецЦикла;
// Закрываем массив и основной объект
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
Результат = ЗаписьJSON.Закрыть();
Этот метод позволяет передавать практически неограниченные объемы данных, так как в каждый момент времени в оперативной памяти находится только одна запись, а не весь массив целиком.
Посмотрим на объект ПараметрыЗаписиJSON. Он играет ключевую роль в том, как ваш ответ будет выглядеть для внешнего потребителя. Мы можем настроить:
ТипОбходаУзловJSON.Развернутый, чтобы получить «красивый» JSON с пробелами и переносами строк.Подводя итог, можно сказать, что СериализаторXDTO в сочетании со структурами или ручным управлением потоком ЗаписьJSON предоставляет гибкий и мощный инструмент для формирования ответов любой сложности. Главное — помнить о балансе между удобством разработки и производительностью системы.