Есть стандартный компонент bitrix:sale.bestsellers. Если магазин стандартный, должен работать из коробки. Но иногда бывают сбои, не всегда работает корректно, т.к. для его работы используется отдельная таблица в базе данных, куда заносятся данные, они не берутся напрямую из списка заказов.
Если делать самому, то есть два способа:
1. Простой способ. Берем все неотмененные заказы, получаем массив их ID. После этого ищем все корзины с ИД этих заказов, оттуда получаем массив ид товара - количество. Аналогично можно найти все оплаченные заказы.
[CODE]$arOrderIDs = Array();
$orders = CSaleOrder::GetList (Array(), Array ("!CANCELED" => "Y"), false, false, Array ("ID"));
while ($arOrder = $orders->Fetch())
{
$arOrderIDs[] = $arOrder["ID"];
}
$arItemIDs = Array();
$baskets = CSaleBasket::GetList (Array(), Array ("ORDER_ID" => $arOrderIDs), false, false, Array ("PRODUCT_ID", "QUANTITY"));
while ($arBasket = $baskets->Fetch())
{
if ($arItemIDs[$arBasket["PRODUCT_ID"]])
{
$arItemIDs[$arBasket["PRODUCT_ID"]] += $arBasket["QUANTITY"];
}
else
{
$arItemIDs[$arBasket["PRODUCT_ID"]] = $arBasket["QUANTITY"];
}
}[/CODE]Сортируем массив ид по количеству. Выбираем все товары с этими ИД, сортируем массив товаров по количеству.
Эти запросы можно закэшировать, а при оформлении нового заказа кэш сбрасывать (повесить обработчик события оформления заказа)
2. Хранить "покупаемость" товара в свойстве. Создаем новое свойство типа "Число".
Делаем обработчик события оформления заказа. После каждого оформления получаем ИД товаров из корзины этого заказа. Для каждого товара обновляем счетчик "покупаемости". (прибавляем количество из корзины). В этом случае можно будет сделать нормальную сортировку по нашему новому свойству в любом месте сайта.