При разработке интеграций и механизмов обмена данными в 1С разработчики часто сталкиваются с ситуацией, когда попытка записать объект типа Структура с помощью базового метода ЗаписатьXML завершается ошибкой, тогда как объект СериализаторXDTO выполняет аналогичную операцию корректно и без сбоев. Проанализируем, почему возникает такое поведение платформы, как устроены механизмы сериализации и какие альтернативные способы выгрузки коллекций существуют.
Разберем детально, как работают оба механизма сериализации в платформе 1С:Предприятие:
Неопределено, Null, Булево, Число, Строка, Дата), а также Тип, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения, ОписаниеТипов, ссылки и объекты прикладных типов данных (справочники, документы и т.д.), наборы записей регистров. Универсальные коллекции значений (Структура, Соответствие, Массив, ТаблицаЗначений) в этот список не входят, поэтому вызов ЗаписатьXML(ЗаписьXML, Структура1) приводит к ошибке выполнения.СериализаторXDTO опирается на глобальную фабрику XDTO конфигурации и системные пакеты пространства имен http://v8.1c.ru/8.1/data/core. В этих пакетах уже зарегистрированы схемы и описания типов для коллекций платформы, включая тип Structure. Сериализатор умеет автоматически преобразовывать структуру в набор XML-элементов с именами свойств и их значениями.Посмотрим на пример правильной сериализации и последующей десериализации структуры в формате XML с использованием СериализаторXDTO:
// Сериализация структуры в XML-строку
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("КодТовара", "00-001234");
СтруктураДанных.Вставить("Количество", 15);
СтруктураДанных.Вставить("Активен", Истина);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Проверяем возможность сериализации объекта
Если СериализаторXDTO.ВозможностьЗаписиXML(СтруктураДанных) Тогда
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтруктураДанных);
КонецЕсли;
XMLТекст = ЗаписьXML.Закрыть();
// Обратное чтение структуры из XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLТекст);
ВосстановленнаяСтруктура = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Рассмотрим нюансы, на которые следует обращать внимание при работе с XDTO-сериализатором:
COMОбъект или HTTPСоединение), метод СериализаторXDTO.ЗаписатьXML вызовет исключение.СериализаторXDTO.ЗаписатьXML, восстанавливать их необходимо исключительно методом СериализаторXDTO.ПрочитатьXML, так как базовый ПрочитатьXML не сможет распознать тип структуры.В зависимости от архитектурной задачи в 1С можно использовать и другие способы сериализации структур:
ЗаписатьJSON и ПрочитатьJSON нативно поддерживают коллекции 1С без использования XDTO.ЗаписатьXML/ПрочитатьXML, структуру можно предварительно поместить в ХранилищеЗначения, так как этот тип входит в список поддерживаемых базовой сериализацией.ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр, а также ЗначениеВФайл и ЗначениеИзФайла.