Выгрузка характеристик торговых предложений из 1С в отдельные свойства

Скрипт, с помощью которого при выгрузке товаров из 1С, характеристики CML2_ATTRIBUTE будут записываться в отдельные свойства. А при наличии свойства типа "Справочник" с Названием, соответствующему Описанию характеристики и самого highload-справочника, это свойство будет заполнено нужным значением. 

Скрипт нужно прописать в файле init.php:
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("Unloading1C", "ATTRIBUTES2PROP"));
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("Unloading1C", "ATTRIBUTES2PROP"));

class Unloading1C
{    
    static function ATTRIBUTES2PROP(&$arFields)
    { 
      if ((@$_REQUEST['type']=='catalog')   && (@$_REQUEST['mode']=='import'))//выгрузка из 1С?
      {
         $IBLOCK_ID = $arFields['IBLOCK_ID'];
         $ELEMENT_ID = $arFields['ID'];
         //получаем массив значений множественного свойства CML2_ATTRIBUTES в которое стандартно выгружаются характеристики ТП из 1С
         $CML2_ATTRIBUTES = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, array("sort" => "asc"), Array("CODE"=>"CML2_ATTRIBUTES"));

         while ($CML2_ATTRIBUTE = $CML2_ATTRIBUTES->GetNext())
         {
            $VALUE = $CML2_ATTRIBUTE['VALUE'];//значение характеристики
            $DESCRIPTION = $CML2_ATTRIBUTE['DESCRIPTION'];//название характеристики
            if(!empty($VALUE) && !empty($DESCRIPTION)) {
				//проверяем, есть ли свойство с названием как в описание значения свойства в CML2_ATTRIBUTES
				$PROP = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, array("sort" => "asc"), Array("NAME"=> $DESCRIPTION));
				
				//если свойств нет, то создаем его, чтобы потом в него записать значение из CML2_ATTRIBUTES
				if(!$ar_props = $PROP->Fetch()) 
				{
				   //транслителируем символьный код из наименования
				   $CODE = CUtil::translit($DESCRIPTION, 'ru', array(
					  "max_len" => 50,
					  "change_case" => 'U', // 'L' - toLower, 'U' - toUpper, false - do not change
					  "replace_space" => '_',
					  "replace_other" => '_',
					  "delete_repeat_replace" => true,
				   ));
				   //добавляем '_' в код свойства, если его наименование начинается с цифры
				   if(preg_match('/^[0-9]/', $CODE))
					  $CODE = '_'.$CODE;
					  
				   $arFields = Array(
					  "NAME" => $DESCRIPTION,
					  "ACTIVE" => "Y",
					  "SORT" => "500",
					  "CODE" => $CODE,
					  "PROPERTY_TYPE" => "S",
					  "IBLOCK_ID" => $IBLOCK_ID,
					  );
				   
				   //заполняем созданное свойство
				   $ibp = new CIBlockProperty;
				   if ($PropID = $ibp->Add($arFields))
					  CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $CODE, $VALUE);            
				}
				
				else 
				{
					//если свойство с таким названием уже есть и является Справочником
					if($ar_props['USER_TYPE'] == 'directory') {
						CModule::IncludeModule('highloadblock');
						$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getList([
							'filter' => ['NAME' => $ar_props["CODE"]]
						])->fetch();

						$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
						$entityClass = $entity->getDataClass();

						$res = $entityClass::getList(array(
						   'select' => array('*'),
						   //'order' => array('ID' => 'ASC'),
						   'filter' => array('UF_NAME' => $VALUE)
						));
 
						$row = $res->fetch();
				
						CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $ar_props['CODE'], $row["UF_XML_ID"]);    
					} else {
						//если свойство с таким названием уже есть и не является Справочником, то заполняем его значением из CML2_ATTRIBUTES
						CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($ar_props['CODE'] => $VALUE));
					}						
				}
			}
         }
      }
    }
}


bitrixone © 2024