Настройка массовой загрузки фотографий товаров 1С-Битрикс

У нас был проект: каталог 20 000 товаров, на каждый нужно загрузить основную фотографию и галерею из 5–8 снимков. Через административный интерфейс Битрикс на это ушло бы несколько человеко-недель. Мы автоматизировали процесс с помощью API и пакетной обработки — вся загрузка заняла 4 часа. Аналогичны
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Настройка массовой загрузки фотографий товаров 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

У нас был проект: каталог 20 000 товаров, на каждый нужно загрузить основную фотографию и галерею из 5–8 снимков. Через административный интерфейс Битрикс на это ушло бы несколько человеко-недель. Мы автоматизировали процесс с помощью API и пакетной обработки — вся загрузка заняла 4 часа. Аналогичный подход работает для любых объёмов. Мы — команда сертифицированных разработчиков Битрикс с 10+ лет опыта, автоматизировали загрузку для 500+ каталогов. Гарантируем экономию бюджета в 3-5 раз по сравнению с ручным трудом.

Почему ручная загрузка через админку — путь к потерям

При ручной загрузке через интерфейс «Инфоблоки → Элементы» приходится открывать каждый товар, прикреплять файл по одному. На 20 000 товаров это 20 000 операций. Кроме того, тяжело контролировать качество: пропущенный товар, перепутанное изображение. Главное — неконтролируемая нагрузка на сервер: каждый клик вызывает перезагрузку страницы, обновление кэша, срабатывание событий. На больших каталогах это приводит к таймаутам или зависанию.

Как мы автоматизируем загрузку?

Мы готовим структуру файлов по артикулу, карту соответствия в CSV и запускаем CLI-скрипт на PHP. Согласно документации, CFile управляет загрузкой файлов. Код ниже — базовая схема, которую мы дорабатываем под конкретный проект (размеры изображений, форматы, интеграция с 1С через CommerceML).

$csvRows = parseCsv('/import/mapping.csv'); // [['xml_id' => 'sku_001', 'files' => ['main.jpg', '2.jpg']]] foreach ($csvRows as $row) { // Находим элемент по XML_ID $element = \Bitrix\Iblock\ElementTable::getList([ 'filter' => ['XML_ID' => $row['xml_id'], 'IBLOCK_ID' => CATALOG_IBLOCK_ID], 'select' => ['ID'], ])->fetch(); if (!$element) continue; $imageDir = '/import/images/' . $row['xml_id'] . '/'; $files = []; foreach ($row['files'] as $i => $filename) { $filePath = $imageDir . $filename; if (!file_exists($filePath)) continue; $fileId = \CFile::SaveFile([ 'name' => $filename, 'type' => mime_content_type($filePath), 'tmp_name' => $filePath, 'error' => 0, 'size' => filesize($filePath), ], 'iblock'); if ($i === 0) { // Первый файл — основное изображение \CIBlockElement::Update($element['ID'], [ 'PREVIEW_PICTURE' => \CFile::MakeFileArray($filePath), 'DETAIL_PICTURE' => \CFile::MakeFileArray($filePath), ]); } else { $files[] = ['VALUE' => \CFile::MakeFileArray($filePath)]; } } // Множественное свойство галереи if (!empty($files)) { \CIBlockElement::SetPropertyValues($element['ID'], CATALOG_IBLOCK_ID, $files, 'MORE_PHOTO'); } } 

CFile::MakeFileArray() не копирует файл — это просто массив-дескриптор. CFile::SaveFile() — фактическое сохранение и запись в b_file.

Какие технические сложности возникают и как их решать?

Таймауты. Загрузка 50 000 файлов через веб-запрос невозможна — используем CLI-скрипты (php -f import.php), снимаем ограничения set_time_limit(0) и ini_set('memory_limit', '512M').

Избыточная нагрузка на сервер из-за событий. По умолчанию при каждом CIBlockElement::Update срабатывают события OnBeforeIBlockElementUpdate и OnAfterIBlockElementUpdate. Они могут вызывать пересчёт цен, инвалидацию кэша, обновление поискового индекса. Временно отключаем ненужные обработчики точечно через \Bitrix\Main\EventManager::getInstance()->removeEventHandler().

