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

Скидки и ручные цены при обмене - что перезаписывает обмен

Разбираемся, почему ночной обмен возвращает старые цены поверх акционных и где на сайте живёт скидка из учётной системы.

Решение

Смотрим, какие типы цен приезжают из обмена:

$res = CCatalogGroup::GetList([], [], false, false, ['ID', 'NAME', 'NAME_LANG', 'XML_ID']);
while ($price = $res->Fetch()) {
printf("%d %-16s внешний код=%s\n", $price['ID'], $price['NAME'], $price['XML_ID'] ?: '(нет)');
}
// типы с внешним кодом обмен обновляет, остальные не трогает вовсе

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

Держим акционную цену отдельным типом:

$res = CPrice::GetList([], ['PRODUCT_ID' => $elementId], false, false, ['*']);
while ($p = $res->Fetch()) {
printf("тип=%d цена=%8.2f\n", $p['CATALOG_GROUP_ID'], $p['PRICE']);
}
// базовая цена приезжает из учётной системы, акционная задаётся на сайте

Акционную цену держат в типе, который обмен не выгружает. Тогда ночной сеанс обновляет базовую цену, а акция остаётся, и утренняя жалоба «скидка слетела» исчезает вместе с причиной.

Разводим скидку из учётной системы и правило корзины:

$optimal = CCatalogProduct::GetOptimalPrice($elementId, 1, $USER->GetUserGroupArray());
printf("итог=%8.2f базовая=%8.2f скидка=%s\n",
$optimal['DISCOUNT_PRICE'], $optimal['RESULT_PRICE']['BASE_PRICE'],
$optimal['DISCOUNT']['VALUE'] ?? '-');

Расчёт показывает, какая цена победила и что на неё повлияло. Скидка, приехавшая отдельным типом цены, и правило корзины на сайте складываются, и покупатель получает двойную скидку вместо одной.

Проверяем цену у предложений, а не у товара:

$offers = CCatalogSKU::getOffersList([$elementId], 5, ['ACTIVE' => 'Y'], ['ID'], []);
foreach ($offers[$elementId] ?? [] as $offer) {
$p = CCatalogProduct::GetOptimalPrice($offer['ID'], 1);
printf("предложение %d: %8.2f\n", $offer['ID'], $p['DISCOUNT_PRICE']);
}

У товара с вариантами цена лежит у предложений. Правка цены товара-владельца при этом не меняет ничего: в корзину уходит предложение со своей ценой.

Правила округления задают на сайте, а не в учётной системе. Цена, приехавшая с копейками, показывается как есть, и приведение к круглым значениям делают настройкой округления по типам цен.

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

Историю правок цен стоит хранить хотя бы журналом. Спор «кто поменял цену на акционную» решается за минуту, если рядом лежит запись о том, обмен это был или менеджер.

Типичные проблемы

Ночью цены вернулись к прежним значениям.

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

Скидка из учётной системы не применяется.

Она приехала отдельным типом цены, а покупателю показывается другой тип. Показываемые покупателю типы цен задаются списком кодов в параметрах компонентов каталога.

Покупатель получает двойную скидку.

Цена приехала уже со скидкой, а сверху сработало правило корзины. Скидка учётной системы и правило корзины складываются, если их заранее не развести.

Правка цены товара ничего не меняет.

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

Цены показываются с копейками.

Округление не настроено для этого типа цены. Значение из учётной системы показывается как есть.

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

Как сделать акцию, переживающую обмен?

Отдельным типом цены без внешнего кода либо правилом корзины. Оба варианта обмен не трогает.

Где лучше считать скидки: на сайте или в учётной системе?

В одном месте, а не в двух. Смешанная схема даёт двойные скидки и расхождение сумм в заказе.

Можно ли запретить обмену менять цены?

Да, выключив приём цен в настройках обмена. Тогда цены живут только на сайте, и за их актуальность отвечает магазин.

Почему цена в корзине отличается от карточки?

В корзине применяются правила, зависящие от состава и суммы. Карточка показывает цену до этих правил.

Смежное

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