Ядро D7 — это современная объектная часть Bitrix Framework, которая живёт в пространстве имён Bitrix\Main и работает параллельно со старым процедурным ядром. Понимание его архитектуры — база для чистого кода на платформе.
Два ядра в одном продукте
Исторически 1С-Битрикс развивался как процедурный фреймворк: глобальные объекты $APPLICATION, $USER, $DB, функции вида CIBlockElement::GetList(). Начиная с версии платформы 12.0 в продукт добавили ядро D7 — объектно-ориентированный слой с пространствами имён, автозагрузкой PSR-совместимого вида и строгой типизацией входных данных.
Важно понимать: D7 не заменяет старое ядро, а сосуществует с ним. Оба слоя используют одно и то же подключение к БД и один жизненный цикл запроса. Старые классы (CMain, CUser, CIBlock) остаются рабочими и внутри многих из них уже вызывается новый код.
| Признак | Старое ядро | Ядро D7 |
|---|---|---|
| Расположение | /bitrix/modules/main/classes/ | /bitrix/modules/main/lib/ |
| Именование | Префикс C, глобальные функции | Пространства имён Bitrix\... |
| Загрузка | Ручной require | Автозагрузка по namespace |
| Работа с БД | $DB->Query() | ORM, Application::getConnection() |
Структура каталога lib и модули
Весь код D7 модуля лежит в подкаталоге lib/. Для модуля main это /bitrix/modules/main/lib/. Namespace жёстко привязан к пути: класс Bitrix\Main\Type\DateTime обязан лежать в файле /bitrix/modules/main/lib/type/datetime.php — имя файла в нижнем регистре.
lib/application.php— базовый класс приложения;lib/entity/иlib/orm/— слой ORM;lib/db/— подключения и результаты запросов;lib/type/— типы:DateTime,Date,Dictionary;lib/config/— работа с конфигурацией и опциями.
main это Bitrix\Main, для iblock — Bitrix\Iblock, для sale — Bitrix\Sale. Свой модуль vendor.module получает namespace Vendor\Module.Точка входа и жизненный цикл запроса
Любой публичный запрос проходит через пролог. Стандартная страница подключает header.php шаблона, который тянет /bitrix/modules/main/include/prolog_before.php. Именно здесь инициализируется ядро: создаётся объект приложения, стартует сессия, поднимается менеджер событий.
Инициализация D7 выполняется в статическом методе Application::getInstance(). Дальше через него доступны все системные сервисы:
use Bitrix\Main\Application;
$app = Application::getInstance();
$context = $app->getContext(); // Bitrix\Main\HttpContext
$request = $context->getRequest(); // параметры запроса
$server = $context->getServer(); // переменные сервера
$culture = $context->getCulture(); // языковые настройки
$page = $request->get('page'); // безопасный доступ к $_GET['page']Обратите внимание: $request->get() возвращает null при отсутствии ключа и не вызывает notice, в отличие от прямого обращения к $_GET. Это одна из причин предпочитать D7-обёртки суперглобальным массивам.
Service Locator и системные сервисы
Начиная с main 20.x в ядре появился Service Locator — реестр сервисов, доступный через Bitrix\Main\DI\ServiceLocator. Он читает описания сервисов из .settings.php и позволяет получать объекты по строковому идентификатору, не создавая жёстких зависимостей от конкретных классов.
use Bitrix\Main\DI\ServiceLocator;
$locator = ServiceLocator::getInstance();
if ($locator->has('myvendor.pricecalculator')) {
$calc = $locator->get('myvendor.pricecalculator');
}Регистрация сервиса делается в файле .settings.php в секции services -> value. Можно указать класс-конструктор или фабричный метод constructor. Такой подход упрощает подмену реализации в тестах и разгружает код от прямых new.
Событийная модель D7
Расширение платформы строится на событиях. В D7 за это отвечает Bitrix\Main\EventManager. Регистрация обработчика выполняется в init.php или в doPostInstall() модуля.
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'main',
'OnBeforeUserLogin',
['\\Vendor\\Module\\AuthHandler', 'onBeforeLogin']
);Обработчик получает объект Bitrix\Main\Event, из которого доступны параметры через $event->getParameter(). Вернуть результат можно объектом EventResult — с типом SUCCESS или ERROR. Для ORM-сущностей действуют отдельные события: onBeforeAdd, onAfterUpdate и т. д., которые описываются прямо в классе таблицы.
- события модулей регистрируются глобально в
init.php; - ORM-события удобнее описывать в самом Table-классе;
- для отложенной регистрации используйте
addEventHandlerиз метода установки модуля.
Конфигурация: .settings.php и Option
Ядро D7 хранит системную конфигурацию в файле /bitrix/.settings.php (и переопределениях .settings_extra.php). Там описаны подключения к БД, кэш, обработчики исключений, сервисы. Доступ к значениям — через Bitrix\Main\Config\Configuration.
use Bitrix\Main\Config\Configuration;
$cacheConf = Configuration::getValue('cache');
$connections = Configuration::getInstance()->get('connections');Параметры модулей (то, что раньше жило в COption::GetOptionString()) в D7 читаются через Bitrix\Main\Config\Option:
use Bitrix\Main\Config\Option;
$value = Option::get('vendor.module', 'API_KEY', 'default');
Option::set('vendor.module', 'API_KEY', 'new-value');Значения опций кэшируются в managed cache, поэтому массовое чтение внутри цикла не бьёт по БД.
Совместимость старого и нового кода
На практике проект почти всегда смешивает оба ядра. Это нормально и поддерживается официально. Есть несколько правил, которые снижают боль при таком сосуществовании.
- Новый код пишите на D7: ORM,
Application, типыDateTime. Старые классы вызывайте только там, где D7-аналога нет. - Для дат аккуратно конвертируйте: старое ядро ждёт строку в формате сайта, D7 работает с объектом
Bitrix\Main\Type\DateTime. - Подключайте модуль через
Bitrix\Main\Loader::includeModule('iblock')вместоCModule::IncludeModule().
CIBlockElement в новых редакциях частично опирается на ORM инфоблоков. Поэтому изучение ядра D7 полезно даже тем, кто вынужден поддерживать легаси.Итог
Ядро D7 — это объектный слой Bitrix Framework с пространствами имён, автозагрузкой, единой точкой входа через Application, Service Locator, событийной моделью и типизированной конфигурацией. Оно не отменяет старое ядро, а работает рядом, поэтому грамотный разработчик умеет переключаться между слоями и выбирать D7 для нового кода.
Мы в B2Bsite проектируем архитектуру сложных проектов именно на D7: выносим бизнес-логику в сервисы, строим модули обмена и API поверх ORM. Если нужна масштабируемая основа под рост нагрузки и данных — поможем спроектировать её без легаси-костылей.
Частые вопросы
Чем ядро D7 отличается от старого ядра Битрикс?
D7 — это объектный слой с пространствами имён (Bitrix\Main и др.), автозагрузкой классов, ORM и типизированными данными. Старое ядро процедурное, с классами-префиксами C и глобальными функциями. Они работают параллельно в одном запросе.
Где физически лежит код ядра D7?
В подкаталоге lib каждого модуля, например /bitrix/modules/main/lib/. Путь к файлу строго соответствует пространству имён класса, имя файла в нижнем регистре.
Как получить объект текущего запроса в D7?
Через Application::getInstance()->getContext()->getRequest(). Метод get() у объекта Request безопасно возвращает значение параметра или null без notice.
Что такое Service Locator в Битрикс?
Это реестр сервисов ядра, доступный через Bitrix\Main\DI\ServiceLocator. Он читает описания из .settings.php и выдаёт объекты по строковому идентификатору, ослабляя связанность модулей.
Можно ли смешивать старое ядро и D7 в одном проекте?
Да, это официально поддерживаемый сценарий. Оба ядра используют одно подключение к БД и один жизненный цикл. Новый код разумно писать на D7, а старые API вызывать там, где нет аналога.
Как читать настройки модуля в D7?
Через Bitrix\Main\Config\Option::get() и set(). Системная конфигурация ядра доступна через Configuration::getValue(). Значения опций кэшируются, поэтому частое чтение не нагружает БД.
Нужно ли вручную подключать файлы классов D7?
Нет. Работает автозагрузка по пространству имён: достаточно use нужного класса. Модули подключаются через Loader::includeModule(), после чего их классы доступны автозагрузчику.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.