PHP
#bitrix#module#install#uninstall#RunSQLBatch#CDatabase#CModule

Модуль Битрикс: создание и удаление таблиц при установке (InstallDB / UnInstallDB)

Выполнение install.sql и uninstall.sql через CDatabase::RunSQLBatch при установке и удалении модуля. По документации 1С-Битрикс, с проверкой ошибок и путём от корня модуля.

Как использовать

  1. Положите install.sql и uninstall.sql в install/db/ модуля.
  2. Добавьте методы InstallDB() и UnInstallDB() в класс модуля (CModule).
  3. Вызовите InstallDB() в DoInstall() до registerModule(); UnInstallDB() в DoUninstall() после UnInstallFiles(), до unRegisterModule().
  4. Используйте CREATE TABLE IF NOT EXISTS и DROP TABLE IF EXISTS для идемпотентности.

Закрывает боль: при установке/удалении модуля нужно создавать и удалять свои таблицы через штатный API, без ручного SQL в консоли. По документации Битрикс SQL выполняют через $DB->RunSQLBatch() (путь к .sql-файлу); ошибки нельзя игнорировать.

Структура файлов в модуле:

/local/modules/vendor.simplemodule/
└── install/
    └── db/
        ├── install.sql
        └── uninstall.sql

install/db/install.sql:

CREATE TABLE IF NOT EXISTS vendor_simple_date (
  ID INT NOT NULL AUTO_INCREMENT,
  CREATED_AT DATETIME NOT NULL,
  PRIMARY KEY (ID)
);

install/db/uninstall.sql:

DROP TABLE IF EXISTS vendor_simple_date;

Методы в классе модуля (CModule):

public function InstallDB()
{
    global $DB;

    $sqlPath = $_SERVER['DOCUMENT_ROOT'] . '/local/modules/' . $this->MODULE_ID . '/install/db/install.sql';

    if (file_exists($sqlPath)) {
        $errors = $DB->RunSQLBatch($sqlPath);

        if (is_array($errors) && !empty($errors)) {
            throw new \Bitrix\Main\SystemException(implode("\n", $errors));
        }
    }

    return true;
}

public function UnInstallDB()
{
    global $DB;

    $sqlPath = $_SERVER['DOCUMENT_ROOT'] . '/local/modules/' . $this->MODULE_ID . '/install/db/uninstall.sql';

    if (file_exists($sqlPath)) {
        $errors = $DB->RunSQLBatch($sqlPath);

        if (is_array($errors) && !empty($errors)) {
            throw new \Bitrix\Main\SystemException(implode("\n", $errors));
        }
    }

    return true;
}

Подключение в DoInstall() / DoUninstall():

public function DoInstall()
{
    global $APPLICATION;

    $this->InstallDB();
    $this->InstallFiles();
    \Bitrix\Main\ModuleManager::registerModule($this->MODULE_ID);
    $APPLICATION->IncludeAdminFile('Установка модуля', __DIR__ . '/install/step.php');
}

public function DoUninstall()
{
    global $APPLICATION;

    $this->UnInstallFiles();
    $this->UnInstallDB();
    \Bitrix\Main\ModuleManager::unRegisterModule($this->MODULE_ID);
    $APPLICATION->IncludeAdminFile('Удаление модуля', __DIR__ . '/install/unstep.php');
}

Важно: SQL выполняем до регистрации при установке и после снятия регистрации при удалении (или в обратном порядке по вашей политике — главное симметрия). RunSQLBatch() принимает путь к файлу; возвращает массив ошибок или пустой массив/не массив при успехе — всегда проверяйте результат.