Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Производителей (бренды) в отдельный инфоблок



Часто бывает, когда хочется заполнять в 1С производителя в стандартном поле производитель
А на сайте иметь инфоблок с брендами
AddEventHandler( "iblock", "OnAfterIBlockElementAdd", array( "nika_import", "FillTheBrands" ) );
AddEventHandler( "iblock", "OnAfterIBlockElementUpdate", array( "nika_import", "FillTheBrands" ) );
class nika_import {
    static function FillTheBrands( $arFields ){
        $arCatalogID=array(59); //каталоги товаров
        $brandsCatalogId = 34;//ID инфоблока с произодителями (брендами)       
        $codePropBrand1С = "CML2_MANUFACTURER"; //код свойства, в которое выгружает 1С
        $codePropBrand = 'BRAND'; //код свойства типа привязка к элементам инфоблока
        if(in_array($arFields['IBLOCK_ID'], $arCatalogID) ){
           $arFilter = array('IBLOCK_ID' => $arFields['IBLOCK_ID'],'ID' => $arFields['ID']);
           $arSelect = array( 'ID', 'PROPERTY_'.$codePropBrand1С);
            $arItem = CIBlockElement::GetList( false, $arFilter, false, false, $arSelect)->fetch();
            if($arItem['PROPERTY_'.$codePropBrand1С.'_VALUE']){
               $arFilter = array( 'IBLOCK_ID' =>  $brandsCatalogId, 'NAME' => $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'] );
               $arSelect = array("ID");
                $arBrand = CIBlockElement::GetList( false, $arFilter,false,array("nPageSize"=>1),$arSelect)->fetch();
                if( $arBrand ){
                   //cтавим найденный элемент-бренд
                    CIBlockElement::SetPropertyValuesEx($arFields['ID'], false, array( $codePropBrand => $arBrand['ID'] ));
                }
                else{
                   //создаем новый бренд в инфоблоке и ставим его
                    $el = new CIBlockElement;
                    $arParams = array( "replace_space" => "-", "replace_other" => "-" );
                    $id = $el->Add( array(
                        'ACTIVE' => 'Y',
                        'NAME' => $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'],
                        'IBLOCK_ID' =>  $brandsCatalogId,
                        'CODE' => Cutil::translit( $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'], "ru", $arParams )
                    ) );                
                    if( $id ){
                        CIBlockElement::SetPropertyValuesEx( $arFields['ID'], false, array( $codePropBrand => $id ) );
                    }
                    else{
                        echo $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE']." ".Cutil::translit( $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'], "ru", $arParams )." ";                   
                        echo $el->LAST_ERROR;
                    }
                }
            }
        }
    }
}

Доработочка
У клиента не только инфобок с брендами, но и инфоблок с линиями продукции, в котором есть привязка к бренду
Бренд и линия выгружаются из 1С, надо было заполнять оба инфоблока
AddEventHandler( "iblock", "OnAfterIBlockElementAdd", array( "nika_import", "FillTheBrands" ) );
AddEventHandler( "iblock", "OnAfterIBlockElementUpdate", array( "nika_import", "FillTheBrands" ) );
class nika_import {
    static function FillTheBrands( $arFields ){
        $arCatalogID=array(59); //каталоги товаров
        $brandsCatalogId = 34;//ID инфоблока с произодителями (брендами)
        $lineCatalogId = 38;//ID инфоблока с линиями
        $codePropBrand1С = "BREND"; //код свойства, в которое выгружает 1С
        $codePropBrand = 'BREND_'; //код свойства типа привязка к элементам инфоблока
        $codePropLine1С = "LINIYA"; //код свойства, в которое выгружает 1С
        $codePropLine = 'LINIYA_'; //код свойства типа привязка к элементам инфоблока
        $idBrand = false;
        $idLine = false;
        if(in_array($arFields['IBLOCK_ID'], $arCatalogID) ){
            $el = new CIBlockElement;
            $arFilter = array('IBLOCK_ID' => $arFields['IBLOCK_ID'],'ID' => $arFields['ID']);
            $arSelect = array( 'ID', 'PROPERTY_'.$codePropBrand1С,'PROPERTY_'.$codePropLine1С);
            $arItem = CIBlockElement::GetList( false, $arFilter, false, false, $arSelect)->fetch();
            if($arItem['PROPERTY_'.$codePropBrand1С.'_VALUE']){
               $arFilter = array( 'IBLOCK_ID' =>  $brandsCatalogId, 'NAME' => $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'] );
               $arSelect = array("ID");
                $arBrand = CIBlockElement::GetList( false, $arFilter,false,array("nPageSize"=>1),$arSelect)->fetch();
                if( $arBrand ){                   
                    $idBrand = $arBrand['ID'];
                }
                else{
                   //создаем новый бренд в инфоблоке и ставим его
                    
                    $arParams = array( "replace_space" => "-", "replace_other" => "-" );
                    $idBrand = $el->Add( array(
                        'ACTIVE' => 'Y',
                        'NAME' => $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'],
                        'IBLOCK_ID' =>  $brandsCatalogId,
                        'CODE' => Cutil::translit( $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'], "ru", $arParams )
                    ) );                
                    
                }
            }
            if($arItem['PROPERTY_'.$codePropLine1С.'_VALUE']){
                $arFilter = array( 'IBLOCK_ID' =>  $lineCatalogId, 'NAME' => $arItem['PROPERTY_'.$codePropLine1С.'_VALUE'] );
                if($idBrand){
                    $arFilter["PROPERTY_242"] = $idBrand;
                }
                $arSelect = array("ID");
                $arLine = CIBlockElement::GetList( false, $arFilter,false,array("nPageSize"=>1),$arSelect)->fetch();
                if( $arLine ){                   
                    $idLine = $arLine['ID'];
                }
                else{
                   //создаем новый бренд в инфоблоке и ставим его                    
                    
                    $arParams = array( "replace_space" => "-", "replace_other" => "-" );                    
                    $idLine = $el->Add( array(
                        'ACTIVE' => 'Y',
                        'NAME' => $arItem['PROPERTY_'.$codePropLine1С.'_VALUE'],
                        'IBLOCK_ID' =>  $lineCatalogId,
                        'CODE' => Cutil::translit( $arItem['PROPERTY_'.$codePropLine1С.'_VALUE'], "ru", $arParams ),
                        "PROPERTY_VALUES" => ($idBrand) ? [242 => $idBrand] : []
                    ) );                
                    
                }
            }
            if( $idBrand || $idLine){
                CIBlockElement::SetPropertyValuesEx( $arFields['ID'], false, array( $codePropBrand => $idBrand, $codePropLine => $idLine) );
            }
            // else{
            //     echo $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE']." ".Cutil::translit( $arItem['PROPERTY_'.$codePropBrand1С.'_VALUE'], "ru", $arParams )." ";                   
            //     echo $el->LAST_ERROR;
            // }
        }

    }
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!