29.07.2017 09:54:00 887

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

Свойство инфоблока CONTRACTOR_GROUP типа список и множественное
Свойство инфоблока CONTRACTOR_GROUP типа список и множественное

В документации для СIBlockElement::GetList()  будет предложено несколько вариантов фильтрации, самое первое, что приходит в голову

'!PROPERTY_CONTRACTOR_GROUP_VALUE' => 'Инструмент для бригадира',
или
'!=PROPERTY_CONTRACTOR_GROUP' => 131,
или
'!PROPERTY_CONTRACTOR_GROUP' => array(131),

Но рабочим без ошибок будет только вариант с подзапросами  Пример №5

<?php
//Пример 5: для фильтрации по нескольким значениям множественного свойства, нужно использовать подзапросы.
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' => 'Инструмент для бригадира',

А когда задал несколько значений, то ошибка проявилась, итоговый пример рабочего фильтра

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

use \Bitrix\Main\Loader;
use \Bitrix\Main\Localization\Loc;

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

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