Фильтрация товаров по наличию скидок в CMS 1C-Bitrix

29 мая 2014

Встречаются ситуации, когда необходимо вывести товары со скидками в 1C-Bitrix. Стандартных средств фильтрации нет, но можно получить эти товары со скидками, а затем применить фильтр по ним.
Но не всегда скидки в 1С Битриксе создают с привязкой к элементам, а также к разделам.

Следующий код получает ID элементов не только из скидок с привязкой к элементам, но и к разделам.

$arDiscountElementID = $arDiscountSectionID = array();
$dbProductDiscounts = CCatalogDiscount::GetList(
array("SORT" => "ASC"),
array(
"ACTIVE" => "Y",
"!>ACTIVE_FROM" => $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS",
CSite::GetDateFormat("FULL")),
"! $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS",
CSite::GetDateFormat("FULL")),
"COUPON" => ""
),
false,
false,
array(
"ID", "PRODUCT_ID", "SECTION_ID"
)
);
while ($arProductDiscounts = $dbProductDiscounts->Fetch()) {
$arDiscountElementID[] = $arProductDiscounts["PRODUCT_ID"];
if($arProductDiscounts["SECTION_ID"] && !in_array($arProductDiscounts["SECTION_ID"], $arDiscountSectionID))
$arDiscountSectionID[] = $arProductDiscounts["SECTION_ID"];
}
if($arDiscountSectionID) {
$arFilter = Array("SECTION_ID" => $arDiscountSectionID, "IBLOCK_ID" => $arParams["IBLOCK_ID"], "INCLUDE_SUBSECTIONS" => "Y", "ACTIVE_DATE" => "Y", "ACTIVE" => "Y");
$arSelectFields = Array("IBLOCK_ID", "ID");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, false, $arSelectFields );
while($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
$arDiscountElementID[] = $arFields["ID"];
}
}

Если фильтр нужно применить, например, для store.catalog.top или catalog.section, определим его

global $arrFilter; //где arrFilter - название фильтра
$arrFilter = array("ID" => $arDiscountElementID);
unset($arResult["VARIABLES"]); //очистим информацию о разделе