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

29 мая 2014

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

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


$arDiscountElementID = $arDiscountSectionID = [];
$dbProductDiscounts = CCatalogDiscount::GetList(
	["SORT" => "ASC"],
	[
		"ACTIVE" => "Y",
		"!>ACTIVE_FROM" => $DB->FormatDate(date("Y-m-d H:i:s"), "YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")),
		"!<ACTIVE_TO" => $DB->FormatDate(date("Y-m-d H:i:s"), "YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")),
		"COUPON" => ""
	],
	false,
	false,
	["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 = ["SECTION_ID" => $arDiscountSectionID, "IBLOCK_ID" => $arParams["IBLOCK_ID"], "INCLUDE_SUBSECTIONS" => "Y", "ACTIVE_DATE" => "Y", "ACTIVE" => "Y"];
	$arSelectFields = ["IBLOCK_ID", "ID"];
	$res = CIBlockElement::GetList([], $arFilter, false, false, false, $arSelectFields);
	while($arFields = $res->Fetch()) {
		$arDiscountElementID[] = $arFields["ID"];
	}
}

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

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