При попытке организовать обмен данными между информационными базами с помощью HTTP-сервисов и формата JSON многие разработчики сталкиваются с ошибками сериализации. Основная проблема заключается в том, что стандартная сериализация объектов 1С пытается сохранить внутренние ссылки, которые теряют смысл при переносе в другую базу данных. Разберем по шагам, как избежать ошибок и построить надежный механизм обмена.
Когда вы используете СериализаторXDTO.ЗаписатьJSON для передачи ссылки на документ, 1С включает в JSON системный идентификатор (ссылку). Если в базе-получателе объекта с таким же идентификатором нет, система выдает ошибку «Объект не найден». Кроме того, попытка сериализовать набор документов через обычный цикл с записью в один файл без формирования структуры массива приводит к созданию некорректного JSON-файла, который невозможно десериализовать.
Если вам необходимо отправить несколько объектов, лучшим подходом будет сначала собрать ссылки на них в Массив, а затем сериализовать этот массив как единое целое. Это обеспечит создание валидного JSON-контейнера.
// Пример формирования массива для отправки
Выборка = Запрос.Выполнить().Выбрать();
МассивJSON = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивJSON.Добавить(Выборка.Ссылка);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивJSON, НазначениеТипаXML.Явное);
СтрокаJSON = ЗаписьJSON.Закрыть();
Однако помните: этот метод эффективен только в том случае, если базы связаны единым планом обмена или имеют идентичную структуру ссылок, что на практике встречается редко.
Для надежного обмена между разными базами рекомендуется передавать не ссылки на объекты, а их «сырые» данные: значения реквизитов, даты, суммы, табличные части. Рассмотрим, как это реализовать через Структуру:
Структуру, содержащую нужные вам поля документа.ЗаписатьJSON.
// Формирование данных для отправки
ДанныеОбмен = Новый Структура;
ДанныеОбмен.Вставить("Название", Выборка.Название);
ДанныеОбмен.Вставить("Дата", Выборка.Дата);
// Табличная часть как массив структур
ДанныеОбменТЧ = Новый Массив;
// Заполнение массива...
ДанныеОбмен.Вставить("ТабЧасть", ДанныеОбменТЧ);
МассивОбмен.Добавить(ДанныеОбмен);
// Сериализация
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивОбмен);
СтрокаДляОтвета = ЗаписьJSON.Закрыть();
Чтобы ваш HTTP-обмен работал стабильно и не вызывал зависаний сервера, придерживайтесь следующих правил:
ПолучитьОбъект() или НайтиПоНомеру() внутри цикла. Выбирайте все необходимые данные (включая данные табличных частей) одним сложным Запросом.HTTP-сервис должен возвращать ответ, в котором указано, какие документы загружены успешно, а какие вызвали ошибку. Это позволит вам оперативно отслеживать состояние обмена.ПланыОбмена. Он автоматически отслеживает изменения и минимизирует объем передаваемых данных.Подводя итог, можно сказать, что передача данных через JSON-структуры является наиболее гибким и устойчивым методом. Он избавляет вас от проблем с несовпадением внутренних ссылок и позволяет четко контролировать, какая именно информация передается в другую базу.