При необходимости интеграции с маркетплейсами, такими как Ozon, часто возникает задача формирования XML- или YML-фидов для передачи информации об остатках и ценах. В системе 1С для этих целей предусмотрены встроенные средства, позволяющие достаточно гибко и эффективно генерировать файлы требуемого формата. В рамках этой статьи мы с вами разберем, как правильно использовать объект ЗаписьXML для создания таких фидов, а также рассмотрим нюансы, связанные с форматированием и спецификой работы с Ozon.
Прежде всего, давайте проясним фундаментальное различие между атрибутами элемента и текстовыми узлами. В XML/YML данные могут быть представлены двумя основными способами:
<offer id="0102045000000" price="25459">. Здесь id и price — это атрибуты элемента offer. Значения атрибутов всегда заключаются в кавычки.<price>9760</price>. Здесь 9760 является текстовым содержимым элемента price.Для генерации XML-файлов в 1С мы будем использовать объект ЗаписьXML. Он предоставляет удобные методы для последовательного создания элементов, атрибутов и текстового содержимого.
Возникает вопрос, как создать именно текстовый узел, а не атрибут, используя ЗаписьXML. Давайте разберем это на примере, который вызывает затруднения у многих начинающих:
Чтобы сформировать конструкцию <price>9760</price>, нам потребуется последовательность из трех методов объекта ЗаписьXML:
ЗаписатьНачалоЭлемента("price"): Открывает тег элемента price.ЗаписатьТекст(9760): Записывает текстовое содержимое внутри открытого тега.ЗаписатьКонецЭлемента(): Закрывает ранее открытый тег price.Рассмотрим полный пример формирования элемента offer с атрибутом id и вложенным элементом price, содержащим текстовое значение:
ЗаписьXML = Новый ЗаписьXML;
// Дополнительная настройка ЗаписьXML будет рассмотрена далее
// ЗаписьXML.ОткрытьФайл("C:\feed.xml", Параметры);
ЗаписьXML.ЗаписатьНачалоЭлемента("offer");
ЗаписьXML.ЗаписатьАтрибут("id", "АРТИКУЛ_В_ЛК"); // Это атрибут
ЗаписьXML.ЗаписатьНачалоЭлемента("price"); // Открываем тег price
ЗаписьXML.ЗаписатьТекст(9760); // Записываем его текстовое значение
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем тег price
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем тег offer
В этом примере ЗаписатьАтрибут("id", "АРТИКУЛ_В_ЛК") создает атрибут id со значением "АРТИКУЛ_В_ЛК", а комбинация ЗаписатьНачалоЭлемента, ЗаписатьТекст, ЗаписатьКонецЭлемента создает вложенный текстовый узел price.
XMLСтрока()При записи числовых значений, особенно цен и остатков, важно убедиться, что они будут представлены в XML без лишних символов (например, пробелов) и с корректным десятичным разделителем. Хотя метод ЗаписатьТекст() обычно хорошо справляется с числами, для большей надежности и однозначности рекомендуется использовать функцию XMLСтрока() для преобразования чисел в строку, которая уже готова для XML.
Например, для записи цены 1234.50:
Цена = 1234.50;
ЗаписьXML.ЗаписатьНачалоЭлемента("price");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Цена)); // XMLСтрока(1234.50) вернет "1234.5"
ЗаписьXML.ЗаписатьКонецЭлемента(); // price
Обратите внимание, что Ozon, как и большинство XML-стандартов, ожидает десятичный разделитель в виде точки. Функция XMLСтрока() корректно форматирует числа для XML, используя точку в качестве разделителя, что подходит для требований маркетплейса.
Часто возникает желание, чтобы генерируемый XML-файл был удобочитаемым, то есть имел отступы и переносы строк (так называемую «лесенку»). По умолчанию ЗаписьXML формирует файл одной сплошной строкой, что затрудняет ручной анализ. Для включения форматирования необходимо использовать объект ПараметрыЗаписиXML при открытии файла.
Рассмотрим, как это сделать:
ПараметрыЗаписиXML.Истина – это включает форматирование с отступами.Символы.Таб для табуляции или " " для пробелов.Пример инициализации ЗаписьXML с форматированием:
ЗаписьXML = Новый ЗаписьXML;
// Создаем параметры записи с форматированием
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Символы.Таб);
// Открываем файл для записи, передавая настроенные параметры
ЗаписьXML.ОткрытьФайл("C:\МойФидДляOzon.xml", Параметры);
// Далее идет код для записи элементов и атрибутов, как описано выше
// ...
ЗаписьXML.Закрыть();
После использования этих параметров, сгенерированный XML-файл будет содержать отступы, делая его гораздо более читабельным.
YML (Yet another Markup Language) — это стандарт Яндекса, который Ozon использует для приема товарных фидов, но со своими особенностями и обязательными элементами. Хотя YML — это подмножество XML, важно соблюдать его специфическую структуру.
Основные обязательные узлы YML-фида для Ozon, которые мы должны сформировать:
<?xml version="1.0" encoding="UTF-8"?>. ЗаписьXML автоматически добавляет его при вызове ЗаписатьОбъявлениеXML().yml_catalog: Должен содержать атрибут date с текущей датой и временем в формате ГГГГ-ММ-ДД ЧЧ:ММ.shop: Внутри него описывается магазин. Обязательно включает:
<name>: Название магазина.<company>: Официальное название компании (ИП или ООО).<currencies>: Блок с описанием валют. Обычно достаточно одной валюты, например: <currency id="RUR" rate="1"/>.categories: Список категорий. Даже если вы передаете только остатки и цены, этот блок должен присутствовать, хотя бы пустым. Если у вас есть категории, они будут выглядеть так: <category id="1">Одежда</category>.offers: Здесь описываются непосредственно товары, их цены и остатки. Каждый товар представлен элементом <offer>.Давайте рассмотрим комплексный пример формирования полного YML-фида для Ozon, включающего все необходимые элементы:
&НаКлиенте
Процедура СформироватьYMLФидДляOzon()
ПутьКФайлу = "C:\OzonFeed.xml"; // Укажите желаемый путь к файлу
Попытка
ЗаписьXML = Новый ЗаписьXML;
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Символы.Таб);
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, Параметры);
// 1. Заголовок XML
ЗаписьXML.ЗаписатьОбъявлениеXML();
// 2. Корневой элемент yml_catalog
ЗаписьXML.ЗаписатьНачалоЭлемента("yml_catalog");
ЗаписьXML.ЗаписатьАтрибут("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:mm"));
// 3. Элемент <shop>
ЗаписьXML.ЗаписатьНачалоЭлемента("shop");
ЗаписьXML.ЗаписатьНачалоЭлемента("name");
ЗаписьXML.ЗаписатьТекст("Мой_Магазин_На_Озоне");
ЗаписьXML.ЗаписатьКонецЭлемента(); // name
ЗаписьXML.ЗаписатьНачалоЭлемента("company");
ЗаписьXML.ЗаписатьТекст("ООО \"Пример\"");
ЗаписьXML.ЗаписатьКонецЭлемента(); // company
ЗаписьXML.ЗаписатьНачалоЭлемента("currencies");
ЗаписьXML.ЗаписатьНачалоЭлемента("currency");
ЗаписьXML.ЗаписатьАтрибут("id", "RUR");
ЗаписьXML.ЗаписатьАтрибут("rate", "1");
ЗаписьXML.ЗаписатьКонецЭлемента(); // currency
ЗаписьXML.ЗаписатьКонецЭлемента(); // currencies
// 4. Элемент <categories>
ЗаписьXML.ЗаписатьНачалоЭлемента("categories");
// Если у вас есть категории, добавляйте их здесь
// ЗаписьXML.ЗаписатьНачалоЭлемента("category");
// ЗаписьXML.ЗаписатьАтрибут("id", "1");
// ЗаписьXML.ЗаписатьТекст("Электроника");
// ЗаписьXML.ЗаписатьКонецЭлемента(); // category
ЗаписьXML.ЗаписатьКонецЭлемента(); // categories
// 5. Блок <offers> - основной блок с товарами, ценами и остатками
ЗаписьXML.ЗаписатьНачалоЭлемента("offers");
// Пример формирования одного товара (offer)
// В реальной ситуации здесь будет цикл по вашим товарам
Для Каждого СтрокаТовара Из ПолучитьДанныеДляФида() Цикл // Предполагаем, что есть функция, возвращающая данные
ЗаписьXML.ЗаписатьНачалоЭлемента("offer");
ЗаписьXML.ЗаписатьАтрибут("id", СтрокаТовара.Артикул); // Уникальный идентификатор товара в вашей системе
// Цена товара
ЗаписьXML.ЗаписатьНачалоЭлемента("price");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(СтрокаТовара.Цена));
ЗаписьXML.ЗаписатьКонецЭлемента(); // price
// Количество остатка. Ozon может использовать различные теги для остатков,
// например, <count> или <stock>. Уточняйте в документации Ozon.
ЗаписьXML.ЗаписатьНачалоЭлемента("count"); // Пример для тега <count>
ЗаписьXML.ЗаписатьТекст(XMLСтрока(СтрокаТовара.Остаток));
ЗаписьXML.ЗаписатьКонецЭлемента(); // count
// Если товар продается поштучно и это указано в YML
// ЗаписьXML.ЗаписатьНачалоЭлемента("unit");
// ЗаписьXML.ЗаписатьАтрибут("value", "шт");
// ЗаписьXML.ЗаписатьАтрибут("unit_id", "1");
// ЗаписьXML.ЗаписатьКонецЭлемента(); // unit
// Для описания товара (обычно в полном YML, не только для остатков/цен)
// ЗаписьXML.ЗаписатьНачалоЭлемента("name");
// ЗаписьXML.ЗаписатьТекст(СтрокаТовара.Наименование);
// ЗаписьXML.ЗаписатьКонецЭлемента(); // name
ЗаписьXML.ЗаписатьКонецЭлемента(); // offer
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // offers
ЗаписьXML.ЗаписатьКонецЭлемента(); // shop
ЗаписьXML.ЗаписатьКонецЭлемента(); // yml_catalog
ЗаписьXML.Закрыть();
Сообщить("YML-фид успешно создан по пути: " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при создании YML-фида: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Пример вспомогательной функции для получения данных (может быть произвольной)
Функция ПолучитьДанныеДляФида()
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Артикул");
ТаблицаДанных.Колонки.Добавить("Наименование");
ТаблицаДанных.Колонки.Добавить("Цена");
ТаблицаДанных.Колонки.Добавить("Остаток");
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Артикул = "00001";
НоваяСтрока.Наименование = "Смартфон Модель X";
НоваяСтрока.Цена = 15000.00;
НоваяСтрока.Остаток = 10;
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Артикул = "00002";
НоваяСтрока.Наименование = "Наушники Беспроводные";
НоваяСтрока.Цена = 3500.50;
НоваяСтрока.Остаток = 25;
Возврат ТаблицаДанных;
КонецФункции
В этом примере мы с вами видим полную структуру, начиная от объявления XML и заканчивая блоком offers с примерами товаров. Вы должны будете заменить функцию ПолучитьДанныеДляФида() на реальный запрос к вашей базе данных 1С, чтобы извлечь актуальные цены и остатки товаров.
Важным аспектом является то, как Ozon обрабатывает YML-фиды. В отличие от некоторых API, где предусмотрены полноценные «песочницы» для тестирования, Ozon не предлагает отдельной тестовой среды для YML-файлов в классическом понимании. Проверка и валидация вашего фида происходят непосредственно в личном кабинете продавца.
Таким образом, после генерации файла в 1С, следующим шагом будет его размещение на доступном сервере и указание ссылки на него в настройках Ozon.
При работе с XML/YML есть несколько дополнительных моментов, которые стоит учесть:
ЧтениеXML, чтобы убедиться в корректности структуры (например, все ли теги закрыты).&, <, >) имеют особое значение и должны быть экранированы. Хорошая новость в том, что метод ЗаписьXML.ЗаписатьТекст() в 1С автоматически выполняет необходимое экранирование, поэтому вам не придется заботиться об этом вручную.ЗаписьXML является вполне достаточным и более легким в освоении решением.Придерживаясь этих рекомендаций и примеров кода, вы сможете успешно реализовать выгрузку YML-фидов для Ozon из вашей системы 1С, обеспечивая актуальность данных о ваших товарах на маркетплейсе.