У нас аналогичная проблема: обновили битрикс малый бизнес, а модуль в 1с остался старый (УТ11.1) и перестали обнуляться остатки на складах, для которых не передается Количество=0.
Не сработал ни один описанный способ решения проблемы, в итоге сделали иначе.
Ловим событие OnBeforeCatalogImport1C и перед началом импорта, если передается файл offers.xml, проходимся по нему, и для каждого товара в элементе "Предложение" удаляем остатки на складах.
Нюансы:
1) сайт в cp1251, а импортируемый файл в utf-8, поэтому работаем с тегами через конвертацию:
2) для прохождения по элементам xml используем XMLReader
3) остатки удаляем путем:
- по внешнему id ищем id товара:
- по id товара находим id записей в таблице остатков:
- по id записей в таблице остатков удаляем эти записи:
Не сработал ни один описанный способ решения проблемы, в итоге сделали иначе.
Ловим событие 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"]); |