Встречаются ситуации, когда необходимо вывести товары со скидками в 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"]); //очистим информацию о разделе