Как правильно записывать реквизиты элемента в XML в 1С:Предприятие?

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

При работе с обменом данными через XML часто возникают ситуации, когда внешние системы (например, API площадок типа Яндекс.Маркет) предъявляют специфические требования к формату файла. Одной из частых проблем является желание разработчика визуально разделить реквизиты элемента, чтобы они располагались с новой строки, а не были «спрятаны» внутри одного тега XML в виде атрибутов. Давайте разберем, почему это происходит и как правильно решить данную задачу.

Разберемся с природой XML-атрибутов

Когда мы используем метод ЗаписатьАтрибут объекта ЗаписьXML, платформа 1С автоматически помещает данные внутрь открывающего тега элемента. Например:

<item market-sku="21/118-SG" vendorCode="21/118-SG">

Такая запись является полностью валидной с точки зрения стандартов XML. Однако, если ваша задача — сделать файл «читаемым» или удовлетворить жесткие требования стороннего API, которые требуют, чтобы каждый параметр был отдельным узлом, использование атрибутов будет неверным подходом. Атрибуты по своей природе не могут быть выведены с новой строки внутри одного элемента.

Решение: использование вложенных элементов вместо атрибутов

Самый эффективный и правильный способ решить задачу «красивой» записи и соответствия требованиям сторонних систем — это преобразовать реквизиты в дочерние элементы. Вместо того чтобы записывать данные как атрибуты, мы будем открывать новые теги для каждого значения.

Рассмотрим, как реализовать этот подход на практике. Мы создадим специальную вспомогательную процедуру, которая поможет сделать код чище и понятнее.

Пример реализации записи через дочерние элементы

Давайте создадим процедуру, которая будет записывать каждый реквизит как отдельный XML-элемент. Это гарантирует, что каждый параметр будет располагаться на новой строке и иметь собственную структуру:


Процедура ЗаписатьЭлементXML(ЗаписьXML, ИмяРекв, ЗначениеРекв)
    
    // Записываем начало тега с именем реквизита
    ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяРекв);
    
    // Записываем само значение
    ЗаписьXML.ЗаписатьТекст(Строка(ЗначениеРекв));
    
    // Закрываем тег
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры

Теперь в основном цикле формирования файла вместо методов ЗаписатьАтрибут вы будете вызывать эту процедуру. Это позволит получить на выходе структуру следующего вида:


<Элемент>
    <shop-sku>21/118-SG</shop-sku>
    <market-sku>21/118-SG</market-sku>
    <vendorCode>21/118-SG</vendorCode>
</Элемент>

Настройка форматирования

Если вы хотите, чтобы сам файл XML выглядел структурировано (с отступами и переносами), важно помнить, что объект ЗаписьXML по умолчанию создает «минифицированный» код для экономии места. Чтобы получить красивое форматирование, при инициализации записи можно использовать настройки, которые указывают платформе на необходимость добавления символов переноса строки и отступов.

Хотя стандартный метод ЗаписатьXML не всегда идеально форматирует документ «для глаз», использование вложенных элементов, показанное выше, делает файл стандартным и легко читаемым любым парсером. Важное замечание: не пытайтесь добавлять символы переноса строки Символы.ПС вручную через ЗаписатьТекст. Это приведет к нарушению структуры и создаст «сломанный» XML, который не примет ни одна автоматизированная система.

Подведем итоги нашей работы

  1. Откажитесь от использования атрибутов, если логика API требует строчной записи параметров.
  2. Используйте вложенные элементы — это канонический способ представления данных в XML.
  3. Создайте вспомогательную процедуру для записи элементов, чтобы упростить поддержку кода и избежать ошибок при открытии/закрытии тегов.
  4. Помните, что валидность XML важнее его «красоты» для человеческого глаза, но использование вложенных элементов успешно решает обе эти задачи одновременно.

Теперь ваша выгрузка будет полностью соответствовать требованиям Яндекс.Маркета и других систем, а код станет значительно более гибким и понятным для последующей доработки.

← На главную