У нас був проєкт: каталог 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+ років досвіду в Бітрікс підберуть оптимальне рішення для вашого каталогу. Замовте аудит вашого каталогу для попередньої оцінки.