Проблемы с кэшем. После массового обновления кэш инфоблоков содержит устаревшие ссылки на файлы. В конце импорта сбрасываем кэш вызовом \Bitrix\Iblock\Iblock::cleanCache($iblockId) — один раз, не в цикле.

Обработка ошибок. Мы ведём подробный лог. Если файл отсутствует или повреждён, лог фиксирует ошибку, а процесс продолжается на следующем товаре. После импорта получаем отчёт о пропущенных позициях.

Типичные ошибки при массовой загрузке

Лог ошибок
$log = fopen('/var/log/image_import.log', 'a'); foreach ($csvRows as $row) { try { // ... обработка fwrite($log, date('Y-m-d H:i:s') . " OK: {$row['xml_id']}\n"); } catch (\Throwable $e) { fwrite($log, date('Y-m-d H:i:s') . " ERR: {$row['xml_id']} — {$e->getMessage()}\n"); } } 

Частые ошибки: файл не найден, неверный MIME-тип, дубликат в b_file (Битрикс проверяет по хэшу — повторная загрузка одного файла вернёт существующий ID).

Производительность на больших объёмах

На каталоге 20 000+ позиций прямой цикл будет работать 2–4 часа и может упасть по таймауту или лимиту памяти. Несколько правил:

  • Разбивайте на пакеты. Обрабатывайте по 200–500 элементов за итерацию, сохраняйте прогресс в файл или таблицу.
  • Отключайте лишние обработчики событий. При массовом обновлении события OnBeforeIBlockElementUpdate и OnAfterIBlockElementUpdate могут вызвать цепочку тяжёлых операций (пересчёт цен, инвалидация кэша, обновление поиска). Временно отключите агенты и события, если они не нужны в момент импорта.
  • Используйте CLI-скрипты. Запускайте через php -f import_images.php — нет ограничений по времени выполнения веб-запроса.
  • Очищайте кэш после завершения. После массовой загрузки сбросьте кэш инфоблоков: \Bitrix\Iblock\InformationBlock::cleanTagCache($iblockId). Не делайте это внутри цикла — только один раз в конце.

Генерация миниатюр

После загрузки Битрикс создаёт миниатюры лениво — при первом обращении через компонент. Если нужно прогреть кэш сразу:

\CFile::ResizeImageGet($fileId, ['width' => 400, 'height' => 400], BX_RESIZE_IMAGE_PROPORTIONAL, true); 

Или через CLI-утилиту, если на сервере настроен модуль ImageMagick.

Сравнение: ручная загрузка vs наша автоматизация

Параметр Ручная загрузка Автоматизация под ключ
Время на 10 000 товаров 2-3 недели 2-4 часа
Ошибки Человеческий фактор Минимальны при правильной карте соответствия
Нагрузка на сервер Высокая (каждое действие через админку) Низкая (CLI без лишних событий)
Масштабируемость Только для малых объёмов До 100 000+ без проблем

Как подготовить файлы для загрузки

  1. Структурируйте изображения по папкам: каждая папка соответствует артикулу товара.
  2. Создайте CSV-файл с колонками: артикул, имя файла для основного изображения, набор файлов для галереи.
  3. Проверьте, что все файлы доступны по указанным путям.
  4. Запустите CLI-скрипт, который читает CSV и загружает файлы через API.

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

  • Полный аудит структуры каталога и файлового хранилища.
  • Разработка CLI-скрипта под ваш сценарий.
  • Настройка пакетной загрузки с учётом оптимизации.
  • Тестирование на копии и финальный деплой.
  • Документация по процессу и поддержка после внедрения.

Сроки ориентировочно

Объём каталога Ориентировочное время
До 1 000 товаров 1–2 часа
1 000–10 000 товаров 4–8 часов
10 000–50 000 товаров 1–2 дня

Стоимость рассчитывается индивидуально — пишите, оценим ваш проект бесплатно. Экономия времени и бюджета гарантирована — в 5-10 раз быстрее ручного труда.

Получите консультацию: наши инженеры с 10+ лет опыта в Битрикс подберут оптимальное решение для вашего каталога. Закажите аудит вашего каталога для предварительной оценки.