Связка с ядром
В типовом приложении основная масса запросов идёт через ORM таблицы и высокоуровневые классы модулей. Тем не менее административные задачи, отладка, временные импорты и интеграции порой быстрее закрыть низкоуровневым API. Точкой входа в D7 становится объект Bitrix\\Main\\DB\\Connection, который можно взять у стартового приложения.
Основная и именованная базы
Дефолтный пул читают без аргумента. Дополнительный задаёт тем же методом строкой ключа из секции подключений (имя второго блока массива connections в /bitrix/.settings.php или переопределениях через окружение). Если ключа нет, при создании упадёте уже на этапе разбора конфигурации — это нормальная диагностика опечаток.
use Bitrix\\Main\\Application;
$primaryLink = Application::getConnection();
$coldArchiveLink = Application::getConnection('warehouse_archive');
Селекты, одиночное число и DML без результата
Метод query() даёт объект результата; пока нужны строки, вызывают fetch(). Для простого счётчика удобнее queryScalar() — минус лишний цикл по одной ячейке. Изменение схемы или данных без ожидания набора строк обычно отправляют в queryExecute().
use Bitrix\\Main\\Application;
$conn = Application::getConnection();
$cursor = $conn->query("SELECT ID, SORT FROM staging_queue ORDER BY SORT ASC");
while ($queueRow = $cursor->fetch()) {
echo (string)$queueRow['ID'];
}
$activeRows = (int)$conn->queryScalar("SELECT COUNT(1) FROM staging_queue WHERE IS_RUN = 'Y'");
$conn->queryExecute("INSERT INTO audit_trace(code, logged_at) VALUES('sync_ok', UNIX_TIMESTAMP())");
Для производительности на больших выборках добавляют LIMIT и нужные столбцы сразу в текст SQL. Расширенные сигнатуры некоторых версий допускали отдельные аргументы лимита — ориентируйтесь на документацию вашей редакции перед копированием старых сниппетов один в один.
Строковые параметры и SqlHelper
Динамический фрагмент, который всё-таки вставили в текст запроса, лучше прогонять через getSqlHelper()->forSql(): он режет строку до лимита длины и добавляет нужное экранирование для литералов. Полностью пользовательские конструкции безопаснее закрывают параметризацией на уровне драйвера или ORM, потому что «склеенный из кусков» SQL остаётся классической зоной риска.
use Bitrix\\Main\\Application;
$conn = Application::getConnection();
$dialectTools = $conn->getSqlHelper();
$incomingLabel = isset($_REQUEST['marker']) ? (string)$_REQUEST['marker'] : '';
$safeSnippet = $dialectTools->forSql($incomingLabel, 96);
$conn->queryExecute(
"UPDATE staging_queue SET memo = '" . $safeSnippet . "' WHERE id = " . (int)$primaryKeyQueue
);
Что держать в голове
- Веб-запросы к БД — горячее место: избегайте «сырой» интерполяции без типизации и санитизации.
- Долгоживущие соединения к дополнительным инстансам проверьте под нагрузкой: пул уже управляется приложением, лишних ручных
pconnectне нужно. - Смесь старого
$DBи D7 возможна только на переходном коде — для нового лучше оставаться наConnection.
Итог
Application::getConnection() централизует доступ к нужному пулу, а связка query/queryScalar/queryExecute покрывает большинство сценариев низкой обвязки. Оставляйте прямые SQL только там, где ORM уже мешает, и не забывайте про параметры вместо ручной склейки значений.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии