Как правильно записать ссылку на организацию в XML-файл в 1С

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

При выгрузке данных из 1С в формат XML начинающие разработчики часто сталкиваются с трудностями при попытке записать ссылочные типы, такие как СправочникСсылка.Организации. Основные проблемы возникают из-за непонимания разницы между атрибутами и элементами XML, а также из-за нюансов преобразования типов данных. В этой статье мы подробно разберем, как избежать ошибки «Несоответствие типов», почему файл может оказаться пустым и какой способ записи является наиболее эффективным.

Разбор типичной ошибки: Атрибут или Элемент?

Рассмотрим ситуацию, когда необходимо получить в XML-файле строку вида: <v8:Организация xsi:type="v8:CatalogRef.Организации">b5eee258...</v8:Организация>. Попытка использовать для этого метод ЗаписатьАтрибут является архитектурной ошибкой. Проанализируем почему.

В терминологии XML атрибут — это дополнительная информация, которая пишется внутри открывающего тега, например: <Организация Тип="Справочник">. То, что требуется получить в задаче — это полноценный элемент (или узел), который имеет имя, префикс пространства имен, атрибуты и текстовое содержимое (GUID).

Для создания такой структуры вручную нам потребуется последовательность команд, а не одна функция. Кроме того, важно помнить, что метод ЗаписатьАтрибут вторым параметром всегда ожидает строку. Если передать туда объект типа СправочникСсылка, система закономерно выдаст ошибку «Несоответствие типов».

Способ 1: Ручное формирование узла через ЗаписьXML

Если мы решим пойти по пути ручного формирования XML, нам необходимо выполнить преобразование ссылки в строковый идентификатор и правильно открыть/закрыть теги. Рассмотрим этот процесс по шагам:

  1. Получение ссылки: Сначала найдем нужный объект. Как справедливо отмечено в обсуждении, лучше использовать поиск по ИНН или Коду, так как поиск по наименованию крайне чувствителен к лишним пробелам или кавычкам.
  2. Извлечение GUID: Сама по себе ссылка в 1С — это сложный объект. Для XML нам нужна его строковая интерпретация в виде уникального идентификатора (UUID).
  3. Запись тегов: Используем методы начала элемента, записи текста и конца элемента.

Посмотрим на пример кода, реализующий этот подход:


// 1. Находим организацию (лучше использовать ИНН)
ОрганизацияСсылка = Справочники.Организации.НайтиПоНаименованию("СНТ ""Металлург-3""");

Если Не ОрганизацияСсылка.Пустая() Тогда
    // 2. Получаем строковое представление GUID
    Идентификатор = Строка(ОрганизацияСсылка.УникальныйИдентификатор());
    
    // 3. Записываем элемент вручную
    ЗаписьXML.ЗаписатьНачалоЭлемента("v8:Организация");
    
    // Если нужно добавить тип как атрибут
    ЗаписьXML.ЗаписатьАтрибут("xsi:type", "v8:CatalogRef.Организации");
    
    // Записываем сам GUID
    ЗаписьXML.ЗаписатьТекст(Идентификатор);
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;

Важный момент: Строка(ОрганизацияСсылка) вернет наименование организации (например, "Металлург-3"), а не её GUID. Чтобы получить именно идентификатор (вроде b5eee258-3e95...), обязательно нужно использовать метод УникальныйИдентификатор().

Способ 2: Использование Сериализатора XDTO (Рекомендуемый)

Проанализируем более современный и надежный метод. В платформе 1С существует встроенный механизм — Сериализатор XDTO. Он специально создан для того, чтобы автоматически преобразовывать объекты 1С в формат XML, соответствующий стандартам платформы.

Этот метод самостоятельно добавит атрибут xsi:type, правильно обработает пространства имен и запишет идентификатор. Это избавляет разработчика от необходимости вручную прописывать каждый тег.

Рассмотрим, как упрощается код при использовании этого подхода:


// Получаем ссылку на организацию
СсылкаНаОбъект = Справочники.Организации.НайтиПоНаименованию("Металлург-3");

// Используем Сериализатор для автоматической записи
// Параметры: ОбъектЗаписи, Ссылка, ИмяУзла, ПространствоИмен
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СсылкаНаОбъект, "Организация", "http://v8.1c.ru/8.1/data/enterprise/current-config");

При таком подходе вероятность совершить ошибку в именах атрибутов или типах данных сводится к минимуму. Платформа сама знает, как должен выглядеть тип v8:CatalogRef.Организации в структуре XML.

Почему файл XML получается пустым?

Выясним причину ситуации, когда код вроде бы выполняется без ошибок, но результирующий файл имеет нулевой размер. Это одна из самых частых проблем при работе с объектом ЗаписьXML.

Дело в том, что запись в файл в 1С происходит через буфер. Данные сначала накапливаются в оперативной памяти и сбрасываются на жесткий диск только при заполнении буфера или при явном закрытии объекта. Если вы забыли вызвать метод Закрыть(), то при завершении работы процедуры объект уничтожается, а данные из буфера так и не записываются в файл.

Всегда используйте следующую структуру при работе с файлами:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\export.xml", "UTF-8");

// ... здесь логика записи данных ...

// Обязательный метод для сохранения данных на диск!
ЗаписьXML.Закрыть(); 

Работа с пространствами имен (Namespaces)

В примере автора сообщения фигурируют префиксы v8: и xsi:. Чтобы XML-файл был валидным и эти префиксы распознавались другими системами, их нужно объявить. Обычно это делается в корневом элементе файла. Если вы используете СериализаторXDTO, он может сделать это автоматически, но при ручной записи стоит использовать метод ЗаписатьСоответствиеПространствИмен.

Проанализируем пример объявления пространств:


ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
ЗаписьXML.ЗаписатьСоответствиеПространствИмен("v8", "http://v8.1c.ru/8.1/data/core");
ЗаписьXML.ЗаписатьСоответствиеПространствИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");

// Теперь можно записывать вложенные элементы с этими префиксами

Подведение итогов

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

  1. Не путайте атрибуты и элементы. Атрибут — внутри тега, элемент — сам тег с содержимым.
  2. Преобразуйте данные в строку. Параметры методов записи XML должны быть строковыми. Для ссылок используйте УникальныйИдентификатор().
  3. Используйте Сериализатор XDTO. Это избавляет от ручного формирования сложных структур и минимизирует ошибки типов.
  4. Проверяйте результат поиска. Перед записью всегда проверяйте, не является ли ссылка пустой (Ссылка.Пустая()), чтобы не выгружать "нулевые" GUID.
  5. Всегда закрывайте запись. Вызов ЗаписьXML.Закрыть() — критически важный этап для физического сохранения файла.

Следуя этим рекомендациям, вы сможете создавать корректные и структурированные XML-файлы, которые будут легко читаться как в 1С, так и во внешних информационных системах.

← На главную