Победил...
Но победил специфически. Просто с помощью настройки не получилось сделать по производителю.
Выкрутился путем редактирования файла /bitrix/php_interface/init.php
и добавлением своих событий OnBeforeProductAdd и OnBeforeProductUpdate
Схема простая и работает при изменении или добавлении продукта в каталог по следующему принципу:
1) Читаем свойство CML2_MANUFACTURER (наименование и внешний код) в элементе;
2) Смотрим есть ли в отдельном инфоблоке "Производители" элемент с таким же внешним кодом, если нет, то добавляем
3) Ищем в отдельном инфоблоке "Производители" элемент с таким же внешним кодом и берем его ID
4) Подставляем в элемент свойство MANUFACTURER найденное выше.
Привожу код ниже, может кому пригодиться.
PS: В PHP и с Битриксом особо не работал, так что если есть замечания по коду, welcome!
[CODE]AddEventHandler("catalog", "OnBeforeProductUpdate", "MyOnBeforeProductUpdate");
AddEventHandler("catalog", "OnBeforeProductAdd", "MyOnBeforeProductAdd");
function MyOnBeforeProductUpdate($ID, $arFields)
{
// Получаем все
$element = CCatalogProduct::GetByIDEx($ID);
ModifyProduct($ID, $element);
}
function MyOnBeforeProductAdd($arFields)
{
$element = CCatalogProduct::GetByIDEx($arFields["ID"]);
ModifyProduct($arFields["ID"], $element);
}
function ModifyProduct($ID, $element)
{
$ELEMENT_ID = $ID; // код элемента
$PROPERTY_CODE = "MANUFACTURER"; // код свойства
$PROPERTY_VALUE = ""; // значение свойства
$MANUFACTURER_ELEMENT_ID = 4; // код инфоблока "Производители"
// Установим новое значение для данного свойства данного элемента
$dbr = CIBlockElement::GetList(array(), array("=ID"=>$ELEMENT_ID), false, false, array("ID", "IBLOCK_ID"));
if ($dbr_arr = $dbr->Fetch())
{
// 1. Прочитаем свойство CML2_MANUFACTURER
$CML2_MANUFACTURER = $element["PROPERTIES"]["CML2_MANUFACTURER"]["VALUE_ENUM"];
$CML2_MANUFACTURER_XML_ID = $element["PROPERTIES"]["CML2_MANUFACTURER"]["VALUE_XML_ID"];
// 2. Смотрим, есть ли в блоке производители с таким $CML2_MANUFACTURER_XML_ID и если нет добавляем
$dbrp = CIBlockElement::GetList(array(), array("=EXTERNAL_ID"=>$CML2_MANUFACTURER_XML_ID), false, false, array());
if ($dbrp->Fetch() === false) {
$el = new CIBlockElement;
$fields = array(
'IBLOCK_ID' => 4,
'NAME' => $CML2_MANUFACTURER,
'ACTIVE' => "Y",
'SEARCHABLE_CONTENT' => $CML2_MANUFACTURER,
'CREATED_BY' => '1',
'MODIFIED_BY' => '1',
'DATE_CREATE' => time(),
'CODE' => $CML2_MANUFACTURER_XML_ID,
'EXTERNAL_ID' => $CML2_MANUFACTURER_XML_ID
);
$PROPERTY_VALUE = $el->Add($fields);
if (!$PROPERTY_VALUE) {
AddMessage2Log("Error[" . $PROPERTY_VALUE . "]: " . $el->LAST_ERROR . '<br />');
}
}
// 3. Выбираем в блоке производители производителя с внешним кодом CML2_MANUFACTURER_XML_ID
$dbrp = CIBlockElement::GetList(array(), array("=EXTERNAL_ID"=>$CML2_MANUFACTURER_XML_ID), false, false, array());
if ($dbrp_arr = $dbrp->Fetch())
{
$PROPERTY_VALUE = $dbrp_arr["ID"];
}
// 4. Присваиваем полю MANUFACTURER найденное значение
$IBLOCK_ID = $dbr_arr["IBLOCK_ID"];
CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUE, $PROPERTY_CODE);
}
}
[/CODE]