Kint в Bitrix CMS: дебаг без боли вместо var_dump()
Разбираем Kint для Bitrix: зачем он нужен, как поставить через Composer в /local, как включать только на dev через update_devsrv, и 5 практических примеров под D7/ORM/Sale.
Requirements
- Bitrix CMS (коробка) + доступ к /local/
- PHP 7.4+ (лучше 8.x)
- Composer (на локалке или сервере)
Kint в Bitrix CMS: дебаг без боли вместо var_dump()
В Bitrix отладка часто выглядит как археология: var_dump($arResult); die; и молитва, чтобы это не улетело на прод. Kint — это “var_dump для людей”: раскрывающиеся структуры, поиск по дампу, нормальный вывод объектов и подсказки путей доступа к данным. На Bitrix’овых объектах (ORM, Sale, Request, Event) это экономит часы. (GitHub)
Главное правило: Kint должен быть выключен в продакшене или включаться только для разработки/твоего IP. Так и рекомендуют сами авторы. (Kint)
Почему Kint особенно хорош именно в Bitrix
Bitrix любит:
- огромные массивы
$arResult,$arParams; - объекты ORM/Entity/Sale, которые в
var_dump()превращаются в “простыню”; - события, где “кто и откуда вызвал” — половина расследования.
Kint даёт:
- читабельный вывод даже сложных объектов;
- быстрый поиск внутри структуры;
- удобную навигацию по вложенности (без 20
print_rподряд). (GitHub)
Установка Kint в Bitrix через Composer (правильный путь)
Ставим в /local, чтобы не трогать ядро.
1) Установить пакет
cd /path/to/site/local
composer require kint-php/kint --dev
На Packagist это официальный способ установки. (Packagist)
2) Подключить autoload
Файл: /local/php_interface/init.php (или /bitrix/php_interface/init.php, если проект старый — но обычно всё уже в /local)
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/vendor/autoload.php';
Включать только на dev: Bitrix-способ через update_devsrv
В Bitrix есть штатный флаг “Установка для разработки” — это опция main:update_devsrv. Её можно проверять через D7 API \Bitrix\Main\Config\Option::get(...). (telq.org)
Файл: /local/php_interface/init.php
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/vendor/autoload.php';
use Bitrix\Main\Config\Option;
$isDevInstall = (Option::get('main', 'update_devsrv', 'N') === 'Y'); // dev-установка Bitrix
$isMyIp = in_array($_SERVER['REMOTE_ADDR'] ?? '', ['127.0.0.1', '::1', 'YOUR_IP_HERE'], true);
// Рубильник Kint: true/false или режим рендера
\Kint::$enabled_mode = ($isDevInstall || $isMyIp); // в проде будет false
Про Kint::$enabled_mode и рекомендацию выключать на проде — это из официальных настроек Kint. (Kint)
Практика: dev-установка + свой IP — идеальная комбинация. Даже если кто-то случайно включил dev-флаг, ты всё равно контролируешь доступ.
База: как дампить (и не ломать проект)
Пример 1 — компонент: быстро понять, что реально в $arResult
// template.php
d([
'PARAMS' => $arParams,
'RESULT_KEYS' => array_keys($arResult),
'ITEMS_COUNT' => isset($arResult['ITEMS']) ? count($arResult['ITEMS']) : null,
]);
Это 80% “почему не выводится список/фильтр/пагинация”.
Пример 2 — Request (D7): GET/POST/AJAX без гаданий
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
d([
'method' => $request->getRequestMethod(),
'isAjax' => $request->isAjaxRequest(),
'get' => $request->getQueryList()->toArray(),
'post' => $request->getPostList()->toArray(),
]);
Пример 3 — ORM: что реально вернул getList()
use Bitrix\Main\UserTable;
$rows = UserTable::getList([
'select' => ['ID', 'LOGIN', 'EMAIL', 'ACTIVE'],
'filter' => ['=ACTIVE' => 'Y'],
'limit' => 5,
'order' => ['ID' => 'DESC'],
])->fetchAll();
d($rows);
Удобно, когда фильтр “почему-то не фильтрует”, а на самом деле поле/оператор не тот.
Пример 4 — Sale\Order: статусы, оплаты, отгрузки (коротко и по делу)
use Bitrix\Sale\Order;
$orderId = 123;
$order = Order::load($orderId);
d([
'ID' => $orderId,
'STATUS' => $order->getField('STATUS_ID'),
'PRICE' => $order->getPrice(),
'FIELDS' => $order->getFieldValues(),
]);
Пример 5 — события: “кто вызвал и почему два раза”
AddEventHandler('sale', 'OnSaleOrderSaved', function($event) {
d([
'eventClass' => is_object($event) ? get_class($event) : gettype($event),
'backtrace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8),
]);
});
Да, debug_backtrace() — старая школа, но на событиях Bitrix спасает.
Важно: Kint нельзя просто так пихать в AJAX/JSON
Kint по умолчанию пишет в вывод. Если ты дампишь в AJAX-ответ — привет “сломанный JSON”, и фронт будет плакать.
Для AJAX лучше:
- либо условно дампить только когда это не AJAX,
- либо писать в лог через Bitrix-инструменты.
Минимальная защита:
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
if (!$request->isAjaxRequest()) {
d($data);
}
Kint vs штатный дебаг Bitrix: что когда использовать
- Kint — когда ты смотришь структуру данных “здесь и сейчас” (компоненты, ORM, Sale, события).
- Логи Bitrix — когда нельзя ломать ответ (AJAX/API), или нужно оставить след на сервере.
Если хочешь “по-взрослому” закрывать тему отладки на проекте — добавь ещё логирование и мониторинг. Хорошо ложится рядом:
- https://viku-lov.ru/blog/backend-cron-bitrix-agents-automation
- https://viku-lov.ru/blog/cicd-php-bitrix-laravel-github-actions
Итог
Если ты работаешь с Bitrix и всё ещё дебажишь var_dump + die, Kint — это апгрейд без “внедрения космических технологий”:
- ставится за минуту через Composer,
- включается штатно через
main:update_devsrv, - даёт нормальный вывод D7/ORM/Sale,
- и, главное, снижает шанс случайно вылить отладку на прод.
Ссылки
- Kint на GitHub — репозиторий проекта
- Официальный сайт Kint — документация и примеры
- Kint на Packagist — установка через Composer
- Bitrix D7: Option::get() — документация по проверке dev-установки



Комментарии