Ccatalogstoreproduct update не работает

SOS! очень странный глюк или фича.

Всем привет!
Итак. У нас магазин одежды товаров с торговыми предложениями.
Включили количественный учет и резервирование при оформлении заказа.
первый недоработка Битрикса в том, что при изменении остатков по торговым предложениям (и доступного количества), не меняются остатки у товара (и доступное количество). ХОТЯ! настройка у комплексного компонента catalog и у catalog:section скрывать товары, у которых нет остатков есть!!
ну да ладно, код я нашла и он заработал. Но вот что обнаружила и никак не могу с этим справится.
Смотрим код, там все просто.

//change ostatki of goods
AddEventHandler(«catalog», «OnStoreProductUpdate»,»MyOnStoreProductSave» ;
AddEventHandler(«catalog», «OnStoreProductAdd»,»MyOnStoreProductSave» ;

function MyOnStoreProductSave($id, $arFields)<

$allAmount = $arFields[‘AMOUNT’];
if(CModule::IncludeModule(‘catalog’) & CModule::IncludeModule(‘iblock’))<

//Получаем информацию о товаре привязанном к данному приложению, вмести с этим проверяем не является ли это товаром.
$arProductInfo = CCatalogSKU::GetProductInfo($arFields[‘PRODUCT_ID’&#93 ;
if(is_array($arProductInfo))<

//Получаем данные о инфоблоке Торговых предложений
$arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo[‘IBLOCK_ID’&#93 ;
$arFilter = Array(
‘IBLOCK_ID’=>$arOffersInfo[‘IBLOCK_ID’],
«PROPERTY_».$arOffersInfo[‘SKU_PROPERTY_ID’]=>$arProductInfo[‘ID’],
«!ID»=>$arFields[‘PRODUCT_ID’]
);

//Получаем список торговых предложений.
$obOffersList = CIBlockElement::GetList(Array(«SORT»=>»ASC» ,$arFilter,false,false,array());
$arOffers = array();
while($arOffers = $obOffersList->Fetch())<

//Получаем данные об остатках на складе для торгового предложения.
$obStoreOffer = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arOffers[‘ID’&#93 , false,false,array());
while($arStore = $obStoreOffer->Fetch()) <
$arAllStore[] = $arStore;
$allAmount = $allAmount + $arStore[‘AMOUNT’];
>
>

//Получаем данные о складе товара и формируем массив для обновления данных.
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arProductInfo[‘ID’&#93 , false,false,array());
$arFieldsProduct = array (
‘PRODUCT_ID’ => $arProductInfo[‘ID’],
‘STORE_ID’ => $arFields[‘STORE_ID’],
‘AMOUNT’ => $allAmount,
);

//Обновляем склады у товара
$result = FALSE;
if($arStoreProduct = $obStoreProduct->Fetch()) <
$result = CCatalogStoreProduct::Update($arStoreProduct[«ID»],$arFieldsProduct);
>else <
$result = CCatalogStoreProduct::Add($arFieldsProduct);
>

//Если обновились склады, обновляем доступное количество у товара=сумма остатков по всем складам у товара
if($result) <
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘PRODUCT_ID’ =>$arProductInfo[‘ID’&#93 , false,false,array());
while($arStoreProduct = $obStoreProduct->Fetch()) <
$allAmountProduct = $allAmountProduct + $arStoreProduct[‘AMOUNT’];
>
$arFieldsProduct = array(
«QUANTITY» => $allAmountProduct,
);

$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’&#93 ;
AddMessage2Log($arr);

AddMessage2Log(«res-«.$res.»id — «.$arProductInfo[‘ID’].» count — «.$allAmountProduct);

Смотрим самый конец $res=CCatalogProduct::Update ($arProductInfo[‘ID’],$arFieldsProduct);

Эта штука не корректно работает или я никак не пойму почему так происходит.

Поведение.
Если у товара пусто в поле доступное количество, то эта функция не работает. Если я руками через админку пишу доступное количество, то после этого момента функция начинает работать.
Ищу дальше.

Вызвала
$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’&#93 ;
AddMessage2Log($arr);

чтобы проверить, что же там такое и все раскрылось.

В первый раз когда пусто в доступном количестве и функция не срабатывает, педшые среди прочих возвращает ‘PRODUCT’ => false
Когда я руками вставила, и после этого все начало работать в параметре я уже вижу

Читайте также:  Как правильно настроить рацию связь м 333

‘PRODUCT’ =>
array (
‘ID’ => 32884,
‘QUANTITY’ => ‘196’,
‘QUANTITY_RESERVED’ => ‘0’,
‘QUANTITY_TRACE’ => ‘Y’,
‘QUANTITY_TRACE_ORIG’ => ‘D’,
‘WEIGHT’ => ‘0’,
‘WIDTH’ => ‘0’,
‘LENGTH’ => ‘0’,
‘HEIGHT’ => ‘0’,
‘MEASURE’ => ‘5’,
‘VAT_ID’ => ‘0’,
‘VAT_INCLUDED’ => ‘N’,
‘CAN_BUY_ZERO’ => ‘N’,
‘CAN_BUY_ZERO_ORIG’ => ‘D’,
‘NEGATIVE_AMOUNT_TRACE’ => ‘N’,
‘NEGATIVE_AMOUNT_TRACE_ORIG’ => ‘D’,
‘PRICE_TYPE’ => ‘S’,
‘RECUR_SCHEME_TYPE’ => ‘D’,
‘RECUR_SCHEME_LENGTH’ => ‘0’,
‘TRIAL_PRICE_ID’ => NULL,
‘WITHOUT_ORDER’ => ‘N’,
‘SELECT_BEST_PRICE’ => ‘Y’,
‘TMP_ID’ => NULL,
‘PURCHASING_PRICE’ => ‘0.00’,
‘PURCHASING_CURRENCY’ => ‘RUB’,
‘BARCODE_MULTI’ => ‘N’,
‘TIMESTAMP_X’ => ‘23.09.2014 11:18:14’,
‘SUBSCRIBE’ => ‘Y’,
‘SUBSCRIBE_ORIG’ => ‘D’,
‘TYPE’ => ‘1’,
),
)

и $res=CCatalogProduct::Update конечно уже срабатывает.

Прошу объяснить и подсказать, как сделать чтобы всегда product стоял.

Источник

SOS! очень странный глюк или фича.

Всем привет!
Итак. У нас магазин одежды товаров с торговыми предложениями.
Включили количественный учет и резервирование при оформлении заказа.
первый недоработка Битрикса в том, что при изменении остатков по торговым предложениям (и доступного количества), не меняются остатки у товара (и доступное количество). ХОТЯ! настройка у комплексного компонента catalog и у catalog:section скрывать товары, у которых нет остатков есть!!
ну да ладно, код я нашла и он заработал. Но вот что обнаружила и никак не могу с этим справится.
Смотрим код, там все просто.

//change ostatki of goods
AddEventHandler(«catalog», «OnStoreProductUpdate»,»MyOnStoreProductSave» ;
AddEventHandler(«catalog», «OnStoreProductAdd»,»MyOnStoreProductSave» ;

function MyOnStoreProductSave($id, $arFields)<

$allAmount = $arFields[‘AMOUNT’];
if(CModule::IncludeModule(‘catalog’) & CModule::IncludeModule(‘iblock’))<

//Получаем информацию о товаре привязанном к данному приложению, вмести с этим проверяем не является ли это товаром.
$arProductInfo = CCatalogSKU::GetProductInfo($arFields[‘PRODUCT_ID’&#93 ;
if(is_array($arProductInfo))<

//Получаем данные о инфоблоке Торговых предложений
$arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo[‘IBLOCK_ID’&#93 ;
$arFilter = Array(
‘IBLOCK_ID’=>$arOffersInfo[‘IBLOCK_ID’],
«PROPERTY_».$arOffersInfo[‘SKU_PROPERTY_ID’]=>$arProductInfo[‘ID’],
«!ID»=>$arFields[‘PRODUCT_ID’]
);

//Получаем список торговых предложений.
$obOffersList = CIBlockElement::GetList(Array(«SORT»=>»ASC» ,$arFilter,false,false,array());
$arOffers = array();
while($arOffers = $obOffersList->Fetch())<

//Получаем данные об остатках на складе для торгового предложения.
$obStoreOffer = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arOffers[‘ID’&#93 , false,false,array());
while($arStore = $obStoreOffer->Fetch()) <
$arAllStore[] = $arStore;
$allAmount = $allAmount + $arStore[‘AMOUNT’];
>
>

//Получаем данные о складе товара и формируем массив для обновления данных.
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arProductInfo[‘ID’&#93 , false,false,array());
$arFieldsProduct = array (
‘PRODUCT_ID’ => $arProductInfo[‘ID’],
‘STORE_ID’ => $arFields[‘STORE_ID’],
‘AMOUNT’ => $allAmount,
);

//Обновляем склады у товара
$result = FALSE;
if($arStoreProduct = $obStoreProduct->Fetch()) <
$result = CCatalogStoreProduct::Update($arStoreProduct[«ID»],$arFieldsProduct);
>else <
$result = CCatalogStoreProduct::Add($arFieldsProduct);
>

//Если обновились склады, обновляем доступное количество у товара=сумма остатков по всем складам у товара
if($result) <
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘PRODUCT_ID’ =>$arProductInfo[‘ID’&#93 , false,false,array());
while($arStoreProduct = $obStoreProduct->Fetch()) <
$allAmountProduct = $allAmountProduct + $arStoreProduct[‘AMOUNT’];
>
$arFieldsProduct = array(
«QUANTITY» => $allAmountProduct,
);

Читайте также:  Сломался калькулятор citizen как починить

$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’&#93 ;
AddMessage2Log($arr);

AddMessage2Log(«res-«.$res.»id — «.$arProductInfo[‘ID’].» count — «.$allAmountProduct);

Смотрим самый конец $res=CCatalogProduct::Update ($arProductInfo[‘ID’],$arFieldsProduct);

Эта штука не корректно работает или я никак не пойму почему так происходит.

Поведение.
Если у товара пусто в поле доступное количество, то эта функция не работает. Если я руками через админку пишу доступное количество, то после этого момента функция начинает работать.
Ищу дальше.

Вызвала
$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’&#93 ;
AddMessage2Log($arr);

чтобы проверить, что же там такое и все раскрылось.

В первый раз когда пусто в доступном количестве и функция не срабатывает, педшые среди прочих возвращает ‘PRODUCT’ => false
Когда я руками вставила, и после этого все начало работать в параметре я уже вижу

‘PRODUCT’ =>
array (
‘ID’ => 32884,
‘QUANTITY’ => ‘196’,
‘QUANTITY_RESERVED’ => ‘0’,
‘QUANTITY_TRACE’ => ‘Y’,
‘QUANTITY_TRACE_ORIG’ => ‘D’,
‘WEIGHT’ => ‘0’,
‘WIDTH’ => ‘0’,
‘LENGTH’ => ‘0’,
‘HEIGHT’ => ‘0’,
‘MEASURE’ => ‘5’,
‘VAT_ID’ => ‘0’,
‘VAT_INCLUDED’ => ‘N’,
‘CAN_BUY_ZERO’ => ‘N’,
‘CAN_BUY_ZERO_ORIG’ => ‘D’,
‘NEGATIVE_AMOUNT_TRACE’ => ‘N’,
‘NEGATIVE_AMOUNT_TRACE_ORIG’ => ‘D’,
‘PRICE_TYPE’ => ‘S’,
‘RECUR_SCHEME_TYPE’ => ‘D’,
‘RECUR_SCHEME_LENGTH’ => ‘0’,
‘TRIAL_PRICE_ID’ => NULL,
‘WITHOUT_ORDER’ => ‘N’,
‘SELECT_BEST_PRICE’ => ‘Y’,
‘TMP_ID’ => NULL,
‘PURCHASING_PRICE’ => ‘0.00’,
‘PURCHASING_CURRENCY’ => ‘RUB’,
‘BARCODE_MULTI’ => ‘N’,
‘TIMESTAMP_X’ => ‘23.09.2014 11:18:14’,
‘SUBSCRIBE’ => ‘Y’,
‘SUBSCRIBE_ORIG’ => ‘D’,
‘TYPE’ => ‘1’,
),
)

и $res=CCatalogProduct::Update конечно уже срабатывает.

Прошу объяснить и подсказать, как сделать чтобы всегда product стоял.

Источник

Update

Описание и параметры

Метод обновляет параметры товара, относящиеся к товару как к таковому. Нестатический метод.

Параметры вызова

Параметр Описание
ID Код товара.
arFields Ассоциативный массив, ключами которого являются названия параметров товара, а значениями — новые значения параметров. Допустимые ключи:

ключи, независящие от типа товаров:

  • QUANTITY — доступное количество товара;
  • QUANTITY_RESERVED — зарезервированное количество;
  • QUANTITY_TRACE — флаг (Y/N/D)* «включить количественный учет» (до версии 12.5.0 параметр назывался «уменьшать ли количество при заказе»);

ключи для обычных товаров:

  • CAN_BUY_ZERO — флаг (Y/N/D)* «разрешить покупку при отсутствии товара»;
  • NEGATIVE_AMOUNT_TRACE — флаг (Y/N/D)* «разрешить отрицательное количество товара»;
  • SUBSCRIBE — флаг (Y/N/D)* «разрешить подписку при отсутствии товара»;
  • PURCHASING_PRICE — закупочная цена;
  • PURCHASING_CURRENCY — валюта закупочной цены;

    WEIGHT — вес единицы товара;

  • WIDTH — ширина товара (в мм);
  • LENGTH — длина товара (в мм);
  • HEIGHT — высота товара (в мм);
  • MEASURE — ID единицы измерения;
  • BARCODE_MULTI — (Y/N) определяет каждый ли экземпляр товара имеет собственный штрихкод;

ключи для продажи контента:

  • PRICE_TYPE — тип цены (S — одноразовый платеж, R — регулярные платежи, T — пробная подписка);
  • RECUR_SCHEME_TYPE — тип периода подписки («H» — час, «D» — сутки, «W» — неделя, «M» — месяц, «Q» — квартал, «S» — полугодие, «Y» — год);
  • RECUR_SCHEME_LENGTH — длина периода подписки;
  • TRIAL_PRICE_ID — код товара, для которого данный товар является пробным;
  • WITHOUT_ORDER — флаг «Продление подписки без оформления заказа».
*D — значение берется из настроек модуля.
Читайте также:  Диск не работает hdmi

Возвращаемые значения

Возвращает true в случае успешного обновления параметров и false в противном случае.

Примеры использования

Обновление зарезервированного количества товара

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Источник

Битрикс остатки по складам

Начиная с 12й версии в интернет-магазине CMS Битрикс доступен функционал учета остатков по складам. Это означает, что если у вас, например, 3 магазина со своими складами, то вы можете создать 3 склада, и остатки по ним будут отображаться и учитываться у каждого товара.

Также склады имеют привязку к сайту, таким образом можно сделать несколько интернет-магазинов, в зависимости от города, например, и каждый будет привязан к своему складу.

Также появился компонент, позволяющий вывести все остатки по складам, для определенного товара, пример вызова:

Класс CCatalogStoreProduct позволяет обрабатывать в битрикс остатки по складам, например код:

задаст количество товара с на складе 3 равным 4.

В админке склады выглядят так:

А вот так остатки по складам выглядят на странице редактирования товара:

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

К примеру, стоит задача вывести на сайте все товары для города Москва, при этом в Москве больше одного склада. Для этого потребуется создать еще одно свойство, к примеру s1_AVAILABLE, а на обработчик добавления или изменения элемента OnBeforeElementAdd/OnBeforeElementUpdate повесить функцию, которая будет складывать значения остатков по определенным складам (относящимся к Москве), и помещать в поле s1_AVAILABLE

Источник

Оцените статью