Коротко — для корректной передачи скидки в 1С нужно в элементах корзины не только записать BASE_PRICE и PRICE, но и выставить поле DISCOUNT_PRICE (сумма скидки на единицу) и пометить CUSTOM_PRICE = 'Y', чтобы цена не пересчиталась при сохранении. Поле DISCOUNT_VALUE в корзинных элементах/заказе 1С-обмен обычно игнорирует — экспорт читает PRICE/BASE_PRICE/DISCOUNT_PRICE.
Пример рабочего кода (Bitrix\Sale):
use Bitrix\Sale;
$siteId = 's1';
$userId = 1;
$currency = 'RUB';
$personTypeId = 1;
$order = Sale\Order::create($siteId, $userId);
$order->setPersonTypeId($personTypeId);
$order->setField('CURRENCY', $currency);
/* корзина */
$basket = Sale\Basket::create($siteId);
/* Добавляем кастомный товар (PRODUCT_ID = 0) */
$basePrice = 1000.00; // цена без скидки (за единицу)
$priceWithDiscount = 900.00; // цена со скидкой (за единицу)
$discountPerItem = $basePrice - $priceWithDiscount;
$item = $basket->createItem('catalog', 0); // для кастомных товаров часто используют id=0
$item->setFields([
'NAME' => 'Мой кастомный товар',
'CURRENCY' => $currency,
'LID' => $siteId,
'PRODUCT_ID' => 0,
'QUANTITY' => 1,
'BASE_PRICE' => $basePrice,
'PRICE' => $priceWithDiscount,
'DISCOUNT_PRICE' => $discountPerItem, // <- важно
'CUSTOM_PRICE' => 'Y', // <- важно: запретить пересчёт
// опционально:
'MEASURE_NAME' => 'шт.',
'PRODUCT_PROVIDER_CLASS' => ''
]);
$order->setBasket($basket);
/* опционально добавить оплату/доставку и т.п. */
$result = $order->save();
if (!$result->isSuccess()) {
// обработка ошибок
}
Комментарии и подсказки
- DISCOUNT_PRICE — это сумма скидки на одну единицу товара. При экспорте в 1С именно это поле используется для формирования данных о скидке.
- CUSTOM_PRICE = 'Y' обязателен, иначе при сохранении/пересчёте корзина может восстановить цену из каталога и затереть вашу PRICE/BASE_PRICE/DISCOUNT.
- Если у вас скидка в процентах/применяется сложный промокод, можно заполнить также DISCOUNT_NAME, DISCOUNT_TYPE и т.д., но для простого переноса в 1С хватит PRICE + BASE_PRICE + DISCOUNT_PRICE.
- Проверьте настройки обмена с 1С: иногда в настройках выгрузки есть флаги "выгружать скидки" или подобные; если они выключены, скидка не попадёт в 1С даже при корректных полях.
- Для отладки посмотрите сформированный массив корзины и экспорт (CommerceML) — убедитесь, что в XML/выгрузке есть поля с суммой скидки.