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