Обзор обновлений Bitrix Framework (октябрь-ноябрь 2025)
Кирилл Новожилов
Автор
Содержание
Модуль main
Версия 25.700.0
Метод Image::blur() для размытия изображений
Добавлен метод blur() в класс \Bitrix\Main\File\Image для применения эффекта размытия к изображениям.
Сигнатура метода:
/**
* Blurs the image.
* @param int $sigma Интенсивность размытия
* @return bool Успешность операции
*/
public function blur(int $sigma): bool
Пример использования:
use Bitrix\Main\File\Image;
// Создаём экземпляр Image
$image = new Image('/path/to/image.jpg');
// Загружаем изображение
if ($image->load())
{
// Применяем размытие с интенсивностью 10
$image->blur(10);
// Сохраняем результат
$image->save(90); // качество 90%
}

Пример создания превью с размытием:
use Bitrix\Main\File\Image;
use Bitrix\Main\File\Image\Rectangle;
$image = new Image('/path/to/source.jpg');
if ($image->load())
{
// Получаем текущие размеры
$dimensions = $image->getDimensions();
// Создаём миниатюру
$source = new Rectangle($dimensions->getWidth(), $dimensions->getHeight(), 0, 0);
$destination = new Rectangle(100, 100, 0, 0);
$image->resize($source, $destination);
// Применяем размытие для placeholder эффекта
$image->blur(10);
// Сохраняем с другим именем
$image->saveAs('/path/to/blurred-placeholder.jpg', 70);
}
Применение:
- Создание LQIP (Low-Quality Image Placeholders) для lazy loading
- Эффекты размытия фона
- Обработка изображений для галерей
- Защита изображений (например, для демо-контента)
Методы рендеринга в базовом контроллере
В класс \Bitrix\Main\Engine\Controller добавлены методы для удобного рендеринга:
renderView() — рендеринг PHP-файла
Рендерит содержимое PHP-файла из директории views/ модуля. Система автоматически подключает шаблон сайта.
/**
* @param string $viewPath Путь к файлу представления
* @param array $params Параметры для передачи в представление
* @param bool $withSiteTemplate Оборачивать в шаблон сайта
* @return View
*/
final protected function renderView(
string $viewPath,
array $params = [],
bool $withSiteTemplate = true
): View
Пример:
namespace Vendor\MyModule\Controller;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\Response\Render\View;
class EntityController extends Controller
{
public function indexAction(): View
{
return $this->renderView('entity/index', [
'title' => 'Заголовок страницы',
'items' => $this->getItems(),
]);
}
// Без шаблона сайта (только содержимое)
public function partialAction(): View
{
return $this->renderView('entity/partial', withSiteTemplate: false);
}
}
Файл views/entity/index.php:
<h1><?= $title ?></h1>
<ul>
<?php foreach ($items as $item): ?>
<li><?= htmlspecialchars($item['name']) ?></li>
<?php endforeach; ?>
</ul>
renderComponent() — рендеринг компонента
Рендерит компонент Bitrix с возможностью вывода в шаблоне сайта.
/**
* @param string $name Имя компонента
* @param string $template Шаблон компонента
* @param array $params Параметры компонента
* @param bool $withSiteTemplate Оборачивать в шаблон сайта
* @return Component
*/
final protected function renderComponent(
string $name,
string $template = '',
array $params = [],
bool $withSiteTemplate = true
): Component
Пример:
namespace Vendor\MyModule\Controller;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\Response\Render\Component;
class CatalogController extends Controller
{
public function listAction(int $sectionId = 0): Component
{
return $this->renderComponent(
'bitrix:catalog.section',
'.default',
[
'IBLOCK_ID' => 1,
'SECTION_ID' => $sectionId,
'PAGE_ELEMENT_COUNT' => 20,
]
);
}
// Можно вызвать без шаблона компонента
public function simpleAction(): Component
{
return $this->renderComponent('bitrix:news.list', params: [
'IBLOCK_ID' => 1,
]);
}
}
renderExtension() — рендеринг JS-расширения
Рендерит JavaScript-расширение с параметрами. Это не SSR — расширение рендерится в браузере после загрузки страницы.
/**
* @param string $extension Имя расширения
* @param array $params Параметры для передачи в расширение
* @param bool $withSiteTemplate Оборачивать в шаблон сайта
* @return Extension
*/
final protected function renderExtension(
string $extension,
array $params = [],
bool $withSiteTemplate = true
): Extension
Пример:
namespace Vendor\MyModule\Controller;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\Response\Render\Extension;
class WidgetController extends Controller
{
public function showAction(): Extension
{
return $this->renderExtension('mymodule.vue.widget', [
'option' => 'name',
]);
}
// Можно вызвать без параметров
public function simpleAction(): Extension
{
return $this->renderExtension('mymodule.vue.widget');
}
}
Для работы расширения необходимо указать в его config.php параметр controllerEntrypoint:
// local/js/mymodule/vue/widget/config.php
return [
// ...
'controllerEntrypoint' => 'MyModule.Vue.Widget.render',
];
Версия 25.725.0
Новое перечисление Bitrix\Main\Web\UserAgent\Platform
Добавлено PHP enum Platform для определения платформы клиента по User-Agent. Enum предоставляет типобезопасный способ работы с платформами и удобные методы для их классификации.
Значения enum:
enum Platform: string
{
case Android = 'Android';
case Ios = 'iOS';
case Windows = 'Windows';
case Macos = 'macOS';
case LinuxRpm = 'Linux RPM';
case LinuxDeb = 'Linux DEB';
case Unknown = 'Unknown';
}
Методы enum:
// Проверка на мобильную платформу (Android, iOS)
public function isMobile(): bool
// Проверка на десктопную платформу (Windows, macOS, Linux)
public function isDesktop(): bool
// Проверка на Linux (RPM или DEB)
public function isLinux(): bool
// Определение платформы по User-Agent строке
public static function fromUserAgent(string $userAgent): self
Пример использования:
use Bitrix\Main\Context;
use Bitrix\Main\Web\UserAgent\Platform;
// Получение User-Agent через Context
$request = Context::getCurrent()->getRequest();
$userAgent = $request->getUserAgent();
// Определение платформы
$platform = Platform::fromUserAgent($userAgent);
// Проверка типа платформы
if ($platform->isMobile())
{
// Логика для мобильных устройств (Android, iOS)
echo "Мобильное приложение: " . $platform->value;
}
if ($platform->isDesktop())
{
// Логика для десктопных приложений
echo "Десктоп: " . $platform->value;
}
// Прямое сравнение
if ($platform === Platform::Ios)
{
// Специфичная логика для iOS
}
// Определение дистрибутива Linux
if ($platform->isLinux())
{
if ($platform === Platform::LinuxRpm)
{
echo "Используйте yum/dnf для установки";
}
else
{
echo "Используйте apt для установки";
}
}
Применение:
- Определение платформы клиента для адаптации интерфейса
- Работа с мобильными приложениями Bitrix24
- Предложение правильных ссылок для скачивания (App Store / Google Play / RPM / DEB)
- Аналитика по платформам пользователей
Версия 25.750.0
Popup: новый метод setTargetContainer()
Добавлен метод setTargetContainer() для управления контейнером, в который будет вставлен popup. Это позволяет размещать всплывающие окна в определённом DOM-элементе вместо стандартного document.body.
Пример использования:
const popup = new BX.PopupWindow({
id: 'my-popup',
content: 'Содержимое popup',
autoHide: true
});
// Устанавливаем целевой контейнер
popup.setTargetContainer(document.getElementById('custom-container'));
popup.show();
Применение:
- Изоляция popup в рамках определённого блока интерфейса
- Работа с Shadow DOM и веб-компонентами
- Решение проблем z-index при сложной вложенности элементов
Модуль iblock
Версия 25.100.0
Улучшение производительности
- Создание элемента инфоблока с расширенными правами работает быстрее
- Создание документа в бизнес-процессе оптимизировано
Переход на библиотеку ui.field-selector
Методы \Bitrix\Iblock\UI\Input\Element::renderSelector() и \Bitrix\Iblock\UI\Input\Section::renderSelector() теперь используют современную библиотеку ui.field-selector.
⚠️ DEPRECATED: библиотека iblock.field-selector объявлена устаревшей и больше не используется в ядре.
Модуль highloadblock
Версия 25.0.0
ORM-кеш в resolveHighloadblock()
Метод \Bitrix\Highloadblock\HighloadBlockTable::resolveHighloadblock() теперь использует ORM-кеш для снижения количества запросов к БД.
Сигнатура метода:
/**
* @param array|int|string $hlblock ID, NAME или массив данных HL-блока
* @return array|null Данные HL-блока или null
*/
public static function resolveHighloadblock($hlblock): ?array
Как это работает:
use Bitrix\Highloadblock\HighloadBlockTable;
// При первом вызове — запрос к БД, результат кешируется на 24 часа
$hlblock = HighloadBlockTable::resolveHighloadblock(1);
// Повторные вызовы берут данные из ORM-кеша
$hlblock = HighloadBlockTable::resolveHighloadblock(1);
$hlblock = HighloadBlockTable::resolveHighloadblock('MyEntity');
Реализация кеширования (из исходного кода):
public static function resolveHighloadblock($hlblock)
{
if (!is_array($hlblock))
{
if (is_int($hlblock) || is_numeric(mb_substr($hlblock, 0, 1)))
{
// Получение по ID с кешем на 24 часа
$hlblock = HighloadBlockTable::getByPrimary(
$hlblock,
[
'cache' => [
'ttl' => 86400,
],
]
)->fetch();
}
elseif (is_string($hlblock) && $hlblock !== '')
{
// Получение по NAME с кешем на 24 часа
$hlblock = HighloadBlockTable::query()
->addSelect('*')
->setCacheTtl(86400)
->where('NAME', $hlblock)
->exec()
->fetch()
;
}
// ...
}
// ...
}
Защита от зарезервированного имени "Collection"
Заблокирована возможность создания highloadblock с названием сущности Collection. Это зарезервированное имя, которое конфликтует с системой коллекций ORM.
Проверка создания таблицы
Теперь при создании highloadblock проверяется результат создания таблицы в БД. Если создание таблицы завершилось ошибкой, запись о HL-блоке удаляется и возвращается ошибка.
use Bitrix\Highloadblock\HighloadBlockTable;
$result = HighloadBlockTable::add([
'NAME' => 'MyEntity',
'TABLE_NAME' => 'my_table',
]);
if (!$result->isSuccess())
{
// Теперь здесь будет ошибка, если не удалось создать таблицу
foreach ($result->getErrors() as $error)
{
ShowError($error->getMessage());
}
}

Добавлен казахский язык
В модуль добавлена локализация на казахский язык (kz).
Система обновлений
Активация ключа через сайт
Начиная с версии 25.700.0, активация лицензионного ключа теперь выполняется на сайте 1С-Битрикс. Это упрощает процесс активации и позволяет избежать проблем с сетевыми ограничениями на сервере.