В 1С-Битрикс есть несколько способов посмотреть SQL-запрос в текстовом виде, который формирует метод getList (как для D7 ORM, так и для старого API). Ниже приведены основные подходы.
Способ 1. SqlTracker (рекомендуемый)
Самый популярный и гибкий способ — использовать класс Bitrix\Main\Diag\SqlTracker. Он перехватывает все SQL-запросы между startTracker() и stopTracker().
Полный пример для ORM D7:
$connection = \Bitrix\Main\Application::getConnection();
// Запускаем трекинг (true — начать новый трекинг)
$connection->startTracker(true);
// Выполняем getList
$result = \Bitrix\Main\UserTable::getList([
'filter' => ['ACTIVE' => 'Y'],
'limit' => 5,
])->fetchAll();
// Получаем объект трекера
$tracker = $connection->getTracker();
// Останавливаем трекинг
$connection->stopTracker();
// Перебираем все перехваченные запросы
$queries = $tracker->getQueries();
foreach ($queries as $query) {
echo 'SQL: ' . $query->getSql() . '<br>';
echo 'Время: ' . round($query->getTime(), 5) . ' сек.<hr>';
}
Метод $query->getSql() возвращает непосредственно текст SQL-запроса. Дополнительно доступны:
getTime()— время выполнения в секундах;getTrace()— стек вызовов (где был выполнен запрос);getBinds()— значения параметров, подставленные в запрос.
Способ 2. getTrackerQuery() у результата выборки
У объекта Bitrix\Main\DB\Result есть метод getTrackerQuery(), который позволяет получить объект последнего запроса напрямую:
$result = \Bitrix\Main\UserTable::getList([
'filter' => ['=ID' => 1],
]);
// Получаем объект запроса трекера
$trackerQuery = $result->getTrackerQuery();
if ($trackerQuery) {
echo 'SQL: ' . $trackerQuery->getSql();
echo '<br>';
echo 'Время: ' . $trackerQuery->getTime() . ' сек.';
}
Этот способ удобен, когда нужно «подсмотреть» SQL для одного конкретного вызова getList.
Способ 3. Запись лога SQL-запросов в файл
SqlTracker также умеет писать все запросы в файл:
$tracker = \Bitrix\Main\Application::getConnection()->startTracker(true);
// Указываем путь к лог-файлу
$logPath = $_SERVER['DOCUMENT_ROOT'] . '/upload/sql_queries.log';
$tracker->startFileLog($logPath);
// Выполняем запросы
$result = \Bitrix\Main\UserTable::getList(['filter' => ['ACTIVE' => 'Y']])->fetchAll();
// Останавливаем запись в файл
$tracker->stopFileLog();
Способ 4. Встроенный профайлер в админке
Если сайт работает в режиме отладки (define('BX_DEBUG', true); или SITE_CHARSET != "windows-1251"), в нижней части страницы административного интерфейса появляется панель профайлера. Там есть вкладка SQL, где отображаются все выполненные запросы, их текст и время выполнения.
Включить режим отладки можно в файле bitrix/.settings.php:
'exception_handling' => [
'value' => [
'debug' => true,
],
],
Важно: не включайте режим отладки на боевом (production) сайте без необходимости, так как это может замедлить работу и раскрыть служебную информацию.