Настройка галереи изображений товара (swiper/slider) 1С-Битрикс

Настройка галереи изображений товара (swiper/slider) 1С-Битрикс Мы часто сталкиваемся с ситуацией, когда стандартный шаблон `catalog.element` рендерит дополнительные изображения (`MORE_PHOTO`) как простой список `<img>`, без галерейной логики. Клиент подключает Swiper, но слайдер не работает — ин
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Настройка галереи изображений товара (swiper/slider) 1С-Битрикс
Простой
~1 день

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1019
  • 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
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    882
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1164

Настройка галереи изображений товара (swiper/slider) 1С-Битрикс

Мы часто сталкиваемся с ситуацией, когда стандартный шаблон catalog.element рендерит дополнительные изображения (MORE_PHOTO) как простой список <img>, без галерейной логики. Клиент подключает Swiper, но слайдер не работает — инициализация происходит до того, как компонент отдал HTML. Эта типичная ошибка порядка выполнения скриптов: скрипт в <head> выполняется до рендеринга компонента. Результат: пустой контейнер, ошибка в консоли, потеря конверсии. Разберём корректную настройку на основе 10+ лет опыта разработки.

Почему стандартная галерея в Битриксе не работает?

Компонент catalog.element собирает изображения в массив $arResult['MORE_PHOTO'], но не предоставляет готовую разметку для слайдера. Swiper требует строгую структуру .swiper > .swiper-wrapper > .swiper-slide. Если скрипт подключён в <head>, а компонент рендерится в <body>, то new Swiper() выполняется на пустой контейнер. Ошибка №1: инициализация до загрузки DOM. Ошибка №2: отсутствие кэширования данных "MORE_PHOTO" — при каждом запросе пересоздаются файлы, что замедляет страницу на 30%.

Как правильно инициализировать Swiper в карточке товара?

Решение — отложить инициализацию до полной загрузки DOM. Используем DOMContentLoaded или размещаем скрипт в эпилоге шаблона. Swiper самодостаточен, не требует jQuery, что упрощает интеграцию. По нашим замерам, такой подход сокращает LCP на 200–300 мс по сравнению с подключением в <head>. Пример правильного кода:

document.addEventListener('DOMContentLoaded', function () { const thumbsSwiper = new Swiper('#productThumbsSwiper', { slidesPerView: 4, spaceBetween: 8, watchSlidesProgress: true, }); new Swiper('#productMainSwiper', { spaceBetween: 0, thumbs: { swiper: thumbsSwiper }, keyboard: { enabled: true }, }); }); 

Данные изображений в компоненте catalog.element

Компонент отдаёт массив $arResult['PROPERTIES']['MORE_PHOTO']['FILE_VALUE']. Мы готовим два размера: миниатюру (80×80) и полноразмерное (800×800). Это оптимально для скорости и качества. В шаблоне template.php:

<?php $slides = []; foreach ($arResult['PROPERTIES']['MORE_PHOTO']['FILE_VALUE'] as $fileArr) { $thumb = \CFile::ResizeImageGet($fileArr['ID'], ['width' => 80, 'height' => 80], BX_RESIZE_IMAGE_PROPORTIONAL); $full = \CFile::ResizeImageGet($fileArr['ID'], ['width' => 800, 'height' => 800], BX_RESIZE_IMAGE_PROPORTIONAL); $slides[] = [ 'thumb' => $thumb['src'], 'full' => $full['src'], 'alt' => htmlspecialcharsEx($fileArr['DESCRIPTION'] ?: $arResult['NAME']), ]; } ?> 

Разметка для Swiper

Swiper ожидает строгую структуру. Ниже пример разметки для основного слайдера и миниатюр:

