Дубли offer id в YML-фиде: почему пропадают товары и как исправить
В YML есть 1000 товаров, XML открывается без ошибок, но после загрузки часть позиций пропала или вместо смартфона появился ноутбук. Одной из причин могут быть дубли offer id. Проверять их стоит до поисков ошибки в цене, картинках или настройках площадки.
Что такое offer id
id в открывающем теге offer обозначает конкретное товарное предложение. Вот короткий фрагмент, остальные поля для примера опущены:
<offer id="123">
<name>Смартфон Example 128 ГБ</name>
<price>29990</price>
</offer>
Здесь 123 связывает предложение в файле с записью на стороне получателя. При следующей загрузке площадка может по этому значению сопоставить предложение с уже известным товаром и обновить его данные. Название, цена и наличие меняются, а идентификатор остаётся прежним.
Идентификатор товара в YML обычно берут из CMS или базы магазина. Он не обязан совпадать с названием, штрихкодом или артикулом производителя. Главное, чтобы разные предложения не получали один и тот же ID. Требование уникальности прямо указано, например, в справке Директа о товарных YML-фидах.
Если магазин выгружает размеры или цвета отдельными предложениями, идентификатор должен различать эти варианты. ID родительской карточки для всех размеров одной футболки не подойдёт: в фиде это несколько отдельных записей.
Что происходит, если offer id одинаковые
Проблемный фрагмент выглядит так:
<offer id="123">
<name>Смартфон</name>
</offer>
<offer id="123">
<name>Ноутбук</name>
</offer>
Два разных товара объявлены под одним ключом. Получатель не может однозначно понять, какой из них соответствует записи 123. Площадка может отклонить предложение, обработать фид с ошибкой или получить некорректный набор товаров. Конкретный результат зависит от её правил и механизма импорта.
Такой документ может быть корректным XML. Парсер проверяет теги и вложенность, но обычный разбор XML не доказывает уникальность offer id в YML. Поэтому сообщение «файл прочитан» ещё не означает, что все предложения приняты.
Частые источники дублей: общий артикул у нескольких вариантов, объединение каталогов поставщиков без различения их ID, ошибка запроса к базе или повторная выгрузка одного товара. Если один и тот же offer попал в файл дважды, нужно убрать повтор записи, а не присваивать ей новый ID.
Когда уникальность проверена, а товары всё равно исчезают, переходите к статье «Почему не все товары из YML-фида попадают на площадку»: причин у неполной загрузки несколько.
Почему offer id не стоит менять без причины
Сегодня смартфон выгружен так:
<offer id="128">
А после следующей генерации тот же смартфон получил другое значение:
<offer id="9581">
Для получателя это может выглядеть как новое предложение вместо обновления старого. Что произойдёт с прежней записью и связанными данными, зависит от площадки. Например, справка Яндекс Товаров об offer прямо запрещает менять SKU после добавления товара.
Случайное число при каждом запуске и порядковый номер строки дают нестабильные ID. Достаточно добавить товар в начало списка или изменить сортировку, и номера сдвинутся. Смена цены, названия или остатка тоже не должна менять идентификатор того же предложения.
Отдельно проверьте обмен с учётной системой. Если синхронизация удаляет записи CMS и создаёт их заново, внутренние ID могут измениться даже при правильном шаблоне YML. В таком случае генератору нужен постоянный ключ предложения или сохранённая таблица соответствий.
Как быстро проверить фид
- Скачайте файл по тому URL, который указан на площадке. Сохраните эту версию: локальный экспорт может отличаться от файла, который получает импорт.
- Проверьте заполнение. У каждого
offerдолжен быть непустойid. Атрибут без значения и строка из пробелов не дают пригодного идентификатора. - Соберите ID и найдите повторы. XML-парсером извлеките атрибуты из
offers/offer, затем посчитайте число записей для каждого значения. Всё, что встречается больше одного раза, требует проверки. - Сравните две последовательные выгрузки. Для нескольких известных товаров сопоставьте ID с постоянным ключом из каталога. Не сравнивайте только номера строк: порядок предложений может меняться.
В небольшом файле дубль можно найти поиском по id="123". В большом каталоге поручите разработчику вывести повторяющиеся ID вместе с названиями и URL товаров. Не превращайте идентификаторы в числа при сравнении: иначе 00123 и 123 можно случайно смешать.
В полной проверке ФидСторожа есть диагностика отсутствующих и повторяющихся идентификаторов предложений. В фидах Маркета с shop-sku проверка дублей ориентируется на него. Смену ID между выгрузками нужно проверять отдельно, сравнивая сохранённые файлы.
Если документ вообще не читается, сначала исправьте синтаксис по статье «YML/XML-фид не проходит проверку». Проверка идентификаторов имеет смысл после того, как парсер смог извлечь предложения.
Как исправить ошибку offer id
- Выберите постоянный уникальный ID товара или предложения из CMS либо базы.
- Для отдельных вариантов используйте ID варианта, а не общей карточки.
- При объединении источников сохраните различие их идентификаторов, например постоянным префиксом поставщика, если формат площадки это допускает.
- Уберите случайные значения, нумерацию строк и повторную выгрузку одной записи.
- Пересоздайте YML, снова проверьте дубли и сравните его со следующей генерацией.
Исправляйте источник данных или генератор: ручная замена ID в готовом XML исчезнет при следующем обновлении. Если проблема затрагивает только несколько записей, сохраните ID остальных предложений. Массовая перенумерация каталога ради двух дублей создаст лишние изменения при импорте.
После исправления проверьте и остальные поля по разбору частых ошибок YML, затем посмотрите результат новой загрузки в кабинете площадки.
Если из фида периодически пропадают отдельные товары, проверить offer id стоит одним из первых пунктов. Особенно когда файл собирает сторонний модуль или самописный скрипт.