Задать вопрос
@abogdan

Почему остатки по складам перетираются (CCatalogStoreProduct)?

Добрый день. Мне необходимо иметь дубли складов с одинаковыми остатками. Для синхронизации остатков пытаюсь использовать событие OnStoreProductUpdate, которое отлично работает если изменяю склад-дубль с бОльшим id. Но если изменять склад, который был создан ранее, то, судя по результатам дебага, сначала в дублирующий склад записывается нужный мне результат, а потом он же заменяется старым результатом (насколько я понял остатки просто обновляются от меньшего к большему айди). Привязываю склады через UF_ID_MAIN. Подскажите, как решить эту проблему, возможно есть другие, более оптимальные способы дублирования складов?

AddEventHandler("catalog", "OnStoreProductUpdate","MyOnStoreProductSave");
function MyOnStoreProductSave($id, $arFields)
{
    $arFilter = Array("ACTIVE" => "Y", "ID"=>$arFields["STORE_ID"]);

    $rsStores = CCatalogStore::GetList(
        array(),
        $arFilter,
        false,
        false,
        array("ID", "UF_ID_MAIN")
    );

    while($arStore = $rsStores->Fetch()) {
        $arStores[] = $arStore;
    }
   
    $rs = CCatalogStoreProduct::GetList(false, array('PRODUCT_ID'=> $arFields["PRODUCT_ID"], 'STORE_ID' => $arStores[0]['UF_ID_MAIN']));
    while($ar_fields = $rs->GetNext())
    {
        if($ar_fields['AMOUNT'] != $arFields['AMOUNT']){
        $arFieldsNew = Array(
            "PRODUCT_ID" => $arFields["PRODUCT_ID"],
            "STORE_ID" => $arStores[0]['UF_ID_MAIN'],
            "AMOUNT" =>  $arFields['AMOUNT'],
        );
         CCatalogStoreProduct::Update($ar_fields['ID'], $arFieldsNew);
           }
    }
}
  • Вопрос задан
  • 332 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
rpsv
@rpsv
делай либо хорошо, либо никак
Вопрос в том зачем хранить дубли. Если для отображения какой-то инфы - то проще дубли складов вынести в ИБ.
-
Чтобы не потерять данные, в обработчике ПЕРЕД изменением остатков сохраните старые значения (в таблицу или еще куда), а ПОСЛЕ обновления поменяйте значения так как вам нужно (чтобы не быть завязанным на порядке обработки).
-
Если события после обработки нет, то заведите агента, который синхронизирует остатки на складах (по умолчанию агент неактивен). Как только происходит событие обновления остатков - в событии активируете агент. После агент запускается, синхронизирует остатки и после выполнения себя деактивирует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы