Чтобы понять причину «неправильно» работающей выборки, нужно посмотреть какой sql-запрос формирует гет-лист. Рассмотрим на примере выборок из ORM ядра D7 в битриксе.

Немного ковыряния в ядре и вуаля.

Собственно код:

<?php
 
use \Bitrix\Main\Application;
use \Bitrix\Main\Loader;
use \Bitrix\Iblock\SectionTable;
 
if (Loader::includeModule('iblock')) {
 
    Application::getConnection()->startTracker();
 
    $catalogSectionsIterator = SectionTable::getList(array(
        'select' => array('ID'),
        'filter' => array(
            '=IBLOCK_SECTION_ID' => $arSection['ID'], 
            '=IBLOCK_ID' => $arSection['IBLOCK_ID']
        ),
    ));
 
    echo '<pre>', $catalogSectionsIterator->getTrackerQuery()->getSql(), '</pre>';
 
}

На выходе получим:

SELECT 
    `iblock_section`.`ID` AS `ID`
FROM `b_iblock_section` `iblock_section` 
 
WHERE `iblock_section`.`IBLOCK_SECTION_ID` = 976
AND `iblock_section`.`IBLOCK_ID` = 146


Обновлено 11.03.2015

Если составляем запрос напрямую, через объект Entity\Query, то всё ещё проще: у него есть метод getLastQuery();

$query = new Bitrix\Main\Entity\Query(Bitrix\Iblock\ElementTable::getEntity());
 
echo '<pre>', $query->getLastQuery(), '</pre>';

Так же метод dump() для вывода детальной трассировки составленного запроса:

$query = new Bitrix\Main\Entity\Query(Bitrix\Iblock\ElementTable::getEntity());
 
echo '<pre>', $query->dump(), '</pre>';