При обмене данными через XML часто возникает необходимость передать не только наименование или код объекта, но и его уникальный идентификатор (GUID). В 1С объекты ссылочного типа напрямую не присваиваются текстовым узлам XML-документа, поэтому прямая попытка записать ссылку в текстовое поле приводит к ошибкам или некорректному заполнению. В этой статье мы разберем, как правильно преобразовывать ссылку 1С в символьный GUID для выгрузки в XML и как выполнить обратную операцию — получить ссылку на элемент по его строковому идентификатору.
Рассмотрим ситуацию, когда требуется записать уникальный идентификатор элемента справочника в тег 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-файла считывается строковый GUID вида 870bd7b6-c440-11e2-8061-0022152000cb, и необходимо получить полноценную ссылку на элемент справочника в 1С.
Способ 1. Использование метода ПолучитьСсылку и конструктора УникальныйИдентификатор
Для конкретного справочника мы можем сгенерировать ссылку, сначала создав объект УникальныйИдентификатор из полученной строки, а затем передав его в метод менеджера справочника ПолучитьСсылку():
СтрокаGUID = "870bd7b6-c440-11e2-8061-0022152000cb";
Гуид = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаНоменклатуру = Справочники.Номенклатура.ПолучитьСсылку(Гуид);
Способ 2. Использование функции XMLЗначение
Если требуется универсальный подход без обращения к конкретному менеджеру справочника через точечную нотацию, разберем функцию XMLЗначение():
СсылкаНаНоменклатуру = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID);
Проанализируем ключевые моменты, о которых необходимо помнить при обработке ссылок по GUID:
СсылкаНаНоменклатуру.Наименование) вернут пустые значения без генерации ошибки.СсылкаНаНоменклатуру.ПолучитьОбъект() <> Неопределено или с помощью запроса.УстановитьСсылкуНового():
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаНоменклатуру);
НовыйЭлемент.Наименование = НаименованиеИзXML;
НовыйЭлемент.Записать();
Новый УникальныйИдентификатор() критичен к формату строки. Убедитесь, что в строке отсутствует лишнее обрамление скобками или пробелы. Для надежности перед конвертацией стоит применить функцию СокрЛП().