Откуда берутся персональные цены и зачем они нужны
Ваш сайт работает на 1С-Битрикс? Каждому клиенту вы даёте собственную скидку или назначаете персональную цену на товар? Со временем в вашей 1С сложилась непростая логика ценообразования и формирования скидок? А может быть скидки должны работать только при нарастающей луне? С такими вводными к нам обращается добрая половина клиентов.
Подружить цены и скидки в 1С с сайтом на Битрикс — задача, за которую возьмётся не каждый. Мы умеем делать такое хитрое ценообразование. В статье мы провели обзор различных решений и делимся результатами.
Разберемся с понятиями
Чем отличается персональная цена от персональной скидки?
Персональные цены можно настроить для любого товара, для любого зарегистрированного пользователя. На сайте или в 1С указывается конечная цена товара для конкретного клиента. В каталоге выглядит так:
У товара с персональной скидкой выводится:
-
зачеркнутая старая цена;
-
величина скидки;
-
новая цена.
Предостережение. Каталог. Фильтр. Сортировка.
Некоторые из рассматриваемых способов реализации персональных скидок и цен имеют ограничение — они не работают в стандартном каталоге. Вывод цен и скидок в каталоге — это отдельная задача, которую придется решить. Т.к. цена вычисляется на лету для каждого посетителя, выполнять сортировку и фильтрацию товаров по персональным ценам будет невозможно. Только по базовым ценам.
Еще нужно учитывать, что любой фильтр (даже умный) будет фильтровать товары только по цене (даже если вы её пересчитываете через GetOptimalPrice) без учёта скидок.
Данные о скидках должны где-то храниться
Для работы этого механизма сайт должен как-то получать цены и скидки. Можно использовать инфоблоки, справочники (highload блоки), запрашивать данные через REST API или SOAP. Удобнее всего использовать справочник. Структура справочника такая:
Для персональных скидок:
ID товара |
ID пользователя или группы |
Скидка, % |
55 (Футболка красная) |
109 (Лебедев Антон) |
10 |
57 (Футболка белая) |
156 (Попова Елизавета) |
15 |
Для персональных цен:
ID товара |
ID пользователя или группы |
Цена, руб |
55 (Футболка красная) |
109 (Лебедев Антон) |
300 |
57 (Футболка белая) |
156 (Попова Елизавета) |
500 |
Справочник формируется и выгружается на сайт из 1С. Он может регулярно обновляться, и эти изменения будут тут же применяться. Каждый из следующих способов реализации персональных скидок или цен будет использовать его в качестве источника данных.
Обзор решений
Грамотных способов сделать персональные цены и скидки всего 5. И помещение логики формирования цены в шаблоны компонентов к ним не относится. Мы же хотим сохранить работоспособность правил работы корзины, НДС, наценок и т.д.
Правила работы с корзиной
Стандартные правила работы с корзиной позволяют создать персональную скидку на товары в дружелюбном интерфейсе:
Недостатки:
-
Количество правил=количество индивидуальных скидок. Если на сайте 10000 пользователей и 10000 товаров, то потребуется 100 000 000 правил
-
Технология кеширования, призванная ускорить работу сайта, становится бесполезной, а сам кеш начинает занимать сотни платных гигабайт на сервере.
Чтобы не заниматься глупой работой, лучше обратиться к справочникам и разработке собственных правил работы с корзиной. Как и многое в 1С-Битрикс, правила можно кастомизировать. Будет это выглядеть следующим образом:
Вместо сотни правил мы создаем одно, которое будет рассчитывать скидки на товары, используя в качестве источника данных справочник. В настройках правила указывается справочник (highload-блок). Структура справочника персональных скидок описана выше.
Чтобы создать кастомизированное правило работы с корзиной необходимо написать собственный класс и реализовать метод применения скидки. Метод будет для каждого товара корзины и текущего пользователя находить в справочнике нужную запись. Если запись найдена, то применяется соответствующая скидка к товару.
Если вы хотите получить код кастомной скидки с руководством по настройке, поделитесь этой статьей в социальных сетях и заполните форму в конце страницы.
Провайдер цен
Провайдер цен — это стандартный механизм Битрикс, который позволяет переопределить стоимость товара в корзине. С его помощью можно реализовать персональную цену. В этом случае в нашем справочнике вместо величины скидки будет указана конечная цена товара.
Реализация.Фактически провайдер это класс-обработчик товаров корзины. Битрикс позволяет переопределить свой стандартный обработчик.
Событие OnGetOptimalPrice
Обработчик события OnGetOptimalPrice тоже стандартный инструмент Битрикс. Его можно использовать для установки персональных цен, а именно переопределения базовой стоимости товара.
Если вы хотите получить код провайдера цен и обработчика события OnGetOptimalPrice с руководством по настройке, поделитесь этой статьей в социальных сетях и заполните форму в конце страницы
Типы цен и группы пользователей
Как правила работы с корзиной помогают создать персональные скидки без программирования, так типы цен помогают создать персональные цены. При таком способе не требуется заводить справочник. Все пользователи распределяются по группам и для каждой заводится свой тип цены.
Надо четко разграничить права на типы цен, потому что пользователю будет показана минимальная из доступных ему типов цен.
Сравнение методов
Обобщим полученную информацию:
|
Подходит для |
|
|
персональных цен |
персональных скидок |
Кастомизированное правило работы с корзиной |
нет |
да |
Провайдер цен |
да |
частично (только с флагом CUSTOM_PRICE = Y) |
Событие OnGetOptimalPrice |
да |
нет |
N скидок, N групп пользователей |
нет |
да |
N типов цен, N групп пользователей |
да |
нет |
Где мы хотим видеть цены на товары:
- каталог — список товаров (catalog.section) и детальная страница товара (catalog.element);
- в заказе — корзина (sale.basket), оформление заказа (sale.order.ajax), персональный раздел пользователя (sale.personal.order);
- в заказе в административной части.
|
Стандартно работает в |
||
|
каталоге |
заказе |
админке |
Кастомизированное правило работы с корзиной |
нет |
да |
да |
Провайдер цен |
нет |
да |
да |
Событие OnGetOptimalPrice |
нет |
да |
да |
N скидок, N групп пользователей |
да |
да |
да |
N типов цен, N групп пользователей |
да |
да |
да |
Очевидно, каталог — камень преткновения. Но это поправимо — цены товаров можно задать в шаблоне компонентов каталога. Да, логику формирования цены придется в некотором смысле повторить в шаблоне, но лучшей альтернативы нет.
Производительность
Хоть и существуют стандартные возможности сделать персональные цены и скидки, которые не требуют программирования, важно понимать насколько ресурсоемкими они окажутся и насколько станут тормозить сайт.
В качестве целевой функции расчета стоимости товара используем функцию CCatalogProduct::GetOptimalPrice(). Она определяет цену товара с учетом различных типов цен и правил работы с корзиной.
Мы замерили время работы функции при различном количестве типов цен в системе:
На основе этих данных можно сказать, что при количестве типов цен равном 100, цена 1 товара для 1 пользователя будет вычисляться около 0.7 секунды. То есть на загрузку страницы раздела каталога с 10 товарами уйдет более 7 секунд — слишком долго для сайта (при оптимальном времени загрузки страницы — 2 секунды).
Таким образом, реализовывать персональные цены с помощью типов цен — допустимо. Но при количестве типов цен не более 20-30. В настройках каталога мы выбираем все имеющиеся типы цен.
Это ограничение можно обойти если предварительно в настройках каталога отфильтровывать типы цен — оставлять только доступные текущему пользователю. Получают их запросом к API Битрикс.
Также мы сравнили скорость расчета товаров в корзине со скидками: в одном случае скидки создавались с помощью стандартных правил работы с корзиной (1 персональная скидка = 1 правило), а в другом — с помощью кастомизированного правила работы с корзиной на основе справочника (на все скидки 1 правило).
Расчет скидки на основе справочника работает на 30 % быстрее, чем стандартные правила работы с корзиной. Хотя количество правил почти не влияет на время расчета стоимости товаров в корзине, создавать их придется вручную.
Резюме
Для изменения цен товаров в Битриксе есть различные инструменты. Чтобы выбрать подходящий, определите:
-
что требуется: цены или скидки;
-
ожидаемое количество цен/скидок.
Короткая рекомендация, какие из инструментов в каком случае использовать:
-
для персональных цен при небольшом количестве — типы цен и группы пользователей. В остальных случаях — провайдер цен либо событие OnGetOptimalPrice;
-
для персональных скидок — кастомизированные правила работы с корзиной, если скидка не фиксированная.
Алгоритм выбора способа: