← Назад к справке

Модули

Структура, install/index.php, установка и удаление

Рабочая справка по структуре локального модуля Bitrix: папки, install/index.php, установка, удаление, копирование файлов и регистрация модуля.

Локальный модуль лучше хранить в /local/modules, а не в /bitrix/modules. В ядро Битрикса свои файлы лучше не класть.

Структура модуля

Модуль — это отдельная папка с установщиком, служебными файлами, PHP-классами, настройками, ресурсами и, при необходимости, миграциями.

Где хранить модуль

Для своих доработок обычно используется папка /local/modules. Например:

/local/modules/test.example/

ID модуля лучше делать в формате vendor.module: коротко, латиницей, без пробелов. Например: test.chatsearch, test.multiscrum, local.crmtools.

Минимальная структура

/local/modules/test.example/
├── include.php
├── options.php
├── default_option.php
├── install/
│   ├── index.php
│   ├── version.php
│   ├── components/
│   ├── js/
│   ├── css/
│   └── db/
│       └── mysql/
│           ├── install.sql
│           └── uninstall.sql
└── lib/
    ├── Service/
    │   └── ExampleService.php
    ├── Model/
    │   └── ExampleTable.php
    └── Controller/
        └── Example.php

Не все папки обязательны. Если модуль не создаёт таблицы, не нужны SQL-файлы. Если нет публичных JS/CSS, не нужны папки install/js и install/css.

Что за что отвечает

Файл или папка Назначение
install/index.php Установщик и удаление модуля.
install/version.php Версия модуля и дата версии.
include.php Подключается при Loader::includeModule().
default_option.php Значения настроек модуля по умолчанию.
options.php Страница настроек модуля в админке.
lib/ Классы модуля для автозагрузки.
install/js, install/css Ресурсы, которые при установке копируются в /local/js или /local/css.

install/index.php

Главный файл установщика. В нём описывают класс модуля, установку, удаление, создание таблиц, копирование файлов и регистрацию событий.

Класс установщика

Имя класса установщика обычно повторяет ID модуля, но точка заменяется на подчёркивание: test.exampletest_example.

<?php

use Bitrix\Main\Application;
use Bitrix\Main\ModuleManager;

class test_example extends CModule
{
    public $MODULE_ID = 'test.example';
    public $MODULE_NAME = 'Пример модуля';
    public $MODULE_DESCRIPTION = 'Рабочий пример локального модуля';
    public $PARTNER_NAME = 'IT-Solution';
    public $PARTNER_URI = 'https://example.local';

    /**
     * Заполняет версию модуля.
     */
    public function __construct()
    {
        $version_file = __DIR__ . '/version.php';

        if (file_exists($version_file)) {
            $arModuleVersion = [];
            include $version_file;

            $this->MODULE_VERSION = $arModuleVersion['VERSION'] ?? '1.0.0';
            $this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE'] ?? '2026-01-01 00:00:00';
        }
    }
}

Для новых PHP-версий нужен именно __construct(), а не старый конструктор вида function test_example().

DoInstall и DoUninstall

DoInstall() вызывается при установке, DoUninstall() — при удалении.

/**
 * Устанавливает модуль.
 */
public function DoInstall(): void
{
    global $APPLICATION;

    $this->installDb();
    $this->installFiles();
    $this->installEvents();

    ModuleManager::registerModule($this->MODULE_ID);

    $APPLICATION->IncludeAdminFile(
        'Установка модуля ' . $this->MODULE_NAME,
        __DIR__ . '/step.php'
    );
}

/**
 * Удаляет модуль.
 */
public function DoUninstall(): void
{
    global $APPLICATION;

    $this->uninstallEvents();
    $this->uninstallFiles();
    $this->uninstallDb();

    ModuleManager::unRegisterModule($this->MODULE_ID);

    $APPLICATION->IncludeAdminFile(
        'Удаление модуля ' . $this->MODULE_NAME,
        __DIR__ . '/unstep.php'
    );
}

installDb и uninstallDb

Если модуль создаёт свои таблицы, это можно сделать через SQL-файлы или через ORM. Простой вариант — выполнить SQL из папки install/db/mysql.

/**
 * Создаёт таблицы модуля.
 */
public function installDb(): bool
{
    $connection = Application::getConnection();
    $sql_file = __DIR__ . '/db/mysql/install.sql';

    if (file_exists($sql_file)) {
        $connection->executeSqlBatch(file_get_contents($sql_file));
    }

    return true;
}

/**
 * Удаляет таблицы модуля.
 */
public function uninstallDb(): bool
{
    $connection = Application::getConnection();
    $sql_file = __DIR__ . '/db/mysql/uninstall.sql';

    if (file_exists($sql_file)) {
        $connection->executeSqlBatch(file_get_contents($sql_file));
    }

    return true;
}

В свежем коде часто удобнее делать миграции через PHP-классы, а не хранить всю логику в install.sql.

installFiles и uninstallFiles

Если модуль должен отдавать JS, CSS или компоненты, при установке файлы копируют в публичные папки.

/**
 * Копирует публичные файлы модуля.
 */
public function installFiles(): bool
{
    CopyDirFiles(
        __DIR__ . '/js',
        $_SERVER['DOCUMENT_ROOT'] . '/local/js/' . $this->MODULE_ID,
        true,
        true
    );

    CopyDirFiles(
        __DIR__ . '/css',
        $_SERVER['DOCUMENT_ROOT'] . '/local/css/' . $this->MODULE_ID,
        true,
        true
    );

    return true;
}

/**
 * Удаляет публичные файлы модуля.
 */
public function uninstallFiles(): bool
{
    DeleteDirFilesEx('/local/js/' . $this->MODULE_ID);
    DeleteDirFilesEx('/local/css/' . $this->MODULE_ID);

    return true;
}

Установка и удаление

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

Установить модуль

  1. Положить модуль в /local/modules/test.example.
  2. Открыть админку.
  3. Перейти в раздел модулей.
  4. Найти модуль по названию.
  5. Нажать «Установить».

Если модуль не появился, сначала проверь путь, имя класса в install/index.php и значение MODULE_ID.

Удалить модуль

Удаление должно откатить то, что было создано установкой: события, публичные файлы, таблицы, агенты, права и настройки.

Если таблицы с данными удалять опасно, можно сделать параметр «сохранить данные» на шаге удаления. Это лучше вынести в отдельную логику, а не удалять таблицы всегда.

Частые ошибки

Ошибка Что проверить
Модуль не виден в админке Путь, имя папки, класс в install/index.php, отсутствие синтаксических ошибок.
Ошибка уровня доступа метода Методы installDb(), uninstallDb() и похожие лучше делать public.
Модуль установился, но классы не находятся include.php, namespace, путь в lib, автозагрузка.
Файлы JS/CSS не подключаются Куда они скопированы и какой путь передан в Asset::addJs() или Asset::addCss().

Источники