Актуализация лицензии на хостах разработки после их само-блокировки
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
После этого копия снова заработает.