Автонаполнение изображений товаров из внешних источников 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×3000px, 5 МБ). Перед сохранением в Битрикс:
- Ресайз до максимума 1500px по большей стороне (для 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();
Битрикс сам создаёт превью через свой 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 часов.







