Перейти к содержимому

Цены не обновились после обмена - разбор причин

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

С чего начать

Смотрим цену товара прямо в базе сайта:

$rows = \Bitrix\Catalog\PriceTable::getList(['filter' => ['=PRODUCT_ID' => $id],
'select' => ['CATALOG_GROUP_ID', 'PRICE', 'CURRENCY', 'TIMESTAMP_X']])->fetchAll();
print_r($rows);
// время правки у каждой цены показывает, какой тип обмен трогал последним
// новая цена в базе означает, что обмен отработал и разбор идёт в сторону витрины

Этот шаг делит поиск надвое и экономит час работы. Старая цена в базе - вопрос к обмену, новая цена в базе при старой на витрине - вопрос к кэшу.

Смотрим, какой тип цены показывает витрина:

foreach (\Bitrix\Catalog\GroupTable::getList(['select' => ['ID', 'NAME', 'XML_ID']])->fetchAll() as $g) {
printf("%d %s xml=%s\n", $g['ID'], $g['NAME'], $g['XML_ID']);
}
// тип цены компонента задан в параметрах его вызова в шаблоне сайта

Типов цен на сайте обычно больше одного, и обмен обновляет не все. Свежая цена в одном типе при старой в другом - самая частая причина расхождения витрины и учётной системы.

Читаем журнал обмена по шагам:

Окно терминала
tail -80 /home/bitrix/www/bitrix/catalog_export/1c_exchange.log | grep -iE 'цен|price|ошиб'
ls -la /home/bitrix/www/upload/1c_catalog/ | tail -5
# файлы выгрузки называют шаг: import - товары, offers - предложения и цены

Цены обычно приезжают отдельным файлом вместе с предложениями. Обрыв обмена после первого шага оставляет каталог с обновлёнными названиями и старыми ценами.

Проверяем, менялся ли товар вообще:

$el = \CIBlockElement::GetList([], ['ID' => $id], false, false,
['ID', 'TIMESTAMP_X', 'XML_ID'])->Fetch();
print_r($el); // время правки за сегодня означает, что товар обмен затронул
// внешний код пустой - товар заведён руками и в выгрузку не попадает вовсе

Причины

  1. Обмен обновил другой тип цены, а не тот, что на витрине примерно 30% случаев

    ПризнакУ товара несколько типов цен, и свежая цена появилась не в том, который выводит витрина.

    ПроверкаСравниваем время правки у всех типов цен товара и тип цены в параметрах компонента.

    Что делатьСводим витрину и обмен на один тип цены либо доносим внешний код нужного вида цен.

  2. Обмен выгружает только изменения, а номенклатура не менялась примерно 25% случаев

    ПризнакЦена изменилась только у части товаров, остальные приехали со старыми значениями.

    ПроверкаСмотрим время правки товара на сайте: у необновлённых оно осталось прежним.

    Что делатьЗапускаем полную выгрузку каталога вместо выгрузки изменений и сверяем результат.

  3. Витрина отдаёт цену из кэша примерно 20% случаев

    ПризнакВ карточке административного раздела цена новая, а на витрине по-прежнему старая.

    ПроверкаОткрываем страницу товара под своей учётной записью и сравниваем цену с базой.

    Что делатьСбрасываем кэш каталога и композит, а обмену включаем очистку кэша после шага.

  4. Поверх цены работает скидка или правило корзины примерно 15% случаев

    ПризнакНа витрине показаны две цены сразу или значение, которого нет ни в одном типе цен.

    ПроверкаСмотрим действующие правила корзины и скидки на товар в его карточке.

    Что делатьОтключаем лишнее правило или переносим скидку в учётную систему к самой цене.

  5. Обмен оборвался до шага с ценами примерно 10% случаев

    ПризнакНазвания и описания товаров обновились, а цены и остатки остались прежними.

    ПроверкаЧитаем журнал обмена: последний успешный шаг назван там прямо, вместе со временем.

    Что делатьУвеличиваем время выполнения шага и размер порции, затем повторяем обмен целиком.

Частые вопросы

Почему обмен прошёл без ошибок, а цены прежние?

Чаще всего свежая цена приехала в другой тип цены, а витрина выводит прежний. Обмен при этом честно отработал и об ошибке сообщать не будет.

Где витрина берёт тип цены для показа?

В параметрах компонента каталога, списком кодов типов цен. Тип, которого там нет, покупателю не показывается, даже если цена в базе свежая.

Почему цена обновилась не у всех товаров?

Так работает выгрузка только изменений: она отдаёт то, что менялось в номенклатуре. Изменение цены документом номенклатуру не трогает, и товар в выгрузку не попадает.

Как заставить витрину показать новую цену сразу?

Сбросить кэш каталога и композитную страницу товара. Автоматический сброс включают в настройках инфоблока признаком очистки кэша при изменении.

Цена на витрине не совпадает ни с одним типом цен.

Значит, поверх неё работает скидка или правило корзины. Их смотрят в карточке товара и в списке правил работы с корзиной.

Смежное

Первоисточник