Как правильно сериализовать и десериализовать ссылку в XML в 1С?

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

Часто в процессе разработки обменов данными или интеграций возникает необходимость передать ссылку на объект (например, на СправочникСсылка.Номенклатура) в формате XML. При попытке сделать это напрямую многие сталкиваются с тем, что стандартные методы возвращают лишь строковый идентификатор GUID или требуют утомительного ручного разбора данных. Давайте разберем, как решить эту задачу профессионально и избежать распространенных ошибок.

Использование Сериализатора XDTO

Самым правильным и надежным способом работы с XML в 1С является использование объекта СериализаторXDTO. Этот механизм автоматически учитывает метаданные системы, что позволяет корректно сериализовать любые типы данных. Рассмотрим, как это работает на практике.

Для записи ссылки в строку XML используйте следующий алгоритм:


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

При таком подходе платформа сама формирует пространство имен и структуру, включая тип объекта. Для обратной операции — чтения ссылки из XML — используйте метод ПрочитатьXML:


ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(СтрокаXML);
ВосстановленнаяСсылка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

Создание собственного строкового формата

Если специфика вашей задачи требует передачи ссылки в компактном виде (например, в одну строку типа CatalogRef.Номенклатура.95a99866-...), вы можете реализовать функции конвертации самостоятельно. Для этого нам понадобятся функции XMLТипЗнч(), XMLСтрока() и XMLЗначение().

Рассмотрим реализацию функций для упаковки и распаковки ссылки:


// Функция для получения строкового представления ссылки
Функция СсылкаВXML(Ссылка)
    Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
        Возврат "";
    КонецЕсли;
    Возврат XMLТипЗнч(Ссылка).ИмяТипа + "." + XMLСтрока(Ссылка);
КонецФункции

// Функция для восстановления ссылки из строки
Функция СсылкаИзXML(СтрокаXML)
    Если СтрокаXML = "" Тогда
        Возврат Неопределено;
    КонецЕсли;
    // Разделяем тип и идентификатор
    Поз = Найти(СтрокаXML, ".");
    ТипСтрокой = Лев(СтрокаXML, Поз - 1);
    Идентификатор = Сред(СтрокаXML, Поз + 1);
    
    // Используем XMLЗначение для восстановления
    Возврат XMLЗначение(Тип(ТипСтрокой), Идентификатор);
КонецФункции

Важные нюансы и советы

При работе с сериализацией ссылок важно учитывать несколько ключевых моментов:

  1. Не используйте ЗначениеВСтрокуВнутр(): Этот метод предназначен исключительно для внутренних нужд платформы. Его формат может меняться от версии к версии, и он не пригоден для передачи данных во внешние системы.
  2. Почему XMLЗначение требует тип?: Функции XMLЗначение() необходимо знать целевой тип, так как XML-файл сам по себе хранит лишь текстовые данные. Без указания типа 1С не может автоматически определить, какой именно объект нужно создать в базе данных.
  3. Использование ТипЗнч() и XMLТипЗнч(): Эти методы позволяют динамически определить тип ссылки в процессе выполнения кода, что делает вашу процедуру обмена универсальной для разных справочников или документов.
  4. Безопасность данных: При передаче данных через HTTP-сервисы старайтесь передавать тип объекта и его GUID как отдельные поля (например, в JSON). Это избавляет от необходимости парсить строки и повышает отказоустойчивость обмена.

Подводя итог, можно сказать, что выбор способа зависит от ваших целей. Если вы строите стандартный обмен между базами 1С — используйте СериализаторXDTO. Если же вам нужен кастомный формат для передачи данных в стороннее API — лучше комбинировать метаданные типа и идентификатор GUID, как показано в примере с ручной сборкой строки.

← На главную