Как через Sale\Order::create() создать заказ со скидкой так, чтобы скидка корректно передавалась в 1С?

Здравствуйте. <br/> <br/> Создаю заказ с кастомными товарами. Цена без скидки передаётся в BASE_PRICE, цена со скидкой — в PRICE, а размер скидки дополнительно передаю в DISCOUNT_VALUE. <br/> <br/> <pre><code>$basket = Sale\Basket::create($siteId);
  • 9 апреля 2026 г. 14:00
Ответы на вопрос 2
Коротко — для корректной передачи скидки в 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/выгрузке есть поля с суммой скидки.
<blockquote>сам объем скидки на всякий</blockquote> <br/> Тут вы почти на правильном пути. Советую добавить тип скидки (минус рубли, подарок от магазина, промокод, проценты, зануление), чтобы на будущее проблем не возникло. И потом в пересчете все считалось как надо, а не на основании новой цены. <br/> <br/> <blockquote>Но в xml выгрузку заказа попадает только финальная цена. </blockquote> <br/> Что касается вашего вопроса - смотрите вывод таблицы, там скорее всего есть поля для выгрузки. XML или XLS  - не особо важно, главное понимать что там колонки отдельно живут и отдельно значения полей.
Похожие вопросы