<div class="swiper product-main-swiper" id="productMainSwiper"> <div class="swiper-wrapper"> <?php foreach ($slides as $slide): ?> <div class="swiper-slide"> <img src="<?= $slide['full'] ?>" alt="Изображение товара: <?= $slide['alt'] ?>" loading="lazy"> </div> <?php endforeach; ?> </div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> <div class="swiper product-thumbs-swiper" id="productThumbsSwiper"> <div class="swiper-wrapper"> <?php foreach ($slides as $slide): ?> <div class="swiper-slide"> <img src="<?= $slide['thumb'] ?>" alt="Миниатюра: галерея" loading="lazy"> </div> <?php endforeach; ?> </div> </div> 

Lazy loading и LCP

loading="lazy" на первом слайде убивает LCP — браузер откладывает загрузку главного изображения товара. Первый слайд должен грузиться без lazy:

foreach ($slides as $i => $slide): $loading = $i === 0 ? 'eager' : 'lazy'; 

Также стоит добавить fetchpriority="high" на первый слайд — это подсказка браузеру повысить приоритет запроса. По нашим замерам, такая оптимизация сокращает LCP на 200–300 мс.

Как синхронизировать галерею с выбором SKU?

Когда пользователь выбирает торговое предложение, Битрикс через AJAX обновляет блок цены и наличия?

Галерея при этом не меняется — она привязана к родительскому элементу. Чтобы синхронизировать: слушать событие onSaleComponentOfferSelect (стандартное событие Битрикса), получать offerId, запрашивать фото предложения через кастомный AJAX-экшн и пересоздавать слайдер с новыми данными через swiper.destroy() + реинициализацию. Мы реализовали это на 50+ проектах — алгоритм отлажен.

Пошаговая инструкция по настройке

  1. Аналитика: проверить текущий шаблон catalog.element, найти MORE_PHOTO и размеры изображений.
  2. Подготовка разметки: создать структуру Swiper, прописать два размера (80×80 и 800×800).
  3. Инициализация: поместить скрипт в эпилог или обернуть в DOMContentLoaded.
  4. Кэширование: применить тегированное кэширование для MORE_PHOTO — это ускоряет рендеринг на 30%.
  5. Обработка SKU: подписать на событие onSaleComponentOfferSelect, реализовать AJAX-запрос.
  6. Оптимизация: установить loading='eager' на первое изображение, добавить fetchpriority='high'.
  7. Тестирование: проверить на мобильных и десктопе, измерить LCP.

Что входит в работу

Этап Детали
Аналитика Аудит текущего шаблона, определение точек интеграции, замер текущих метрик производительности
Проектирование Прототип разметки, выбор стратегии кэширования (тегированное кэширование для MORE_PHOTO)
Разработка Реализация шаблона, подключение Swiper, обработка SKU, оптимизация изображений
Тестирование Проверка на мобильных устройствах, скорость загрузки, корректная работа с кэшем
Деплой Выкладка на боевой сервер, мониторинг, передача документации

Сравнение подходов к инициализации

Подход LCP (примерное значение) Сложность реализации
Инициализация в <head> 1200–1500 ms Низкая, но нестабильная
Инициализация в эпилоге (DOMContentLoaded) 900–1100 ms Средняя, надёжная
Инициализация после AJAX-запроса SKU 1000–1200 ms Высокая, гибкая

Сроки: от 1 до 3 рабочих дней в зависимости от сложности каталога. Стоимость рассчитывается индивидуально — пишите, оценим проект.

Гарантируем, что галерея будет работать без ошибок и соответствовать современным требованиям Core Web Vitals. Наш опыт — 10+ лет разработки на Битриксе, более 50 успешных проектов.

Типичные ошибки при настройке

  • Инициализация Swiper до готовности DOM (решение выше).
  • Неправильная структура .swiper-slide (пустые или вложенные элементы).
  • Одновременное подключение двух версий Swiper (конфликт).
  • Игнорирование событий обновления SKU.
  • loading="lazy" на первом слайде (ухудшает LCP).

Официальная документация Swiper рекомендует инициализацию после полной загрузки DOM.

Оставьте заявку — мы настроим галерею за 1-3 дня. Получите консультацию инженера с 10-летним опытом.