Настроил выгрузку из 1С, но данные для SKU выгружаются в множественное свойство типа строка, а стандартный шаблон Битрикс 14 отображает даные либо из Highload ИБ, либо из свойств SKU типа "список" Собственно ТП Битрикса по сабжу отправила меня сюда. В статье приведен следующий код:
Код
<?
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("EXT1C", "ATTRIBUTES2PROP"));
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("EXT1C", "ATTRIBUTES2PROP"));
class EXT1C
{
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'];//название характеристики
//проверяем, есть ли свойство с названием как в описание значения свойства в 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);
}
//если свойство с таким названием уже было, то заполняем его значением из CML2_ATTRIBUTES
else
{
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($ar_props['CODE'] => $VALUE));
}
}
}
}
}
?>
Но этот код, к сожалению, перекладывает данные в свойство типа "строка". Есть ли у кого мысли как его переделать для свойств типа "список"?
Вы согласны с тем, что если у меня есть в инфоблоке некоторые свойства с множественными значениями. В связи с вышеуказанной проблемой, у меня не получилось импортировать данные свойства в 1с.
Ткачев Олег пишет: Вы согласны с тем, что если у меня есть в инфоблоке некоторые свойства с множественными значениями. В связи с вышеуказанной проблемой, у меня не получилось импортировать данные свойства в 1с.
//если свойство с таким названием уже было, то заполняем его значением из CML2_ATTRIBUTES
else
{
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($ar_props['CODE'] => $VALUE));
}
добавим это
Код
//если свойство с таким названием уже было, то заполняем его значением из CML2_ATTRIBUTES
else
{
if ($ar_props["PROPERTY_TYPE"] == "L") {
$property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$IBLOCK_ID, "VALUE"=>$VALUE));
$enum_fields = $property_enums->GetNext();
if($enum_fields)
{
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($ar_props['CODE'] => $enum_fields["ID"]));
}
}
else
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($ar_props['CODE'] => $VALUE));
}
Работает если создано свойство, тип "список" и выгружаемые значения тоже уже созданно.
Вообще странно, что умный фильтр вроде как работает только со свойством типа "Строка" в торговых предложениях. Конечно может только в стандартном магазине от Битрикса так... В вообще разложить свойства "Характеристики" (CML2_ATTRIBUTES) можно с помощью данного модуля - Разложение характеристик инфоблока с торговыми предложениями (SKU)