Описанная схема перестала работать после 14-й версии. К тому же там появилась стандартная возможность сабжа. Пост оставлен для ознакомления с подходом.
Пост не только решает сабж, но и показывает как иногда стоит мыслить в рамках разработки Битрикс.
[spoiler]
Известно, что товар нельзя добавить в корзину, если его нет в наличии. Вроде бы логично, и редко когда оно требуется. Но на его основе я реализовал схему предзаказов, когда в корзине отсутствующие товары складываются в отдельный блок

То есть, задача номер один - добавить товар. Да, можно писать свои методы, костыли, но я придерживаюсь принципа - меньше телодвижений, больше результата.
1. Будем использовать Add2BasketByProductID. Пытаемся добавить, конечно не получается. Смотрим почему:

Ага, уже ближе - посмотрим, что же у нас есть в CCatalogProduct::GetByID.
2. А там нас ждал бинго!

Ага, то есть, если глобальный кеш есть, то берется информация из него. Вот тут то мы и обманем API на этапе добавления:
После того как шаг с картинки 2 будет пройден, сработает обработчик, который увидит, что товара то в наличии все же нет, и переместит его в "нет в продаже", и мы сразу же получим то что нам надо на картинке 1.
Пост не только решает сабж, но и показывает как иногда стоит мыслить в рамках разработки Битрикс.
[spoiler]
Известно, что товар нельзя добавить в корзину, если его нет в наличии. Вроде бы логично, и редко когда оно требуется. Но на его основе я реализовал схему предзаказов, когда в корзине отсутствующие товары складываются в отдельный блок

То есть, задача номер один - добавить товар. Да, можно писать свои методы, костыли, но я придерживаюсь принципа - меньше телодвижений, больше результата.
1. Будем использовать Add2BasketByProductID. Пытаемся добавить, конечно не получается. Смотрим почему:

Ага, уже ближе - посмотрим, что же у нас есть в CCatalogProduct::GetByID.
2. А там нас ждал бинго!

Ага, то есть, если глобальный кеш есть, то берется информация из него. Вот тут то мы и обманем API на этапе добавления:
CModule::IncludeModule('catalog'); global $CATALOG_PRODUCT_CACHE; $CATALOG_PRODUCT_CACHE[$ID] = CCatalogProduct::GetByID($ID); //наполняем корректно глобальный массив $CATALOG_PRODUCT_CACHE[$ID]['QUANTITY_TRACE'] = 'N'; // заменяем то, что нам и мешает Add2BasketByProductID($ID, $_REQUEST['quantity']>0 ? $_REQUEST['quantity'] : 1);//добавляем в корзину уже без проблем unset($CATALOG_PRODUCT_CACHE[$ID]); //удаляем нами измененный кеш (а можно просто вернуть на измененное значение) |
После того как шаг с картинки 2 будет пройден, сработает обработчик, который увидит, что товара то в наличии все же нет, и переместит его в "нет в продаже", и мы сразу же получим то что нам надо на картинке 1.