Как сформировать XML/YML фиды для Ozon с помощью встроенных средств 1С?

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

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

Понимание структуры XML/YML и инструменты 1С

Прежде всего, давайте проясним фундаментальное различие между атрибутами элемента и текстовыми узлами. В XML/YML данные могут быть представлены двумя основными способами:

  1. В виде атрибутов: Это значения, ассоциированные с элементом и записанные внутри его открывающего тега. Например: <offer id="0102045000000" price="25459">. Здесь id и price — это атрибуты элемента offer. Значения атрибутов всегда заключаются в кавычки.
  2. В виде текстовых узлов (дочерних элементов): Это значения, заключенные между открывающим и закрывающим тегами элемента. Например: <price>9760</price>. Здесь 9760 является текстовым содержимым элемента price.

Для генерации XML-файлов в 1С мы будем использовать объект ЗаписьXML. Он предоставляет удобные методы для последовательного создания элементов, атрибутов и текстового содержимого.

Практическое формирование YML-узлов в 1С

Возникает вопрос, как создать именно текстовый узел, а не атрибут, используя ЗаписьXML. Давайте разберем это на примере, который вызывает затруднения у многих начинающих:

Создание элемента с текстовым значением

Чтобы сформировать конструкцию <price>9760</price>, нам потребуется последовательность из трех методов объекта ЗаписьXML:

  1. ЗаписатьНачалоЭлемента("price"): Открывает тег элемента price.
  2. ЗаписатьТекст(9760): Записывает текстовое содержимое внутри открытого тега.
  3. ЗаписатьКонецЭлемента(): Закрывает ранее открытый тег 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 при открытии файла.

Рассмотрим, как это сделать:

  1. Создадим новый объект ПараметрыЗаписиXML.
  2. Укажем кодировку (обычно "UTF-8").
  3. Укажем версию XML ("1.0").
  4. Самое важное: Третий параметр должен быть установлен в Истина – это включает форматирование с отступами.
  5. Опционально можно указать символ отступа, например, Символы.Таб для табуляции или " " для пробелов.

Пример инициализации ЗаписьXML с форматированием:


ЗаписьXML = Новый ЗаписьXML;
// Создаем параметры записи с форматированием
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Символы.Таб);

// Открываем файл для записи, передавая настроенные параметры
ЗаписьXML.ОткрытьФайл("C:\МойФидДляOzon.xml", Параметры);

// Далее идет код для записи элементов и атрибутов, как описано выше
// ...

ЗаписьXML.Закрыть();

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

Общая структура YML-фида для Ozon

YML (Yet another Markup Language) — это стандарт Яндекса, который Ozon использует для приема товарных фидов, но со своими особенностями и обязательными элементами. Хотя YML — это подмножество XML, важно соблюдать его специфическую структуру.

Основные обязательные узлы YML-фида для Ozon, которые мы должны сформировать:

  1. Заголовок XML: <?xml version="1.0" encoding="UTF-8"?>. ЗаписьXML автоматически добавляет его при вызове ЗаписатьОбъявлениеXML().
  2. Корневой элемент yml_catalog: Должен содержать атрибут date с текущей датой и временем в формате ГГГГ-ММ-ДД ЧЧ:ММ.
  3. Элемент shop: Внутри него описывается магазин. Обязательно включает:
    • <name>: Название магазина.
    • <company>: Официальное название компании (ИП или ООО).
    • <currencies>: Блок с описанием валют. Обычно достаточно одной валюты, например: <currency id="RUR" rate="1"/>.
  4. Элемент categories: Список категорий. Даже если вы передаете только остатки и цены, этот блок должен присутствовать, хотя бы пустым. Если у вас есть категории, они будут выглядеть так: <category id="1">Одежда</category>.
  5. Блок 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: тестирование и публикация фида

Важным аспектом является то, как Ozon обрабатывает YML-фиды. В отличие от некоторых API, где предусмотрены полноценные «песочницы» для тестирования, Ozon не предлагает отдельной тестовой среды для YML-файлов в классическом понимании. Проверка и валидация вашего фида происходят непосредственно в личном кабинете продавца.

  1. Тестирование файла: Чтобы проверить сформированный YML-файл, вам необходимо загрузить его в личном кабинете Ozon в разделе «Товары и цены» → «Добавить товары» → «Через шаблон или фид». Система Ozon проверит структуру файла на соответствие своим требованиям и выдаст подробный отчет об ошибках, если таковые имеются. Товары не будут созданы или обновлены автоматически до тех пор, пока вы не подтвердите импорт, что дает вам возможность исправить ошибки.
  2. Публикация фида: YML-фиды для Ozon работают по модели «подтягивания» (pull). Это означает, что вы не отправляете файл напрямую на сервер Ozon POST-запросом. Вместо этого вы должны разместить сформированный XML-файл на своем собственном сервере или в облачном хранилище таким образом, чтобы он был доступен по прямой публичной ссылке (URL). Эту ссылку вы указываете в личном кабинете Ozon. Маркетплейс будет самостоятельно периодически скачивать файл по указанной ссылке (например, раз в 30 минут) для обновления информации об остатках и ценах.

Таким образом, после генерации файла в 1С, следующим шагом будет его размещение на доступном сервере и указание ссылки на него в настройках Ozon.

Дополнительные рекомендации и продвинутые подходы

При работе с XML/YML есть несколько дополнительных моментов, которые стоит учесть:

  1. Валидация XML: Перед загрузкой файла на Ozon рекомендуется проверить его валидность. Вы можете использовать любой онлайн-валидатор XML, либо даже встроенные средства 1С, такие как объект ЧтениеXML, чтобы убедиться в корректности структуры (например, все ли теги закрыты).
  2. Экранирование спецсимволов: Внутри текстовых узлов XML некоторые символы (такие как &, <, >) имеют особое значение и должны быть экранированы. Хорошая новость в том, что метод ЗаписьXML.ЗаписатьТекст() в 1С автоматически выполняет необходимое экранирование, поэтому вам не придется заботиться об этом вручную.
  3. Использование XDTO для сложных структур: Если структура YML-фида становится очень сложной, или вы работаете с другими XML-схемами, где требуется строгая валидация по XSD-схеме, мы можем рассмотреть использование механизмов XDTO в 1С. XDTO позволяет загрузить схему XML (XSD-файл) в конфигурацию 1С, создавать объекты, соответствующие этой схеме, и затем автоматически сериализовать их в XML-файл. Это значительно снижает вероятность ошибок в именах тегов и иерархии, поскольку система контролирует соответствие схеме. Однако для относительно простых фидов, таких как остатки и цены для Ozon, объект ЗаписьXML является вполне достаточным и более легким в освоении решением.

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

← На главную