01.12.2025 10 мин чтения

Обзор обновлений Bitrix Framework (октябрь-ноябрь 2025)

Кирилл Новожилов

Кирилл Новожилов

Автор

Обзор обновлений 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С-Битрикс. Это упрощает процесс активации и позволяет избежать проблем с сетевыми ограничениями на сервере.

Опубликовано 2 недели назад