Сегодня научимся пользоваться множественным фильтром по нескольким значениям списка в инфоблоках 1С Битрикс.
Рассмотрим это на примере конкретной задачи: Отфильтровать и вывести все элементы, у которых не задано значение "Инструмент для бригадира".
Свойство инфоблока CONTRACTOR_GROUP
типа список + множественное свойство (вот здесь есть особенность)
В документации для СIBlockElement::GetList()
будет предложено несколько вариантов фильтрации, самое первое, что приходит в голову.
'!PROPERTY_CONTRACTOR_GROUP_VALUE' => 'Инструмент для бригадира', или '!=PROPERTY_CONTRACTOR_GROUP' => 131, или '!PROPERTY_CONTRACTOR_GROUP' => array(131),
Но рабочим без ошибок будет только вариант с подзапросами Пример №5
//Пример 5: для фильтрации по нескольким значениям множественного свойства, нужно использовать подзапросы. if(CModule::IncludeModule("iblock")){ $rs = CIBlockElement::GetList( array(), array( "IBLOCK_ID" => 21, array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7405))), array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7410))), array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7417))) ), false, false, array("ID") ); while($ar = $rs->GetNext()) { echo "<pre>"; print_r($ar); echo "</pre>"; } }
Я не словил ошибку, когда у элемента было задано всего одно значение свойства и фильтр выглядел так, он работал.
'!PROPERTY_CONTRACTOR_GROUP_VALUE' => 'Инструмент для бригадира',
А когда задал несколько значений, то ошибка проявилась, итоговый пример рабочего фильтра.
use \Bitrix\Main\Loader; use \Bitrix\Main\Localization\Loc; require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php"); if(Loader::includeModule("iblock")) { $filter = array( "IBLOCK_ID" => 49, array("!ID" => \CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 49, "PROPERTY_CONTRACTOR_GROUP" => 131))), ); $rsElement = CIBlockElement::GetList(false,$filter); while($row = $rsElement->Fetch()) { echo "<pre>"; print_r($row["ID"] . ": ". $row["NAME"]); echo "</pre>"; } }
49
- это айди инфоблока
131
- этой айди значения свойства "Инструмент для бригадира", его надо исключить отрицанием !ID