Перехватить обновление элемента при обмене с 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']); }
}
}
}
}