Как правильно сериализовать несколько документов в JSON для передачи через HTTP-сервис в 1С?

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

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

Почему возникают ошибки при сериализации?

Когда вы используете СериализаторXDTO.ЗаписатьJSON для передачи ссылки на документ, 1С включает в JSON системный идентификатор (ссылку). Если в базе-получателе объекта с таким же идентификатором нет, система выдает ошибку «Объект не найден». Кроме того, попытка сериализовать набор документов через обычный цикл с записью в один файл без формирования структуры массива приводит к созданию некорректного JSON-файла, который невозможно десериализовать.

Решение 1: Использование массива для группы документов

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


// Пример формирования массива для отправки
Выборка = Запрос.Выполнить().Выбрать();
МассивJSON = Новый Массив;
Пока Выборка.Следующий() Цикл
    МассивJSON.Добавить(Выборка.Ссылка);
КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивJSON, НазначениеТипаXML.Явное);
СтрокаJSON = ЗаписьJSON.Закрыть();

Однако помните: этот метод эффективен только в том случае, если базы связаны единым планом обмена или имеют идентичную структуру ссылок, что на практике встречается редко.

Решение 2: Передача данных через структуры (Рекомендуемый подход)

Для надежного обмена между разными базами рекомендуется передавать не ссылки на объекты, а их «сырые» данные: значения реквизитов, даты, суммы, табличные части. Рассмотрим, как это реализовать через Структуру:

  1. Формирование структуры: На стороне отправителя создайте Структуру, содержащую нужные вам поля документа.
  2. Сериализация данных: Преобразуйте массив структур в строку JSON с помощью ЗаписатьJSON.
  3. Обработка на стороне получателя: Получив строку JSON, распарсьте её обратно в структуру и произведите поиск объекта в базе-приемнике по бизнес-ключам (артикул, код, номер документа).

// Формирование данных для отправки
ДанныеОбмен = Новый Структура;
ДанныеОбмен.Вставить("Название", Выборка.Название);
ДанныеОбмен.Вставить("Дата", Выборка.Дата);

// Табличная часть как массив структур
ДанныеОбменТЧ = Новый Массив;
// Заполнение массива...

ДанныеОбмен.Вставить("ТабЧасть", ДанныеОбменТЧ);
МассивОбмен.Добавить(ДанныеОбмен);

// Сериализация
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивОбмен);
СтрокаДляОтвета = ЗаписьJSON.Закрыть();

Важные советы по оптимизации обмена

Чтобы ваш HTTP-обмен работал стабильно и не вызывал зависаний сервера, придерживайтесь следующих правил:

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

← На главную