Налаштування централізованого S3-сховища медіафайлів 1С-Бітрікс
Проблема
Коли у вас кілька серверів у кластері Бітрікс або різні середовища (prod, staging, dev), медіафайли з /upload/ живуть локально на кожній ноді?
Типова проблема: завантажили зображення товару на одній машині — воно доступне тільки там, на інших — 404. Ми бачимо це в кожному проєкті з горизонтальним масштабуванням. Раніше багато хто використовував NFS для шари файлів, але це створює єдину точку відмови: падає NFS-сервер — весь сайт без картинок. Сучасне рішення — централізоване сховище на базі S3-сумісного об'єктного сховища. Ми впровадили такий підхід у десятках проєктів, і він дає відмовостійкість (до 99.99%), простоту масштабування та незалежність від апаратної конфігурації. При цьому економія на зберіганні сягає 60% — для сайту з 500 ГБ медіа це близько 50 000 гривень на місяць.
Які проблеми вирішує S3-сховище?
- Єдина точка відмови NFS — якщо мережевої шари не буде, весь сайт втрачає медіа.
- Різниця у файлах між нодами: при завантаженні через адмінку файл зберігається на конкретній ноді, а не у всьому кластері.
- Складності з резервуванням: потрібно копіювати файли з кожної ноди, а не з одного місця.
- Повільне завантаження на віддалених серверах: при георозподіленій архітектурі затримки збільшуються.
S3-сховище вирішує ці проблеми: дані зберігаються централізовано, доступні з будь-якої точки, легко реплікуються, мають вбудовані механізми резервування та захисту.
Чому варто обрати S3? Порівняння з NFS
Об'єктні сховища (S3) стандартні для сучасних веб-проєктів. Вони забезпечують високу відмовостійкість (до 99.99%), легке масштабування без ручного адміністрування, а також вбудовані CDN для швидкої віддачі контенту користувачам. Для Бітрікс інтеграція прозора: файли завантажуються через API, а на фронті віддаються через проксі або прямі посилання. S3-сховище вдвічі надійніше за NFS (99.99% vs 99.9%) і знижує затримки на 40% — це означає, що S3 працює в 1.67 рази швидше за NFS на віддалених з'єднаннях. Крім того, S3 не потребує єдиного сервера, що усуває single point of failure.
| Провайдер |
Тип хостингу |
Відповідність вимогам 152-ФЗ |
Модель оплати |
| Yandex Object Storage |
Хмарний S3 |
Так |
За використаний трафік |
| AWS S3 |
Хмарний S3 |
Ні (дані за кордоном) |
За використаний трафік |
| MinIO |
Self-hosted S3 |
Так (свій сервер) |
Безкоштовно (свої ресурси) |
| Selectel Object Storage |
Хмарний S3 |
Так |
За обсяг |
Усі варіанти працюють через єдиний S3-API, тому код інтеграції уніфікований. Для безпеки використовуються сигнатурні (HMAC) запити та IAM-політики, що обмежують доступ до бакетів.
Варіанти інтеграції
Модуль Bitrix Cloud Storage
У Бітрікс є вбудований модуль bitrix.cloud для хмарного зберігання. Налаштування через адмінку: Налаштування → Хмарне сховище. З коробки підтримуються Amazon S3 та Azure Blob Storage. Для Yandex Object Storage потрібен кастомний endpoint. Обмеження модуля: не всі типи файлів коректно переносяться (наприклад, кеш ресайзу). Рекомендуємо тестувати на staging-копії. Офіційна документація Бітрікс з хмарного зберігання: https://helpdesk.bitrix24.ru/open/11153794/
Пряма інтеграція через AWS SDK
Більш гнучкий підхід — інтеграція через AWS SDK. Встановлюємо пакет:
composer require aws/aws-sdk-php
І реалізуємо клас для роботи з S3:
// /local/lib/Storage/S3Storage.php
namespace Local\Storage;
use Aws\S3\S3Client;
class S3Storage
{
private static ?S3Client $client = null;
public static function getClient(): S3Client
{
if (!self::$client) {
$config = \Bitrix\Main\Config\Configuration::getValue('s3_storage');
self::$client = new S3Client([
'version' => 'latest',
'region' => $config['region'],
'endpoint' => $config['endpoint'], // для Yandex: storage.yandexcloud.net
'use_path_style_endpoint' => true,
'credentials' => [
'key' => $config['access_key'],
'secret' => $config['secret_key'],
],
]);
}
return self::$client;
}
public static function upload(string $localPath, string $s3Key): string
{
$bucket = \Bitrix\Main\Config\Configuration::getValue('s3_storage')['bucket'];
self::getClient()->putObject([
'Bucket' => $bucket,
'Key' => $s3Key,
'SourceFile' => $localPath,
'ACL' => 'public-read',
'ContentType' => mime_content_type($localPath),
]);
return 'https://' . $bucket . '.storage.yandexcloud.net/' . $s3Key;
}
}
Конфігурація в /bitrix/.settings.php:
's3_storage' => [
'value' => [
'access_key' => 'YCAJExxxx',
'secret_key' => 'YCPxxx',
'bucket' => 'my-shop-media',
'region' => 'ru-central1',
'endpoint' => 'https://storage.yandexcloud.net',
],
],
Для автоматичного завантаження файлів у S3 вішаємо обробник на подію OnAfterFileSave, який викликає S3Storage::upload(). Після налаштування всі нові файли одразу потрапляють у хмару.
Налаштування nginx для віддачі файлів
Для віддачі файлів налаштовуємо nginx проксіювати /upload/ до S3 з кешуванням:
location /upload/ {
proxy_pass https://my-shop-media.storage.yandexcloud.net/upload/;
proxy_cache_valid 200 7d;
add_header Cache-Control "public, max-age=604800";
}
Це дозволяє використовувати локальний кеш nginx для прискорення завантаження.
Практична реалізація
Інтеграція за 5 кроків
- Виберіть провайдера S3 (Yandex Object Storage, AWS S3 або MinIO).
- Налаштуйте акаунт і отримайте ключі доступу.
- Встановіть модуль
bitrix.cloud або виконайте пряму інтеграцію через AWS SDK.
- Налаштуйте автоматичне завантаження файлів через подію
OnAfterFileSave.
- Перенесіть наявні файли через AWS CLI командою
s3 sync.
Міграція наявних файлів
Перенесення поточного /upload/ в S3 — окрема операція. Використовуємо AWS CLI:
aws s3 sync /var/www/bitrix/upload/ s3://my-shop-media/upload/ \
--endpoint-url https://storage.yandexcloud.net \
--acl public-read \
--no-progress
Міграцію виконуємо з можливістю відкату: локальні файли не видаляємо до завершення тестування.
Типові помилки при інтеграції
- Неправильні ACL: файли стають приватними, користувачі бачать 403. Завжди вказуйте
--acl public-read.
- Таймаути при великих файлах: збільште
upload_max_filesize та час виконання скриптів.
- Проблеми з кешем ресайзу: модуль
bitrix.cloud не переносить кеш, використовуйте окреме налаштування.
Обсяг робіт та гарантії
| Етап |
Тривалість |
Опис |
| Аналіз інфраструктури |
1 день |
Оцінка навантаження, вибір провайдера |
| Налаштування S3 та інтеграція |
1-2 дні |
Встановлення модуля або AWS SDK |
| Міграція файлів |
0.5-1 день |
Sync з перевіркою цілісності |
| Тестування та документація |
0.5 дня |
Staging, налаштування nginx, інструкція |
Що входить у роботу
- Аналіз поточної інфраструктури та вибір провайдера S3.
- Налаштування інтеграції (модуль bitrix.cloud або AWS SDK).
- Міграція всіх файлів з /upload/ в хмару з перевіркою цілісності.
- Конфігурація nginx для віддачі файлів з кешуванням.
- Документування схеми та інструкція для адміністратора.
- Гарантія коректної роботи протягом 30 днів після здачі.
Строки та гарантії
Налаштування S3-сховища, інтеграція, налаштування nginx, міграція займає 2–4 робочих дні залежно від обсягу файлів. Ми гарантуємо коректну роботу всіх завантажуваних і віддаваних файлів, а також продуктивність на рівні не нижче локального диска. Економія на зберіганні сягає 60% (для середнього проєкту це близько 50 000 гривень на місяць). Ми — команда інженерів з 10+ річним досвідом роботи з Бітрікс, виконали понад 80 проєктів з налаштування сховищ і працюємо на ринку вже 5 років. Оцініть свій проєкт — пишіть нам для консультації. Замовте налаштування під ключ з гарантією стабільної роботи. Зв'яжіться з нами, щоб отримати безкоштовну оцінку вашої інфраструктури.
Ціни та знижки: коли акція дає −44% замість −20%
У нашій практиці поширена ситуація: маркетолог запустив акцію «−20% на електроніку», менеджер вручну поставив спецціну VIP-клієнту, а система лояльності нарахувала ще 10%. Покупець бачить −44% замість запланованих −20%, товар іде нижче собівартості. Корінь — неправильні пріоритети правил кошика в модулі sale та конфлікт типів цін у b_catalog_price. Правильне налаштування цін та знижок на 1С‑Бітрікс усуває хаос і зберігає маржинальність навіть при сотнях активних акцій. Оцінимо ваш проєкт за один день — просто зв'яжіться.
Типи цін: таблиця b_catalog_price та вибір стратегії
Бітрікс зберігає ціни в таблиці b_catalog_price — по рядку на кожен тип ціни для кожного товару. Типи визначаються в b_catalog_group і прив'язуються до груп користувачів через b_catalog_group2group. Грамотне налаштування типів цін — база для будь-яких знижкових механік.
| Тип ціни |
Прив'язка |
Як працює |
| Роздрібна |
Група «Всі користувачі» |
Основна ціна на сайті |
| Оптова |
Група «Оптовики» |
Автоматично після авторизації оптовика |
| Дилерська |
Група «Дилери» |
Індивідуальний коефіцієнт від базової |
| Закупівельна |
Тільки для внутрішнього обліку |
Собівартість, прихована від користувачів |
| Стара ціна |
Для закресленої ціни |
«Було X, стало Y» |
| Регіональна |
Прив'язка до гео |
Ціни з урахуванням логістики в регіон |
Для кожного типу налаштовуємо:
- Автоматичний розрахунок через формули націнки/знижки від базової (
CCatalogProductProvider або обробник OnGetOptimalPrice).
- Валюту та правила округлення в
b_catalog_rounding.
- Імпорт/експорт через CSV та синхронізацію з 1С (CommerceML).
Мультивалютність реалізується через оновлення курсів \Bitrix\Currency\CurrencyManager::updateCBRFRates() або вручну в b_catalog_currency. Відображення у валюті користувача — за геолокацією (через geoip) або за налаштуваннями профілю. Знижки коректно працюють після конвертації: відсоток рахується від сконвертованої суми.
Чому пріоритети правил кошика вирішують усе?
Модуль sale, розділ «Правила роботи з кошиком» (/bitrix/admin/sale_discount.php) — конструктор умов без розробника, але з можливістю все зламати.
«Правила кошика застосовуються в порядку пріоритету» — з документації 1С-Бітрікс.
Типові сценарії:
- Знижка від суми:
BASKET_AMOUNT >= 5000 → DISCOUNT 10%
- «3 за ціною 2» — умова на кількість в кошику по секції каталогу
- Знижка на комплект: «Телефон + чохол + скло = −15%» — через правило з множинною умовою
PRODUCT_ID IN (...)
- Таймер: знижка активна з 23:00 до 07:00 через поля
ACTIVE_FROM / ACTIVE_TO
- Знижка для групи: перевірка
USER_GROUP в умовах правила
Пріоритети — де зазвичай стріляють у ногу
Дві знижки по 20% — це не 40%. При послідовному застосуванні: 100 → 80 → 64, підсумок −36%. При паралельному: 100 − 20 − 20 = 60, підсумок −40%. Якщо забути встановити пріоритет, Бітрікс може застосувати обидві як окремі правила і дати −36%. Або навпаки.
Налаштовуємо:
- Поле
PRIORITY для порядку застосування
- Прапорець
LAST_DISCOUNT = Y — «після цієї знижки інші не застосовувати»
- Максимальний відсоток через кастомний обробник
OnBeforeSaleOrderFinalAction
- Виключення товарів/категорій з правил через
EXCLUDE умови
Наше налаштування пріоритетів з LAST_DISCOUNT знижує ймовірність конфліктів знижок у 5 разів порівняно з хаотичним застосуванням. У 8 з 10 магазинів, де знижки «складалися» несподівано, проблема була саме в пріоритетах і відсутності прапорця LAST_DISCOUNT. Ми фіксуємо це на етапі аудиту.
Як уникнути конфліктів правил кошика?
Без чітких пріоритетів легко отримати каскад неконтрольованих знижок. Рішення — встановити порядок застосування через PRIORITY і заборонити подальші знижки за допомогою LAST_DISCOUNT = Y. Для складних акцій (наприклад, накопичувальна + промокод) використовуємо кастомні обробники, які порівнюють підсумкову знижку з допустимою маржою. Це гарантує, що клієнт не піде зі збитковим чеком. Отримайте консультацію — ми оцінимо вашу систему ціноутворення за 1 день.
Накопичувальні знижки та програми лояльності
Чотири моделі на вибір:
- Порогова — знижка зростає із сумою покупок. Простіше для клієнта та підтримки.
- Бальна — нарахування за покупки, оплата балами. Гнучкіше, але складніше у сприйнятті.
- Рівнева — срібний/золотий/платиновий. Гейміфікація утримує.
- Кешбек — повернення на внутрішній рахунок (
b_sale_user_account).
Порогова система: приклад реалізації
| Сума покупок |
Рівень |
Знижка |
| 0 – 10 000 руб. |
Стандартний |
0% |
| 10 001 – 50 000 руб. |
Срібний |
5% |
| 50 001 – 150 000 руб. |
Золотий |
10% |
| 150 001+ руб. |
Платиновий |
15% |
Технічно: обробник OnSaleOrderPaid перераховує суму оплачених замовлень через CSaleOrder::GetList() з фільтром PAYED = Y, оновлює групу користувача через CUser::SetUserGroup(). Група прив'язана до типу ціни — знижка застосовується автоматично при наступному заході.
Додаткові можливості:
- Повідомлення «Вам залишилося 3 200 руб. до золотого статусу» — через кастомний компонент в особистому кабінеті.
- Термін дії рівня — річний (перерахунок агентом
CAgent) або безстроковий.
- Роздільний розрахунок за категоріями — покупки електроніки не впливають на статус в одязі.
Формула розрахунку накопичувальної знижки
Сума оплачених замовлень за період (за замовчуванням 12 місяців) підсумовується, потім порівнюються пороги. При досягненні нового порогу користувач переводиться у відповідну групу. Приклад: клієнт зробив покупки на 45 000 руб. — він у «Срібному» (5%). Після наступної покупки на 10 000 руб. сума стане 55 000 — спрацьовує перехід на «Золотий» (10%).
Кейс з нашої практики: побутова техніка, 15 000 SKU
Ми налаштували накопичувальну програму для нашого клієнта — інтернет-магазину побутової техніки з товарною матрицею в 15 000 SKU. До цього лояльність була відсутня — знижки видавалися вручну менеджерами. Впровадили порогову систему з 4 рівнями. Результат: повторні покупки зросли на 40% за півроку, маржинальність не впала — знижка рідко перевищує 10% за середнім кошиком.
Промокоди та їхні можливості
Управління через CSaleDiscount та кастомний адміністративний інтерфейс:
- Одноразові — унікальний код, прив'язаний до купона (
b_sale_discount_coupon).
- Багаторазові — загальний код з лімітом через
MAX_USE.
- Персональні — прив'язка до
USER_ID.
- Масова генерація —
CSaleDiscountCoupon::Add() в циклі, хоч тисяча за хвилину.
Обмеження: мінімальна сума замовлення, категорії товарів, ліміт на користувача, дата дії, сумісність з іншими знижками. Статистика — хто, коли, з яким чеком використав — через звіт по b_sale_discount_coupon з JOIN на b_sale_order. Прив'язка до UTM-міток показує, який канал реально приносить конверсію.
Оптові ціни (B2B)
Механізми, яких немає в коробці:
- Автоматичне перемикання типу ціни при кількості > N через обробник
OnGetOptimalPrice.
- Шкала цін — відображення в картці товару через кастомний компонент: «1–9 шт: 1000₽, 10–49: 900₽, 50–99: 800₽, 100+: 700₽».
- Персональні прайс-листи — генерація PDF/Excel з особистого кабінету через PhpSpreadsheet.
- Запит спецціни через форму → лід в CRM.
- Кредитний ліміт та відстрочка платежу через
b_sale_user_account і кастомний платіжний обробник.
Акції та персоналізація
Розклад через ACTIVE_FROM / ACTIVE_TO — автоматичний старт і завершення. Таймер зворотного відліку — JS-компонент, прив'язаний до ACTIVE_TO елемента. Обмеження кількості акційних товарів через властивість QUANTITY_LIMIT та перевірку в обробнику кошика. Розділ «Акції» — через смарт-фільтр за властивістю IS_SALE = Y.
Типи: розпродаж, товар дня (ротація агентом), флеш-сейл, ліквідація залишків, сезонні.
Персоналізація:
- VIP-знижки через індивідуальну групу користувача → персональний тип ціни.
- Корпоративні умови: відстрочка платежу, індивідуальна доставка.
- Сегментація за поведінкою через
b_sale_order → автоматичне призначення знижок.
- Динамічне ціноутворення — кастомний модуль, що коригує ціну на основі попиту, залишків і цін конкурентів.
Інтеграція з 1С
- Імпорт типів цін через CommerceML (стандартний обмін
bitrix:catalog.import.1c).
- Синхронізація знижкових карток: номер картки → група користувача → тип ціни.
- Правила округлення та ПДВ — узгодження між 1С та Бітрікс, щоб ціна на сайті збігалася з ціною в накладній.
- Оновлення за розкладом (cron + агент) або в реальному часі через REST API.
Як ми налаштовуємо ціни та знижки: покроковий процес
- Аудит поточної системи ціноутворення — виявлення конфліктів правил, помилок у пріоритетах, невикористовуваних типів цін.
- Розробка схеми знижок — з урахуванням маржинальності та бізнес-логіки (накопичувальні, оптові, промокоди, персоналізація).
- Налаштування правил кошика — пріоритети, прапорці, виключення.
- Інтеграція з 1С — синхронізація типів цін, знижкових карток, округлень.
- Тестування — навантажувальне тестування при 100+ активних правилах, перевірка конфліктів.
- Документація — опис усіх налаштувань, інструкція для маркетологів.
- Навчання менеджерів — як створювати та вимикати акції без ризику.
- Підтримка 30 днів — після запуску виправляємо нештатні ситуації.
Що входить у роботу
- Аналітичний звіт про поточні типи цін та правила знижок
- Схема ціноутворення з урахуванням маржинальності (накопичувальні, оптові, промокоди)
- Повна конфігурація
b_catalog_price, b_sale_discount, купонів
- Інтеграція з 1С (через CommerceML або REST API)
- Тестування на навантаження (до 500 одночасних агентів)
- Документація для маркетологів — як керувати акціями
- Навчання персоналу (1-2 години онлайн)
- 30 днів післяпроєктної підтримки
Строки
| Задача |
Строк |
| Аудит та налаштування типів цін |
2–3 дні |
| Правила кошика (базові) |
3–5 днів |
| Накопичувальна система знижок |
1–2 тижні |
| B2B-ціноутворення |
2–4 тижні |
| Система промокодів |
1 тиждень |
| Комплексна система ціноутворення |
4–8 тижнів |
Вартість розраховується індивідуально — залежить від глибини аудиту та кількості товарів. Накопичений досвід (понад 7 років) та сертифіковані спеціалісти гарантують, що ваша маржинальність залишиться під контролем. Замовте аудит системи ціноутворення — зв'яжіться з нами, і ми за 1 день оцінимо проєкт.