Решил.
1. Есть событие на действия и условия. Нужно различать когда когда и какое использовать(это была моя главная ошибка)
2. в моем случае нужно использовать OnCondSaleActionsControlBuildList, а не OnCondSaleControlBuildList
3. само решение:
public static function Generate($arConditions, $arParams, $control, $subs = false)
{
$resultValues = array();
$arValues = false;
if (is_string($arControl))
{
$arControl = static::GetControls($arControl);
}
$boolError = !is_array($arControl);
if (!$boolError)
{
$arValues = static::Check($arOneCondition, $arOneCondition, $arControl, false);
$boolError = (false === $arValues);
}
if($arOneCondition['logic']=='Equal')
{
$logic='true';
}
else
{
$logic='false';
}
$strResult = '(SaleActionDeactivateDiscount::qDiscAction('.$arParams['BASKET_ROW'].','.$arConditions['value'].'))=='.$logic;
return $strResult;
}
public static function qDiscAction($row,$arCond)
{
//пришлось использовать \Bitrix\Sale\Basket::loadItemsForFUser, т.к. кроме $arParams['BASKET_ROW'] другие параметры по какой-то причине пустые и при попытке их передать в свою функцию напрочь ломают скидки
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), 's1');
$linia=[];
foreach ($basket as $basketItem) {
$mxResult = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
$dbEl = \CIBlockElement::GetList(array('sort' => 'asc'), array('ID' => $mxResult), false, false, Array('ID','PROPERTY___2'));
while($obEl = $dbEl->Fetch())
{
$linia[$obEl['PROPERTY___2_VALUE']]['ID'][]=$basketItem->getProductId();
$linia[$obEl['PROPERTY___2_VALUE']]['CNT']+=$basketItem->getQuantity();
}
}
foreach($linia as $ln=>$massa){
if($massa['CNT']>=$arCond && in_array($row['PRODUCT_ID'],$massa['ID'])){
return false;
}
}
return true;
}