Главная » API Битрикс » CModule::IncludeModule — подключение модулей в Битрикс

CModule::IncludeModule — подключение модулей в Битрикс

Сравнение CModule::IncludeModule и Loader::includeModule в Битрикс: оба проверяют подключение модуля

CModule::IncludeModule — предшественник современного Loader::includeModule из D7. В коде старого ядра и во множестве чужих решений из Маркетплейса он встречается до сих пор, и разработчику важно понимать оба варианта одинаково хорошо.

Базовый вызов

<?php

if (CModule::IncludeModule('iblock')) {
    $result = CIBlockElement::GetList([], ['IBLOCK_ID' => 5]);
} else {
    // модуль недоступен
}

Метод возвращает true при успешном подключении и false при неудаче — точно так же, как его современный аналог. Разница не в поведении, а в реализации: CModule::IncludeModule относится к старому ядру и не использует пространства имён.

Чем отличается от Loader::includeModule

CModule::IncludeModule Loader::includeModule
ЯдроСтарое (main.core)D7
Пространство имёнНетBitrix\Main\Loader
Проверка установки отдельноНе предусмотрена штатноModuleManager::isModuleInstalled()
Рекомендуется для нового кодаНетДа
Результат для одного и того же модуляИдентичен

Оба метода в итоге проверяют одно и то же состояние модуля — подключён он или нет. Смешивать их в одном проекте не страшно: подключение через один способ делает класс доступным независимо от того, каким методом его вызвали в другом месте кода.

Нужна помощь с Битрикс?





    Диагностика, если возвращает false

    Причины неудачного подключения одинаковы для обоих методов: опечатка в системном имени модуля, модуль не установлен, отсутствует в редакции продукта или истекла лицензия. Точное имя модуля всегда можно свериться со списком в разделе Настройки → Настройки продукта → Модули — идентификатор указан там же, рядом с названием.

    Где встречается сегодня

    • в компонентах старого ядра, которые до сих пор используются на многих сайтах;
    • в решениях из Маркетплейса, написанных до перехода на D7;
    • в проектах с большой историей, где переход на новый способ не был завершён.

    Переписывать существующий рабочий код только ради замены на Loader::includeModule обычно не имеет практического смысла — поведение идентично. А вот в новом коде разумно сразу использовать современный способ: он даёт больше инструментов диагностики через ModuleManager.

    Проверка перед подключением

    У обоих методов общая практическая проблема: сам вызов не объясняет, почему подключение не удалось — отсутствие модуля, недоступность в редакции продукта и истёкшая лицензия выглядят одинаково, просто как false. Для старого способа удобно совмещать проверку с современным классом диагностики:

    <?php
    
    use Bitrix\Main\ModuleManager;
    
    $moduleId = 'catalog';
    
    if (!CModule::IncludeModule($moduleId)) {
        if (!ModuleManager::isModuleInstalled($moduleId)) {
            echo 'Модуль не установлен или отсутствует в редакции';
        } else {
            echo 'Модуль установлен, но подключить не удалось — проверьте лицензию';
        }
    }

    Такая связка работает независимо от того, каким способом — старым или новым — вы подключаете сам модуль: ModuleManager относится к диагностике состояния, а не к самому подключению, и одинаково пригоден в обоих случаях.

    Итог

    CModule::IncludeModule и Loader::includeModule решают одну и ту же задачу — подключение модуля перед использованием его классов — и возвращают одинаковый результат для одного и того же модуля. Первый относится к старому ядру и встречается в унаследованном коде, второй — стандарт для всего, что пишется сегодня.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний