ну, допустим, на костыли я фильтр поставила.
OnAfterIBlockElementUpdate и OnAfterIBlockElementAdd заполняют поля-родители от первого уроня до уровня текущего типа.
[CODE]AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyClass1", "OnAfterIBlockElementAddHandler"));
class MyClass1
{
function OnAfterIBlockElementAddHandler(&$arFields)
{
$IBLOCK_ID = 27;
$TYPE_IBLOCK_ID = 40;
$db_props=array();
$ar_props = array();
$TYPE_XML = "";
$TYPE_ID = "";
$TYPE_LEVEL = 0;
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $arFields["ID"], Array(), Array("CODE"=>"TYPE"));
if($ar_props = $db_props->Fetch())
$TYPE_XML = $ar_props["VALUE"];
else
$TYPE_XML = false;
$db_elems = CIBlockElement::GetList(Array(), Array("IBLOCK_ID"=>IntVal($TYPE_IBLOCK_ID),
X XML_ID"=>$TYPE_XML, "ACTIVE"=>"Y"));
while($ob = $db_elems->GetNextElement()){
$arF = $ob->GetFields();
$TYPE_ID = $arF["ID"];
$arP = $ob->GetProperties();
$TYPE_LEVEL = IntVal($arP["LEVEL"]["VALUE"]);
for($i=1; $i<$TYPE_LEVEL; $i++)
${TYPE_PARENT.$i} = $arP["SUB".$i."PARENT"]["VALUE"];
}
${TYPE_PARENT.$TYPE_LEVEL} = $TYPE_ID;
if($arFields["ID"]>0)
for($i=0; $i<$TYPE_LEVEL; $i++)
{
CIBlockElement::SetPropertyValues($arFields["ID"], $IBLOCK_ID, ${TYPE_PARENT.($i+1)}, "TYPE".$i);
}
else
AddMessage2Log("Error ".$arFields["RESULT_MESSAGE"]);
}
}
[/CODE]в фильтре вывожу поля по этим родителям.
При импорте из csv OnAfterIBlockElementAddHandler срабатывает, но по указаной XML_ID отлавливает не ту ID из инфоблока списков (почему-то в каждой строке одну и ту же) и выводит ее родителей.
Проблема, кажется, в GetProperty (или GetList). По ID (который, если делать вывод в лог, на каждом шаге импорта есть, и притом не пустой) не делается выборка и, соответсвтено, не получается значение свойства с кодом TYPE.