Главная » Ошибки Битрикс » Модуль не подключается: Loader::includeModule возвращает false

Модуль не подключается: Loader::includeModule возвращает false

Диагностика подключения модуля в Битрикс: проверка установки модуля и результата Loader::includeModule

Код падает с ошибкой «Class not found», хотя класс точно существует. Или тихо ничего не делает. Причина в девяти случаях из десяти одна: модуль не подключён, а Loader::includeModule() вернул false, и этого никто не проверил.

Разберём, почему подключение модуля не срабатывает, как быстро найти настоящую причину и как писать код так, чтобы такая ошибка не превращалась в загадку на полдня.

Почему это вообще нужно

Классы модулей в 1С-Битрикс не загружаются автоматически. Пока модуль не подключён, CIBlockElement, CCatalogProduct или Bitrix\Sale\Order для интерпретатора не существуют.

<?php

use Bitrix\Main\Loader;

if (!Loader::includeModule('iblock')) {
    return; // без модуля дальше идти бессмысленно
}

$result = CIBlockElement::GetList([], ['IBLOCK_ID' => 5]);

Метод возвращает true при успехе и false при неудаче. Общее устройство подключения разобрано в статье Loader::includeModule в Битрикс.

Причина 1. Опечатка в имени модуля

Самая частая и самая обидная. Имя модуля — это его системный идентификатор, а не название из интерфейса.

НеверноВерно
iblocksiblock
cataloguecatalog
salessale
currency_modulecurrency
highloadhighloadblock
bizproc_modulebizproc

Точное имя всегда видно в административной части: НастройкиНастройки продуктаМодули. В списке рядом с названием указан идентификатор.

Отдельная ловушка — модули из Маркетплейса. У них имена вида vendor.modulename, и точка в имени обязательна.

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





    Причина 2. Модуль не установлен

    Наличие папки модуля в /bitrix/modules/ ещё не значит, что он установлен. Модуль считается установленным, когда прошла процедура установки: созданы таблицы, зарегистрированы обработчики.

    Проверить можно прямо из кода:

    <?php
    
    use Bitrix\Main\ModuleManager;
    
    var_dump(ModuleManager::isModuleInstalled('catalog'));

    Если возвращается false — идите в список модулей и установите его кнопкой. Частый сценарий: сайт перенесли копированием файлов и базы, а модуль в новой среде оказался не активирован.

    Причина 3. Модуля нет в редакции

    Модули распределены по редакциям продукта. На младшей редакции модуля catalog или sale может просто не быть — и подключить его невозможно, сколько ни проверяй код.

    Как это выглядит на практике:

    • код работает на боевом сервере и падает на тестовом;
    • работал раньше, перестал после смены лицензии;
    • у коллеги работает, у вас нет.

    Проверьте, какая редакция установлена, и есть ли нужный модуль в списке доступных.

    Причина 4. Истекла лицензия

    Когда заканчивается срок действия лицензии или техподдержки, часть функциональности перестаёт работать. Иногда это проявляется именно как невозможность подключить модуль.

    Сопутствующий признак — сообщения о лицензии в административной части. Разбор типичной проблемы есть в статье Лицензия не найдена в Битрикс.

    Причина 5. Модуль отключён вручную

    Модуль можно удалить или деактивировать через административную часть. Если кто-то сделал это ради экономии ресурсов, зависящий от него код перестанет работать.

    Проверяется там же, в списке модулей: у отключённого будет соответствующее состояние.

    Причина 6. Подключение слишком рано

    Loader::includeModule() работает только после инициализации ядра. Вызов в неподходящем месте — например, до подключения пролога — вернёт false или вызовет фатальную ошибку.

    Подходящие места:

    • init.php — ядро уже готово;
    • тело страницы после require пролога;
    • class.php компонента;
    • обработчик события.

    В обработчиках событий важно подключать модуль внутри самого обработчика, а не в момент его регистрации: на этапе регистрации модуль может быть ещё недоступен.

    Причина 7. Ошибка внутри самого модуля

    Реже, но случается: модуль сторонний, при подключении в нём происходит фатальная ошибка, и подключение срывается. Внешне это тоже выглядит как false.

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

    Как быстро найти причину

    Диагностический сниппет, который проверяет всё разом:

    <?php
    
    use Bitrix\Main\Loader;
    use Bitrix\Main\ModuleManager;
    
    $module = 'catalog';
    
    echo 'Установлен: ';
    var_dump(ModuleManager::isModuleInstalled($module));
    
    echo 'Подключается: ';
    var_dump(Loader::includeModule($module));
    
    echo 'Класс существует: ';
    var_dump(class_exists('CCatalogProduct'));

    Трактовка результата:

    УстановленПодключаетсяВывод
    falsefalseМодуль не установлен или его нет в редакции
    truefalseОшибка внутри модуля или проблема с лицензией
    truetrueМодуль в порядке — ищите опечатку в имени класса

    Как писать, чтобы не искать потом

    Главная причина, по которой ошибка превращается в долгие поиски, — результат подключения никто не проверяет.

    Плохо:

    <?php
    
    Loader::includeModule('catalog');
    $price = CPrice::GetBasePrice($id); // упадёт с непонятной ошибкой

    Хорошо:

    <?php
    
    if (!Loader::includeModule('catalog')) {
        \Bitrix\Main\Diag\Debug::writeToFile(
            'Не удалось подключить модуль catalog',
            'MODULE',
            '/local/logs/error.log'
        );
    
        return;
    }
    
    $price = CPrice::GetBasePrice($id);

    Второй вариант при поломке даёт понятную запись в логе вместо загадочного «Class not found» где-то в глубине кода.

    Альтернативный подход — использовать Loader::requireModule(): он выбрасывает исключение вместо возврата false, и проблема обнаруживается сразу, а не через несколько экранов кода.

    Итог

    Если Loader::includeModule() возвращает false, проверяйте по порядку: точное имя модуля, установлен ли он, входит ли в вашу редакцию, активна ли лицензия и не вызывается ли подключение до инициализации ядра.

    Диагностика занимает минуту, если проверить состояние через ModuleManager::isModuleInstalled() рядом с самим подключением. А чтобы такие ситуации вообще не превращались в расследование, результат подключения нужно проверять всегда — либо условием с записью в лог, либо через requireModule() с исключением.

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

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

    Услуги
    База знаний