Понимание ядра D7 в Битрикс: отличия, примеры, преимущества

Небольшая обзорная статья по Битрикс D7. Сначала идёт развернутое описание и сравнение со старым ядром, затем приводятся примеры использования.

Понимание Битрикс D7

1. Введение

Ядро D7 (иногда просто D7) – это современное ядро для платформы Bitrix Framework, которое пришло на смену старому «процедурному» ядру. Оно призвано упростить и стандартизировать процесс разработки на 1С-Битрикс, а также сделать код более гибким, безопасным и легко поддерживаемым. В рамках D7 была реализована концепция, основанная на принципах современного программирования: использование неймспейсов (namespaces), ORM (Object-Relational Mapping), событийной модели, стандартов PSR и т.д.

2. История и отличия от старого ядра

2.1 Старое ядро

  • Процедурный подход
    В старом ядре активно использовался процедурный код, глобальные переменные, функции с префиксами C..., что усложняло отладку и сопровождение.
  • Ограниченная модульность
    Модули были разделены, но структурно часто переплетались: чтобы изменить часть функционала, приходилось «влезать» в код ядра, что могло привести к проблемам при обновлении.
  • Отсутствие полноценного ORM
    Работа с БД шла через классические запросы SELECT, INSERT, UPDATE. Упрощённых оберток или вспомогательных функций иногда не хватало для сложных операций.
  • Событийная модель
    Система событий существовала, но работала не всегда единообразно. Приходилось создавать обработчики через AddEventHandler, часто разбросанные по разным файлам.

2.2 Новое ядро D7

  • Объектно-ориентированный подход
    Использование неймспейсов, классов и интерфейсов с PSR-совместимым кодом. Код стал более структурированным и гибким.
  • Отдельные пространства имён
    Модули помещены в пространство имён: например, Bitrix\Main\, Bitrix\Sale\, Bitrix\Iblock и т.д.
  • ORM (Object-Relational Mapping)
    Введена своя ORM-библиотека, которая сильно упрощает работу с БД и позволяет писать код, не беспокоясь о тонкостях SQL-запросов.
  • Новая событийная модель
    Используется класс EventManager, который даёт больше контроля при регистрации и выполнении обработчиков.
  • Автозагрузка (Autoload)
    Автоматическая загрузка классов (PSR-4-подобный механизм), что уменьшает необходимость подключать файлы вручную.
  • Соблюдение стандартов
    Код в рамках D7 придерживается стандартов (PSR-1, PSR-2, частично PSR-4), что облегчает интеграцию с различными инструментами и библиотеками.

3. Основные компоненты D7

3.1 ORM

Одним из главных преимуществ D7 является Object-Relational Mapping. ORM позволяет представлять таблицы в базе данных в виде классов-моделей, а строки – в виде объектов.

Класс DataManager
Для каждой таблицы создаётся класс, наследующий Bitrix\Main\Entity\DataManager. Пример (упрощённо для таблицы my_table):


namespace My\Module;

use Bitrix\Main\Entity;

class MyTable extends Entity\DataManager
{
    public static function getTableName()
    {
        return 'my_table';
    }

    public static function getMap()
    {
        return [
            new Entity\IntegerField('ID', [
                'primary' => true,
                'autocomplete' => true
            ]),
            new Entity\StringField('NAME', [
                'required' => true
            ]),
            new Entity\DatetimeField('DATE_CREATE', [
                'default_value' => new \Bitrix\Main\Type\DateTime()
            ]),
        ];
    }
}

Получение данных


use My\Module\MyTable;

$result = MyTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => ['>ID' => 10],
    'order'  => ['ID' => 'DESC'],
    'limit'  => 5
]);

while ($row = $result->fetch()) {
    echo $row['ID'] . ': ' . $row['NAME'] . '<br>';
}

Добавление/обновление записей


// Добавление
$addResult = MyTable::add([
    'NAME' => 'Новая запись'
]);
if ($addResult->isSuccess()) {
    $newId = $addResult->getId();
    echo "Добавлен элемент с ID: " . $newId;
} else {
    print_r($addResult->getErrorMessages());
}

// Обновление
$updateResult = MyTable::update($newId, [
    'NAME' => 'Новое название'
]);
if (!$updateResult->isSuccess()) {
    print_r($updateResult->getErrorMessages());
}

Удаление записей


$deleteResult = MyTable::delete($newId);
if (!$deleteResult->isSuccess()) {
    print_r($deleteResult->getErrorMessages());
}

3.2 Событийная модель (Event Manager)

Вместо старых методов AddEventHandler и т.д. теперь удобно использовать Bitrix\Main\EventManager.

Пример подключения обработчика (например, в файле /bitrix/php_interface/init.php или в своём модуле):


use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'main',
    'OnBeforeUserRegister',
    ['\My\Module\Handlers\User', 'OnBeforeUserRegisterHandler']
);

Класс-обработчик:


namespace My\Module\Handlers;

use Bitrix\Main\Event;

class User
{
    public static function OnBeforeUserRegisterHandler(Event $event)
    {
        $parameters = $event->getParameters();
        // Вносим изменения
        $parameters['FIELDS']['LOGIN'] = strtolower($parameters['FIELDS']['LOGIN']);

        return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $parameters);
    }
}

3.3 Автозагрузка классов

D7 поддерживает автозагрузку по неймспейсам: если класс лежит по пути local/modules/my.module/lib/handlers/user.php, а его пространство имён – My\Module\Handlers, то он подхватится автоматически. В старом ядре приходилось подключать файлы вручную через require_once или CModule::IncludeModule.

3.4 Миграции (не входит в стандарт, но часто используется)

D7 не содержит встроенной системы миграций как, например, Laravel, однако появились сторонние решения, которые часто интегрируются с D7. Они позволяют организовать структуру БД и версии модулей централизованно.

4. Преимущества D7

  1. Упрощение кода
    Меньше boilerplate-кода, больше объектно-ориентированной структуры.
  2. Наглядность
    ORM упрощает чтение и понимание запросов к базе.
  3. Безопасность
    Механизмы валидации и автоматическая экранизация данных снижают риск SQL-инъекций.
  4. Расширяемость
    Новая событийная модель и PSR-автозагрузка упрощают подключение библиотек и сторонних решений.
  5. Поддержка современных стандартов
    Код, написанный по стандартам PSR, легче поддерживать и интегрировать в CI/CD.

5. Примеры использования

5.1 Создание собственного модуля

  1. Структура папок
    local/modules/my.module/
    ├── install/
    │   ├── version.php
    │   ├── ...
    ├── lib/
    │   └── mytable.php
    ├── include.php
    └── ...
    
  2. Создание класса для работы с таблицей
    В lib/mytable.php создаём класс-наследник DataManager.
  3. Регистрация модуля
    В install/index.php прописываем логику установки и удаления модуля.
  4. Подключение обработчиков событий
    В include.php или в lib/eventhandlers.php.

5.2 Использование ORM с фильтрами и группировками


use Bitrix\Main\Type\DateTime;
use My\Module\MyTable;

$result = MyTable::getList([
    'select' => ['COUNT_ID' => new \Bitrix\Main\Entity\ExpressionField('COUNT_ID', 'COUNT(*)')],
    'filter' => [
        '>DATE_CREATE' => new DateTime('01.01.2023')
    ],
    'group' => []
]);

$data = $result->fetch();
echo "Всего элементов: " . $data['COUNT_ID'];

6. Советы и рекомендации

  1. Переходите на D7 постепенно
    Если у вас уже есть проект на старом ядре, не нужно переписывать всё сразу. Можно внедрять D7 в отдельных модулях, новых разделах или функциональных блоках.
  2. Используйте единый стандарт кодирования
    Настройте линтер (PHPCS, PHP CodeSniffer) под PSR, чтобы код был более читаемым.
  3. Документируйте таблицы и поля
    Заполнение getMap() в DataManager — хороший повод внести ясность в типы полей, обязательность и т.д.
  4. Следите за актуальными обновлениями
    Битрикс развивается, в новых версиях могут появляться дополнительные возможности ядра D7.

Итоги

Новая модель D7 в 1С-Битрикс (Bitrix Framework) — это существенный шаг вперёд по сравнению со старым ядром. Она обеспечивает современный подход к разработке, снижает сложность поддержки, улучшает безопасность и стабильность кода. ORM позволяет читать и писать данные, не погружаясь в низкоуровневые SQL-запросы, а продуманная событийная модель повышает гибкость проекта.

Если вы начинаете новый проект, рекомендуется сразу писать код на D7; если у вас уже есть устаревший проект, переход можно выполнять постепенно.

Теги:  D7

Интернет-магазин от 120 000 руб., срок от 4 недель

Платформа для продажи товаров или услуг. Включает интерактивные формы обратной связи в каждой карточке товара, а также множество статичных и динамичных разделов.

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

Компактный сайт, идеально подходящий для старта. На одной странице можно представить ключевые преимущества вашей компании и разместить форму для обратной связи.