[Битрикс, Инфоблоки] Множественный фильтр по нескольким значениям списка

29.07.2017

Сегодня научимся пользоваться множественным фильтром по нескольким значениям списка в инфоблоках 1С Битрикс.

Рассмотрим это на примере конкретной задачи: Отфильтровать и вывести все элементы, у которых не задано значение "Инструмент для бригадира".
Отфильтровать все элементы, у которых не задано значение

Свойство инфоблока CONTRACTOR_GROUP типа список + множественное свойство (вот здесь есть особенность)
Свойство инфоблока 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

Айди значения свойства

Комментарии
Получать ответы на почту

Разделы
Подписка на статьи
Выберите рассылку
Последние комментарии
Последние комментарии
Кстати, в Windows 7 32 bit максимум 4 GB оперативной памяти можно использовать, даже если зап...
Когда много файлов будет открыто, скорее всего запутаешься в подсветке в дереве, каша получится, с п...
Вообще должна, по умолчанию 32-битный PhpStorm всегда ставился, сам лично не проверял, работаю на Wi...
Прошу ответа(не голословного ОБС, а проверенного) - может ли на Виндовс 7 32 бита работать эта прога...
Возможно временная проблема, 403 это nginx ошибка. Есть еще другая ссылка, там тоже эта ошибка, попр...
http://emmet.io/eclipse/updates адрес не доступен: 403 Forbidden
Да, действительно, спасибо, раньше не замечал. Но там длинная цепочка может быть, подсветка в дереве...