Актуализация лицензии на хостах разработки после их само-блокировки

18 марта 2026 г.

Максим Лавриненко, директор по информационным технологиям

  • Разработка крупных интернет-магазинов
  • Техподдержка и доработки веб-проектов
  • Администрирование веб-серверов

Содержание статьи

С определённого момента коробочные установки Битрикс24 (далее для краткости Б24) начали переставать работать при просрочке лицензии. Само по себе это не проблема, но могут возникать казусы с копиями для разработки: промышленный контур узнал о продлении лицензии, а остальные хосты нет.

Ручное решение простое – сразу после продления лицензии надо зайти на страницу обновлений (bitrix/admin/update_system.php) на каждой копии.

Но реальность такова, что про это легко забыть. В итоге, через какое-то время промышленный контур будет отлично работать, а копии начнут выдавать страницу “Обновите страницу или введите код активации вручную”.

Попытка ввести в форму что-либо будет давать ошибку “Необходимо авторизоваться на сайте”.

Решение – загрузить в корневую директорию сайта скрипт (назовём его refresh_license.php) и потом обратиться к нему.

Вот скрипт:


<?php

/**
 * Актуализирует статус лицензии Битрикс, обращаясь к серверу обновлений.
 *
 * Использовать когда лицензия была продлена, но копия сайта
 * закешировала старую дату и перенаправляет на coupon_activation.php.
 *
 * Работает как через HTTP, так и через CLI:
 *   curl https://example.com/refresh_license.php
 *   php refresh_license.php
 *
 * Необязательный параметр ?update_site=www.1c-bitrix.ru позволяет
 * переопределить сервер обновлений (полезно когда в БД указан неверный или
 * устаревший, например bitrixsoft.com).
 */

// Подменяем REQUEST_URI, чтобы редирект Битрикса при просроченной лицензии
// (который не срабатывает для coupon_activation.php) не выполнился.
$_SERVER['REQUEST_URI'] = '/bitrix/coupon_activation.php';
$_SERVER['SCRIPT_NAME'] = '/bitrix/coupon_activation.php';
$_SERVER['PHP_SELF'] = '/bitrix/coupon_activation.php';

define('BX_SKIP_SESSION_EXPAND', true);
define('BX_SESSION_ID_CHANGE', false);
define('NO_AGENT_CHECK', true);
define('STOP_STATISTICS', true);
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC', 'Y');
define('DisableEventsCheck', true);
define('NOT_CHECK_PERMISSIONS', true);
define('BX_BUFFER_USED', true);

if (PHP_SAPI === 'cli' || empty($_SERVER['DOCUMENT_ROOT'])) {
    $dir = __DIR__;
    while ($dir !== dirname($dir)) {
        if (is_dir($dir . '/bitrix/modules')) {
            $_SERVER['DOCUMENT_ROOT'] = $dir;
            break;
        }
        $dir = dirname($dir);
    }
}

ob_start();

try {
    require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
} catch (\Throwable $e) {
    // Глушим любые ошибки пролога
}

ob_end_clean();

if (PHP_SAPI !== 'cli') {
    header('Content-Type: text/plain; charset=utf-8');
}

$updateSiteOverride = $_GET['update_site'] ?? ($argv[1] ?? null);
$currentUpdateSite = COption::GetOptionString('main', 'update_site', '');

if ($updateSiteOverride) {
    COption::SetOptionString('main', 'update_site', $updateSiteOverride);
    echo "Сервер обновлений: {$currentUpdateSite} -> {$updateSiteOverride}" . PHP_EOL;
} else {
    echo "Сервер обновлений: {$currentUpdateSite}" . PHP_EOL;
}

$license = \Bitrix\Main\Application::getInstance()->getLicense();
$key = $license->getKey();

echo "Лицензионный ключ: {$key}" . PHP_EOL;
echo "Обращение к серверу обновлений..." . PHP_EOL;

try {
    $coupon = new \Bitrix\Main\UpdateSystem\Coupon($key);
    $activationSystem = new \Bitrix\Main\UpdateSystem\ActivationSystem();
    $result = $activationSystem->reincarnate($coupon);
} catch (\Throwable $e) {
    if ($updateSiteOverride) {
        COption::SetOptionString('main', 'update_site', $currentUpdateSite);
    }
    echo "Ошибка обращения к серверу обновлений: {$e->getMessage()}" . PHP_EOL;
    exit(1);
}

if ($updateSiteOverride) {
    COption::SetOptionString('main', 'update_site', $currentUpdateSite);
}

if (!$result->isSuccess()) {
    echo "Не удалось обновить лицензию:" . PHP_EOL;
    foreach ($result->getErrors() as $error) {
        echo "  - {$error->getMessage()}" . PHP_EOL;
    }
    exit(1);
}

$data = $result->getData();
echo "Готово! Лицензия обновлена." . PHP_EOL;
echo "Действует до: {$data['DATE_TO_SOURCE']}" . PHP_EOL;
echo "Максимум пользователей: {$data['MAX_USERS']}" . PHP_EOL;

// Чистим кеш, чтобы новые значения вступили в силу сразу
$cacheDir = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/managed_cache/MYSQL/b_option';
if (is_dir($cacheDir)) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($cacheDir, FilesystemIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST,
    );
    foreach ($iterator as $item) {
        $item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname());
    }
    rmdir($cacheDir);
    echo "Кеш очищен." . PHP_EOL;
}

А вот так надо обратиться (замените example.com на ваш домен):

https://example.com/refresh_license.php

После этого копия снова заработает.