G
N
I
D
A
O
L

Перехватить обновление элемента при обмене с 1С и что-то сделать

Естественно, пишем всё это в init.php или включенных в него файлах.
// Вешаем событие на обновление элемента или его добавление
\Bitrix\Main\EventManager::getInstance()->addEventHandler("iblock", "OnBeforeIBlockElementAdd", array("Mediagroup", "OnImport1C"));
\Bitrix\Main\EventManager::getInstance()->addEventHandler("iblock", "OnStartIBlockElementUpdate", array("Mediagroup", "OnImport1C"));
\Bitrix\Main\EventManager::getInstance()->addEventHandler("catalog", "OnCompleteCatalogImport1C", array("Mediagroup", "OnCompleteCatalogImport1C"));
class Mediagroup

{

function OnImport1C(&$arFields)

{



// Тут еще проверить, обмен ли вообще идет или просто из админки кто-то обновляет

if ($_GET['type'] == 'type' && $_GET['mode'] == 'import') {

// значит мы в импорте



// Случилось раз, что сессия не стартанула, и переменные в неё не записывались. Исправим это дело и запишем один // раз за весь обмен информацию об инфоблоке, товары которого обновляются.

if (!isset($_SESSION['1C_IMPORT_IBLOCK_ID'][$arFields['IBLOCK_ID']])) {

session_start();

// простой способ выяснить, какой инфоблок мы обновляем, товаров или торговых предложений.

$mxResult = CCatalogSKU::GetInfoByOfferIBlock(

$arFields['IBLOCK_ID']

);



if (is_array($mxResult)) {

$_SESSION['1C_IMPORT_IBLOCK_ID'][$arFields['IBLOCK_ID']] = [

'TYPE' => 'offers',

'PRODUCT_IBLOCK_ID' => $mxResult['PRODUCT_IBLOCK_ID']

];

} else {

$_SESSION['1C_IMPORT_IBLOCK_ID'][$arFields['IBLOCK_ID']] = ['TYPE' => 'product'];

}



}



// Если это инфоблок товаров, то отменим перезапись поля NAME (но только при обновлении). // А само значение поля засунем в свойство инфоблока NAME_1C

if ($_SESSION['1C_IMPORT_IBLOCK_ID'][$arFields['IBLOCK_ID']]['TYPE'] == 'product') {

if (!isset($arFields['ID']) && isset($arFields['NAME']) && isset($arFields['PROPERTY_VALUES'])){ $arFields['PROPERTY_VALUES']["NAME_1C"] = $arFields["NAME"];



unset($arFields['NAME']); }

}



}



}

}