У нас был проект: каталог 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+ без проблем |
Как подготовить файлы для загрузки
- Структурируйте изображения по папкам: каждая папка соответствует артикулу товара.
- Создайте CSV-файл с колонками: артикул, имя файла для основного изображения, набор файлов для галереи.
- Проверьте, что все файлы доступны по указанным путям.
- Запустите CLI-скрипт, который читает CSV и загружает файлы через API.
Что входит в нашу работу
- Полный аудит структуры каталога и файлового хранилища.
- Разработка CLI-скрипта под ваш сценарий.
- Настройка пакетной загрузки с учётом оптимизации.
- Тестирование на копии и финальный деплой.
- Документация по процессу и поддержка после внедрения.
Сроки ориентировочно
| Объём каталога | Ориентировочное время |
|---|---|
| До 1 000 товаров | 1–2 часа |
| 1 000–10 000 товаров | 4–8 часов |
| 10 000–50 000 товаров | 1–2 дня |
Стоимость рассчитывается индивидуально — пишите, оценим ваш проект бесплатно. Экономия времени и бюджета гарантирована — в 5-10 раз быстрее ручного труда.
Получите консультацию: наши инженеры с 10+ лет опыта в Битрикс подберут оптимальное решение для вашего каталога. Закажите аудит вашего каталога для предварительной оценки.







