У нас аналогичная проблема: обновили битрикс малый бизнес, а модуль в 1с остался старый (УТ11.1) и перестали обнуляться остатки на складах, для которых не передается Количество=0.
Не сработал ни один описанный способ решения проблемы, в итоге сделали иначе.
Ловим событие OnBeforeCatalogImport1C и перед началом импорта, если передается файл offers.xml, проходимся по нему, и для каждого товара в элементе "Предложение" удаляем остатки на складах.
Нюансы:
1) сайт в cp1251, а импортируемый файл в utf-8, поэтому работаем с тегами через конвертацию:
| Код |
|---|
$nodeOffer = iconv("WINDOWS-1251", "UTF-8", "Предложение");
$nodeOfferID = iconv("WINDOWS-1251", "UTF-8", "Ид");
$nodeOfferName = iconv("WINDOWS-1251", "UTF-8", "Наименование");
|
2) для прохождения по элементам xml используем XMLReader
3) остатки удаляем путем:
- по внешнему id ищем id товара:
| Код |
|---|
$db_res = CCatalogProduct::GetList(
array(), array("ELEMENT_XML_ID" => $productXMLID)
); |
- по id товара находим id записей в таблице остатков:
| Код |
|---|
$rsStore = CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $productID)); |
- по id записей в таблице остатков удаляем эти записи:
| Код |
|---|
CCatalogStoreProduct::Delete($arStore["ID"]); |