Как выгрузить ссылку в XML и загрузить ее обратно в 1С

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

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

Выгрузка ссылки в XML в формате GUID

Рассмотрим ситуацию, когда требуется записать уникальный идентификатор элемента справочника в тег XML-документа. Для прямого преобразования ссылочного значения в каноническую строку формата GUID в платформе 1С предусмотрено несколько способов.

Способ 1. Использование функции XMLСтрока

Наиболее simple и платформенно верный метод — применение глобальной функции XMLСтрока(). Она автоматически приводит тип 1С к его XML-представлению.

Посмотрим на пример заполнения DOM-документа:


Пока Выборка.Следующий() Цикл
    TagNomSsil = TagNom.appendChild(DomDocument.createElement("Ref"));
    TagNomSsil.Text = XMLСтрока(Выборка.Ссылка);
    
    TagNomName = TagNom.appendChild(DomDocument.createElement("Наименование"));
    TagNomName.Text = Выборка.Наименование;
КонецЦикла;

Способ 2. Получение УникальногоИдентификатора вручную

Альтернативный вариант — явное обращение к методу ссылки УникальныйИдентификатор() с последующим приведением к строке:


СтрокаGUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
TagNomSsil.Text = СтрокаGUID;

Альтернативный вариант: Использование объекта ЗаписьXML

Если вы работаете с большими объемами данных, использование DOMDocument может приводить к повышенному расходу оперативной памяти. В таких случаях рекомендуем использовать объект ЗаписьXML для потоковой выгрузки:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);

ЗаписьXML.ЗаписатьНачалоЭлемента("Ref");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Выборка.Ссылка));
ЗаписьXML.ЗаписатьКонецЭлемента();

Обратная загрузка: получение ссылки из строки XML

Разберем обратную задачу: из входящего XML-файла считывается строковый GUID вида 870bd7b6-c440-11e2-8061-0022152000cb, и необходимо получить полноценную ссылку на элемент справочника в 1С.

Способ 1. Использование метода ПолучитьСсылку и конструктора УникальныйИдентификатор

Для конкретного справочника мы можем сгенерировать ссылку, сначала создав объект УникальныйИдентификатор из полученной строки, а затем передав его в метод менеджера справочника ПолучитьСсылку():


СтрокаGUID = "870bd7b6-c440-11e2-8061-0022152000cb";
Гуид = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаНоменклатуру = Справочники.Номенклатура.ПолучитьСсылку(Гуид);

Способ 2. Использование функции XMLЗначение

Если требуется универсальный подход без обращения к конкретному менеджеру справочника через точечную нотацию, разберем функцию XMLЗначение():


СсылкаНаНоменклатуру = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID);

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

Проанализируем ключевые моменты, о которых необходимо помнить при обработке ссылок по GUID:

  1. Метод ПолучитьСсылку не проверяет наличие записи в базе данных: Он просто формирует ссылку с указанным GUID в памяти. Если элемента с таким идентификатором в базе 1С нет, обращение к его реквизитам (например, СсылкаНаНоменклатуру.Наименование) вернут пустые значения без генерации ошибки.
  2. Проверка существования элемента: Чтобы убедиться, что полученная ссылка действительно указывает на существующий объект в базе данных, можно проверить получение объекта через СсылкаНаНоменклатуру.ПолучитьОбъект() <> Неопределено или с помощью запроса.
  3. Создание нового элемента с заданным GUID: Если элемента в базе не оказалось и его требуется создать на основе данных из XML, сохраняя исходный GUID, используем метод УстановитьСсылкуНового():
    
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаНоменклатуру);
    НовыйЭлемент.Наименование = НаименованиеИзXML;
    НовыйЭлемент.Записать();
    
  4. Формат строки GUID: Конструктор Новый УникальныйИдентификатор() критичен к формату строки. Убедитесь, что в строке отсутствует лишнее обрамление скобками или пробелы. Для надежности перед конвертацией стоит применить функцию СокрЛП().
← На главную