Скрипт нужно прописать в файле 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)); } } } } } } }