Налаштування автоматичного накладання водяних знаків 1С-Бітрікс
Уявіть: ви імпортуєте 10 000 товарів через CSV, кожен з 3 зображеннями. Разом 30 000 картинок. Без автоматизації довелося б вручну накладати водяний знак на кожну — процес на тиждень. Менеджери забувають, версії з водяним знаком плутаються, зайві копії забивають диск. Потрібне перехоплення на рівні події завантаження файлу. Ми, як сертифіковані Bitrix-розробники з 10+ років досвіду, реалізували вже 40+ проектів із захисту зображень. Пропонуємо налаштувати автоматичне накладання під ключ. Зв'яжіться з нами — оцінимо ваш проект і запропонуємо оптимальне рішення.
Як працює обробник OnBeforeFileAdd?
У Бітрікс файли завантажуються через CFile::SaveFile() та CFile::Add(). Подія OnBeforeFileAdd дозволяє перехопити завантаження до збереження на диск. Обробник отримує масив $fileFields та ідентифікатор модуля $moduleId. Приклад коду:
AddEventHandler('main', 'OnBeforeFileAdd', function(&$fileFields, $moduleId) { // $moduleId: 'iblock', 'sale', 'catalog' тощо if ($moduleId !== 'iblock') { return; // Обробляємо тільки зображення каталогу } $mimeType = $fileFields['type'] ?? ''; if (!str_starts_with($mimeType, 'image/')) { return; } $tmpFile = $fileFields['tmp_name']; applyWatermarkInPlace($tmpFile); }); Функція applyWatermarkInPlace модифікує тимчасовий файл до його збереження в /upload/. Це означає: в базі та на диску опиниться вже оброблений файл, без необхідності зберігати оригінал і кеш окремо. — документація 1С-Бітрікс по подіям.
Чому асинхронна обробка вигідніша?
При імпорті каталогу 5 000 товарів з 3 зображеннями кожен — 15 000 операцій GD. На середньому сервері обробка одного зображення займає 50–150 мс. Разом: 12–37 хвилин додається до часу імпорту. Якщо це неприйнятно — перемикаємось на асинхронну схему: зберігаємо оригінал, ставимо задачу в чергу b_agent, агент обробляє батчами по 100 зображень. Асинхронний підхід у 3-5 разів зменшує час імпорту — перевірено на проектах з каталогами до 100 000 товарів.
| Параметр | Синхронна обробка | Асинхронна обробка |
|---|---|---|
| Швидкість імпорту | Сповільнюється на хвилини | Без затримки |
| Використання CPU | Пікове навантаження на кроці | Рівномірне навантаження у фоні |
| Складність реалізації | Проста | Потребує агента та планувальника |
| Зберігання оригіналу | Не зберігається | Зберігається до обробки |
Як виключити зайві інфоблоки?
Не всі зображення потрібно маркувати. Логотип компанії в шапці, іконки категорій, системні картинки — все це проходить через CFile. Фільтрація за $moduleId вирішує лише частину задачі. Для більш точного управління додаємо перевірку контексту через сесійну змінну:
AddEventHandler('main', 'OnBeforeFileAdd', function(&$fileFields, $moduleId) { if ($moduleId !== 'iblock') return; if (!isset($_SESSION['WATERMARK_ENABLED'])) return; $iblockId = $_SESSION['CURRENT_IBLOCK_ID'] ?? null; $noWatermarkIblocks = \Bitrix\Main\Config\Option::get('catalog', 'no_watermark_iblocks', ''); $excluded = array_map('intval', explode(',', $noWatermarkIblocks)); if ($iblockId && in_array($iblockId, $excluded)) return; applyWatermarkInPlace($fileFields['tmp_name']); }); Змінна CURRENT_IBLOCK_ID встановлюється в обробнику події OnBeforeIBlockElementAdd / OnBeforeIBlockElementUpdate. Список виключених інфоблоків зберігається в b_option.
Обробка помилок: жодного втраченого файлу
Якщо GD-обробка завершиться з помилкою (битий файл, непідтримуваний формат), завантаження не повинно блокуватися. Обгортка applyWatermarkInPlace у блоці try/catch — при помилці файл зберігається без водяного знаку, помилка записується в лог:
function applyWatermarkInPlace(string $tmpFile): void { try { // Обробка через GD $result = processWatermark($tmpFile); if ($result) { file_put_contents($tmpFile, $result); } } catch (\Throwable $e) { \Bitrix\Main\Diag\Debug::writeToFile( $e->getMessage(), 'watermark_error', '/bitrix/watermark.log' ); // Не перериваємо завантаження — файл збережеться оригінальним } } Приклад вмісту логу помилок
watermarK_erROR: GD library: Image type not supported watermarK_erROR: Could not open file /tmp/phpABC123 Ми гарантуємо, що жодне зображення не буде втрачено. Лог помилок допоможе виявити проблеми з GD або форматами файлів.
Додавання водяних знаків для REST API та масового імпорту
Подія OnBeforeFileAdd спрацьовує при будь-якому виклику CFile::SaveFile(), у тому числі при роботі REST API та CSV-імпорту. Додаткового налаштування не потрібно. Для великих обсягів даних ми рекомендуємо асинхронний режим — агент оброблятиме зображення за розкладом.
Порівняння методів накладання водяних знаків
| Метод | Продуктивність | Якість | Складність |
|---|---|---|---|
| GD | Середня (50-150 мс) | Хороша | Низька |
| Imagick | Висока (20-50 мс) | Відмінна | Середня |
| Зовнішній API | Низька (200-500 мс) | Залежить від сервісу | Висока |
Обмеження пам'яті та масштабування
При обробці високої роздільної здатності (фото товарів 4000x3000px), GD може потребувати до 200-300 MB пам'яті на одне зображення. Для масового імпорту обов'язково збільшуйте memory_limit до 512 MB або використовуйте асинхронну обробку. Imagick дозволяє працювати з потоками і менше навантажує пам'ять, але потребує встановлення бібліотеки на сервер. Наш досвід показує: для каталогів понад 50 000 товарів асинхронна схема з Imagick — оптимальний вибір. Ми протестували обидва підходи на бойових проектах і рекомендуємо починати з GD, масштабуючись до Imagick у міру зростання.
Що входить у налаштування
- Реалізація обробника події
OnBeforeFileAddз фільтрацією за$moduleId - Список інфоблоків-виключень у
b_optionта налаштування через адміністративний інтерфейс - Обробка помилок GD без блокування завантаження
- Для масового імпорту: асинхронна обробка через агент
- Моніторинг логу
/bitrix/watermark.logна предмет битих зображень - Документація з налаштування та навчання адміністраторів (входить у вартість)
Зв'яжіться з нами для оцінки вашого проекту. Отримайте консультацію з налаштування захисту зображень — ми підберемо баланс швидкості та ресурсів.







