Настройка ресайза изображений 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка ресайза изображений 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка ресайза изображений 1С-Битрикс

Загруженное в Битрикс изображение 4000×3000 пикселей весом 8 МБ никуда не девается — оно лежит в upload/ и при каждом обращении без ресайза отдаётся целиком. Браузер масштабирует его через CSS. Итог: лишние мегабайты трафика, медленная загрузка, плохой Core Web Vitals. Встроенный ресайзер Битрикса решает это автоматически, но по умолчанию настроен далеко не оптимально.

Как работает ресайзер

Битрикс использует два API для работы с изображениями. Старый — CFile::ResizeImageFile() из модуля main, работает через GD. Новый — \Bitrix\Main\Web\Image, поддерживает GD и Imagick. Оба кешируют результаты в bitrix/cache/resize_cache/ по структуре [хеш-папки]/[имя-файла].[расширение].

Размеры превью задаются компонентами. В компоненте bitrix:catalog.element за размеры отвечают параметры DETAIL_IMAGE_WIDTH, DETAIL_IMAGE_HEIGHT, в bitrix:catalog.sectionSECTION_IMAGE_WIDTH и т.д. Но у многих разработчиков эти параметры выставлены в 0 — ресайз не происходит.

Выбор библиотеки: GD vs Imagick

По умолчанию Битрикс использует GD. Imagick работает быстрее на больших изображениях и качественнее при уменьшении. Переключить можно в настройках модуля:

\Bitrix\Main\Config\Option::set('main', 'image_handler', 'imagick');

Или через административную панель: «Настройки» → «Настройки продукта» → «Производительность» → раздел «Изображения».

Проверка доступных драйверов:

php -r "echo extension_loaded('imagick') ? 'Imagick OK' : 'No Imagick';"
php -r "print_r(gd_info());"

На Bitrix VM Imagick установлен. На чистом PHP-FPM может отсутствовать — ставить через apt install php-imagick или yum install php-imagick.

Настройка качества и алгоритма

// Качество JPEG (по умолчанию 85)
\Bitrix\Main\Config\Option::set('main', 'image_resize_quality', '82');

// Алгоритм сжатия PNG (0-9, по умолчанию 6)
\Bitrix\Main\Config\Option::set('main', 'image_resize_png_quality', '7');

Значение 82 для JPEG — разумный компромисс. Ниже 75 артефакты заметны на фотографиях товаров. Выше 88 — файл растёт, визуальной разницы нет.

Режимы ресайза

Битрикс поддерживает несколько режимов через константы модуля main:

  • BX_RESIZE_IMAGE_EXACT — точные размеры с обрезкой
  • BX_RESIZE_IMAGE_PROPORTIONAL — пропорционально, вписывается в рамку
  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT — пропорционально, без белых полос

В шаблоне компонента вызов выглядит так:

$arFile = CFile::ResizeImageGet(
    $arResult['DETAIL_PICTURE'],
    ['width' => 800, 'height' => 600],
    BX_RESIZE_IMAGE_PROPORTIONAL,
    false
);

Четвёртый параметр false означает «не сохранять на диск» — вернуть URL к кешированной версии. Если передать true, файл будет скопирован в upload/resize_cache/ — полезно для предгенерации.

Предгенерация превью

Стандартная проблема: при первом входе пользователя на страницу ресайз происходит на лету — PHP тратит CPU, пользователь ждёт. Решение — прогрев кеша через скрипт или обработчик OnAfterFileAdd.

Обработчик события при добавлении файла:

// в /bitrix/php_interface/init.php
AddEventHandler('main', 'OnAfterFileAdd', function($arFields) {
    if (in_array($arFields['CONTENT_TYPE'], ['image/jpeg', 'image/png'])) {
        CFile::ResizeImageGet(
            $arFields['ID'],
            ['width' => 1200, 'height' => 900],
            BX_RESIZE_IMAGE_PROPORTIONAL
        );
        CFile::ResizeImageGet(
            $arFields['ID'],
            ['width' => 400, 'height' => 300],
            BX_RESIZE_IMAGE_PROPORTIONAL
        );
    }
});

Лимиты памяти и таймаут

Ресайз 30-мегапиксельного RAW в PHP требует до 256 МБ памяти. Стандартный memory_limit = 128M вызывает фатальную ошибку без записи в лог — страница просто не отдаёт изображение. Настройка в .htaccess или php.ini:

memory_limit = 256M
max_execution_time = 60

Для потокового ресайза через Imagick — поставить imagick.skip_secure_multithreaded_extensions = 0 в php.ini, это снимает лишние блокировки.

Очистка устаревшего кеша превью

Кеш ресайза не инвалидируется при изменении файла автоматически. Если заменили изображение товара через административный интерфейс — старое превью может отдаваться ещё часами. Битрикс при изменении записи в b_iblock_element_property удаляет запись из b_file, но физический файл в resize_cache/ не трогает.

Безопасная очистка только устаревших превью:

find /var/www/bitrix/bitrix/cache/resize_cache/ -mtime +30 -name "*.jpg" -delete
find /var/www/bitrix/bitrix/cache/resize_cache/ -mtime +30 -name "*.png" -delete

Полная очистка — через API, чтобы сбросить и файлы, и записи в b_cache_tag:

CBitrixComponent::clearComponentCache('bitrix:catalog.element');
BXClearCache(true, '/');