Настройка автоматического наложения водяных знаков 1С-Битрикс
Представьте: вы импортируете 10 000 товаров через CSV, каждое с 3 изображениями. Итого 30 000 картинок. Без автоматизации пришлось бы вручную накладывать водяной знак на каждую — процесс на неделю. Менеджеры забывают, версии с водяным знаком путаются, лишние копии забивают диск. Нужен перехват на уровне события загрузки файла. Мы, как сертифицированные Bitrix-разработчики с 5+ лет опыта, реализовали уже 50+ проектов по защите изображений. Предлагаем настроить автоматическое наложение под ключ. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение.
Как работает обработчик 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' ); // Не прерываем загрузку — файл сохранится оригинальным } } Пример содержимого лога ошибок
2024-01-15 12:00:00 watermarK_erROR: GD library: Image type not supported 2024-01-15 12:00:01 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на предмет битых изображений - Документация по настройке и обучение администраторов (входит в стоимость)
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по настройке защиты изображений — мы подберём баланс скорости и ресурсов.







