Часто в процессе разработки обменов данными или интеграций возникает необходимость передать ссылку на объект (например, на СправочникСсылка.Номенклатура) в формате XML. При попытке сделать это напрямую многие сталкиваются с тем, что стандартные методы возвращают лишь строковый идентификатор GUID или требуют утомительного ручного разбора данных. Давайте разберем, как решить эту задачу профессионально и избежать распространенных ошибок.
Самым правильным и надежным способом работы с 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Значение(Тип(ТипСтрокой), Идентификатор);
КонецФункции
При работе с сериализацией ссылок важно учитывать несколько ключевых моментов:
ЗначениеВСтрокуВнутр(): Этот метод предназначен исключительно для внутренних нужд платформы. Его формат может меняться от версии к версии, и он не пригоден для передачи данных во внешние системы.XMLЗначение требует тип?: Функции XMLЗначение() необходимо знать целевой тип, так как XML-файл сам по себе хранит лишь текстовые данные. Без указания типа 1С не может автоматически определить, какой именно объект нужно создать в базе данных.ТипЗнч() и XMLТипЗнч(): Эти методы позволяют динамически определить тип ссылки в процессе выполнения кода, что делает вашу процедуру обмена универсальной для разных справочников или документов.GUID как отдельные поля (например, в JSON). Это избавляет от необходимости парсить строки и повышает отказоустойчивость обмена.Подводя итог, можно сказать, что выбор способа зависит от ваших целей. Если вы строите стандартный обмен между базами 1С — используйте СериализаторXDTO. Если же вам нужен кастомный формат для передачи данных в стороннее API — лучше комбинировать метаданные типа и идентификатор GUID, как показано в примере с ручной сборкой строки.