Случалось ли вам пользоваться конструктором скидок в 1С-Битрикс? На наш взгляд — это одна из самых крутых фич данной системы, при должном понимании которой открывается широчайший функционал: хотите скидку на синие штаны определенного бренда при строгом соответствии с фазой луны? Пожалуйста!
Но как показала практика, функционал этого инструмента — слабое место. Из-за количества анализируемых сущностей, при большом количестве товаров в корзине (100+), и большом количестве скидок (30+), время рендера корзины, а так же сохранение заказа неприлично растет. И растет совсем неприлично (счет идет на минуты!) при дальнейшем увеличении корзины — а в нашем проекте могло быть и 700+ товаров в корзине. Если прибавить к этому онлайн в несколько сотен пользователей, одновременно работающих с корзиной…
Мы пошли сложным путем: решили дублировать данный функционал, разработав с ноля модуль для высокопроизводительного расчета скидок. А раз так — то и корзину решили ускорить!
Итого, наша кастомная корзина держит на стандартном тарифе firstvds более 25 000 уников в сутки, с высоким одновременным онлайном, работает в каталоге с нескольким десятком тысяч позиций, и все операции делает мгновенно! Как это получилось?
Для расчета скидок мы ограничившись полутора десятками анализируемых параметров:
- Период действия
- Сумма корзины
- Количество артикулов в корзине
- Количество позиций в корзине
- Способ оплаты
- Исключение совместимости с другими скидками
- Покупка конкретного товара
- Категория + фильтрация товара по ней
- Первый заказ
Результат применяемой скидки тоже ограничен:
- Скидка в % + на выбранные товары/категории
- Скидка в рублях
- Бесплатная доставка
- Удвоить выбранный товар (1+1)
- Цикличный подарок (при покупке каждых N штук в подарок +N штук)
- Скидка по свойству товара
А для еще большего ускорения — пересчет корзины и скидок происходит только в двух случаях:
- Корректировка корзины (добавление или удаление товара, изменение кол-ва)
- Оформление заказа
Слишком сложно? На первый взгляд да.
Но решение полностью оправдало себя: оно работает в проекте уже третий год, имеет огромный запас по нагрузке, а благодаря к подходу в построении кода — уже несколько раз успешно модернизировалось — добавляли новые параметры к анализу, и новые результаты применения.
Столкнулись с похожей проблемой? Будем рады поделиться своим опытом!