Добавление не существующего товара в корзину и заказ, 1С-Битрикс

Просмотров: 1773

Задача: нужно добавить в корзину товар, которого не существует в каталоге, с возможностью задать ему произвольные название и цену.

Все просто: так как методу CSaleBasket::Add нужно обязательно передать ID товара, мы можем сгенерировать случайное число с помощью PHP и использовать его в качестве ID.

CSaleBasket::Add не требуется наличие товара с таким ID в базе сайта. Если не хотите, чтобы сгенерированный ID совпал с уже существующим в базе, можно задать диапазон, который не будет использоваться. Например, от 10 до 11 миллиардов.

Добавление товара в корзину.

Теперь: там где вам нужно, на любом шаге или в любом обработчике добавляем код:


$pseudoId = rand(10000000000, 11000000000);
$arFields = array(
    "PRODUCT_ID" => $pseudoId,
    "PRODUCT_PRICE_ID" => '1',
    "PRICE" =>  '1000',
    "CURRENCY" => "RUB",
    "WEIGHT" => '',
    "QUANTITY" => 1,
    "LID" => LANG,
    "DELAY" => "N",
    "CAN_BUY" => "Y",
    "NAME" => "Абракадабра " . $pseudoId,
    "CALLBACK_FUNC" => "",
    "MODULE" => "",
    "NOTES" => "",
    "ORDER_CALLBACK_FUNC" => "",
    "DETAIL_PAGE_URL" => ""
);
$arProps = array();
$arFields["PROPS"] = $arProps;
CSaleBasket::Add($arFields);

Здесь я добавил в название псевдотовара сгенерированный ID, чтобы проверить работоспособность и убедиться, что при каждом добавлении создается новый товар. Я запустил скрипт три раза, в результате в корзине появились три разных товара (цену и количество менял вручную).

Добавление в корзину и заказ не существующего товара в 1С-Битрикс 2

Заказ тоже оформился правильно, с содержимым, включающим несуществующие товары:

Добавление в корзину и заказ не существующего товара в 1С-Битрикс 1
Михаил Базаров 06.05.2023
Эта заметка, продолжение к
https://bazarow.ru/blog-note/14681/ (Дополнительные опции/услуги, добавляемые в корзину, в карточке товаров)
Все поля
Код
"NAME", // название товара
"LID", // сайт, на котором сделана покупка
"SORT", // сортировка
"PRODUCT_ID", // код товара
"BASE_PRICE", // цена без учета скидок и наценок
"PRICE", // цена с учетом скидок и наценок
"DISCOUNT_PRICE", // скидка
"CURRENCY", // Валюта
"CUSTOM_PRICE", // флаг(Y/N): кастомная цена или нет
"QUANTITY", // количество
"WEIGHT", // вес
"DIMENSIONS", // размеры
"MEASURE_CODE", // код единицы измерения
"DELAY", // Флаг "товар отложен" (Y/N)
"CAN_BUY", // Флаг "товар можно купить" (Y/N)
"NOTES", // Особые заметки
"VAT_RATE",  // ставка НДС
"VAT_INCLUDED", // флаг(Y/N): включен налог или нет
"BARCODE_MULTI",  // флаг(Y/N): штрихкод уникальный или нет
"SUBSCRIBE", // флаг(Y/N): подписка на товар
"PRODUCT_PROVIDER_CLASS", // Имя класса провайдера
"TYPE", // тип товара
"XML_ID" // внешний идентификатор
Михаил Базаров 13.05.2023
Вариант на D7:
Код
$item = $basket->createItem('catalog', rand(10000000000, 11000000000));
$item->setFields([
        'QUANTITY' => '1',
        'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
        'LID' => Bitrix\Main\Context::getCurrent()->getSite(),
        'NAME' => 'Абракадабра',
        'PRICE' => '123456',
        'CUSTOM_PRICE' => 'Y',
]);
$basket->save();
AIF 17.06.2023
Михаил подскажите какое поля добавить $arFields что бы еще цена со скидкой передавалась в корзину??
AIF 17.06.2023
Добавил "BASE_PRICE" теперь цена выводиться правильная! но хотелось бы что бы и старая цена выводилась. Не подскажите как правильно передать поля в корзину.

в корзине:
{{{FULL_PRICE_FORMATED}}} = вот так в корзине выводиться старая цена
{{{PRICE_FORMATED}}} = вот так уже с учетом скидки
AIF 17.06.2023
Да и товар если есть в корзине я могу добавить его опять в избранное и потом из избранного "добавить в заказ" и получаеться две одинаковые позиции =(
Михаил Базаров 18.06.2023
Попробуйте вот так, не проверял но судя по документации должно сработать
Код
"PRICE" => '123', // цена с учетом скидок и наценок
"DISCOUNT_PRICE" => '2', // скидка %
Гость 24.08.2023
доброго времени) а есть ли возможность в доптовар картинку подтягивать?
Михаил Базаров 24.08.2023
В самом методе этого не вижу, но там есть массив свойств "PROPS" можно поопробовать туда передать.