Что делать если битрикс не ставит нет на складе? Мне часто задают этот вопрос, поэтому я думаю эта статья поможет решить эту проблему! При выгрузке каталога из 1С в инфоблок под дефолту Битрикс не ставит галочку «уменьшать количество при заказе», в результате чего товар, которого нет на складе можно купить, и при выгрузке в Яндекс.Маркет будет стоять, что товар можно купить, а на самом деле это не так, и Яндекс.Маркет за такое может забанить ваш магазин (из-за жалоб, плюс они сами иногда обзванивают магазины, и такое встречается). Чтобы исправить эту неприятную недоработку нам необходимо в файле init.php добавить маленький кусок кода, который срабатывает при любом добавлении товара в инфоблок, а делать мы это будем через стандартное событие OnProductAdd. Подробности и код под катом!

Вот код, который мы добавляем в init.php

<?php
AddEventHandler("sale", "OnProductAdd", "OnProductAdd"); 

    function OnProductAdd(&$ID,$Fields)
    {
     $res=Array("QUANTITY_TRACE"=&gt;'Y);
      CCatalogProduct::Update($ID,$res);
    }
?>

Хочу обратить внимание, что в данном скрипте НЕ проверяется инфоблок, в который идёт загрузка, поэтому могут возникнуть проблемы, например если вы будете добавлять товары в другой инфоблок, в котором вам не нужно учитывать количество на складе и уменьшать его. Вот такой вот капризый битрикс.

Хочу, так же, поделиться кодом, который подойдёт вам в том случае, если у вас уже есть список товаров, и вы не пользуетесь 1с Управлением торговлей, то вам этот скрипт может помочь:

<?php

/*
* ----------------------------------------------------
* 1C-Bitrix
* ----------------------------------------------------
*/
     require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

     //
     // Загрузка модулей Битрикса
     //
     if (!CModule::IncludeModule('iblock') or !CModule::IncludeModule('catalog'))
     {
             die ('Ошибка в загрузки модулей...');
     }

     //
     // work.qtrace -&gt; Конфигурация запроса
     //
     $e = false;
     $arFilter = array (
                         "IBLOCK_ID"   =&gt; 4,
          "IBLOCK_TYPE" =&gt; "1c_catalog",
             );

     $arSelect = array("ID");

     //
     // work.qtrace -&gt; Запрос
     //
     $getQuery = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);

     //
     // work.qtrace -&gt; Обновляем параметры
     //
     if ($getQuery-&gt;SelectedRowsCount() &gt; 0)
     {
             while ($arFields = $getQuery-&gt;GetNext())
             {
                     $arProperty = array
                     (
                                 'QUANTITY_TRACE' =&gt; 'Y',
                     );

                     if (!CCatalogProduct::Update($arFields['ID'], $arProperty))
                     {
                             $e = true;
                             echo "&lt;p style='font: 1.3em Trebuchet MS, Tahoma, Sans-serif; color: #ff0000;'&gt;Error — ".$arFields['ID']."&lt;/p&gt;";
                     }
             }
     }
     else
     {
             echo "&lt;p style='font: 1.3em Trebuchet MS, Tahoma, Sans-serif; color: #ff0000;'&gt;Not found elements...&lt;/p&gt;";
     }

     if ($e === false)
     {
             echo "&lt;p style='font: 1.3em Trebuchet MS, Tahoma, Sans-serif; color: #666666;'&gt;Complete...&lt;/p&gt;";
     }

?>

Этот скрипт проходит по всем товарам и ставит им галочки Уменьшать количество.

Комментарии