Автонаповнення зображень товарів із зовнішніх джерел 1С-Бітрікс
Зображення — найважчий за обсягом елемент автонаповнення. 10 000 товарів × 5 фото = 50 000 файлів, які потрібно завантажити, перевірити, оптимізувати та правильно прив'язати до інфоблоку. При цьому система має працювати у фоні, не навантажувати сервер у пікові години та не дублювати вже завантажені фото.
Джерела зображень
API виробника — найчистіший варіант. Виробники часто надають медіабібліотеки партнерам: ZIP-архів з фото за артикулами або API для завантаження за EAN.
Icecat / Syndigo — база даних контенту виробників. Платний доступ, але повністю легальний і з хорошим покриттям електроніки та побутової техніки.
Сайт виробника — парсинг. Пріоритет: шукаємо теги <meta property="og:image"> або JSON-LD image — це часто посилання на зображення в хорошій якості без парсингу галереї.
YML-фід постачальника — тег <picture> містить URL основного фото.
Дедуплікація: не завантажувати одне й те саме двічі
Зберігаємо кеш завантажених URL у Highload-блоці або таблиці:
CREATE TABLE image_download_cache (
source_url TEXT PRIMARY KEY,
file_id INT, -- ID у b_file
downloaded_at TIMESTAMP
);
Перед завантаженням перевіряємо кеш — якщо URL вже оброблявся і файл існує, використовуємо готовий file_id.
Валідація якості зображень
Не всі знайдені зображення придатні. Обов'язкові перевірки перед збереженням:
$imageInfo = getimagesizefromstring($imageData);
// мінімальна роздільна здатність
if ($imageInfo[0] < 400 || $imageInfo[1] < 400) return null;
// перевірка MIME-типу
if (!in_array($imageInfo['mime'], ['image/jpeg', 'image/png', 'image/webp'])) return null;
// мінімальний розмір файлу (занадто маленький = заглушка або помилка)
if (strlen($imageData) < 10_000) return null;
Оптимізація зображень перед збереженням
Завантажені фото часто більші за потрібне (3000×3000 px, 5 МБ). Перед збереженням у 1С-Бітрікс:
- Ресайз до максимуму 1500 px по більшій стороні (для detail_picture)
- Конвертація CMYK → RGB (типова проблема з фото з поліграфічних джерел)
- Стиснення JPEG до quality 85
Використовуємо Intervention Image (обгортка над GD/Imagick):
$image = Image::make($imageData)->resize(1500, null, fn($c) => $c->aspectRatio());
$optimized = $image->encode('jpg', 85)->getEncoded();
1С-Бітрікс сам створює превью через свій resize-механізм (CFile::ResizeImageGet), але вихідник краще відразу відати оптимізованим.
Фонова обробка та черги
50 000 зображень не можна обробити за один запуск. Архітектура:
- Воркер 1: обходить інфоблок, знаходить елементи без зображень → додає в чергу
- Воркери 2–5: паралельно завантажують і зберігають зображення (4 потоки)
- Розклад: воркери працюють вночі 02:00–06:00, щоб не навантажувати сервер вдень
- Ліміт на сесію: не більше 1000 зображень за один запуск
Таймлайн робіт
| Етап | Термін |
|---|---|
| Розробка завантажувача з валідацією та оптимізацією | 2–3 дні |
| Система дедуплікації та кешування | 4–8 годин |
| Черги, паралельні воркери | 1–2 дні |
| Прив'язка до інфоблоку (превью + галерея) | 4–6 годин |
| Моніторинг прогресу, адміністративний інтерфейс | 1 день |
Разом: 6–9 робочих днів. Первинне наповнення 10 000 товарів при 4 потоках — близько 3–4 годин.







