Вебформат

Главная/Блог/Сайты и e-commerce

Сайты и e-commerce17 июля 202610 мин

Персональные цены для 19 сегментов покупателей на одной витрине

Розница, опт, дилеры и партнёры покупают в одном каталоге - и каждый видит свою цену. Ценовая политика ведётся только в 1С:ERP: 741 правило доступа, до 22 ценовых колонок на товар, более 200 тысяч готовых персональных ценников. Разбор, как это устроено.

19 сегментов покупателей - одна витрина
19 сегментов покупателей - одна витрина

Компания продаёт автосервисное оборудование и расходные материалы одновременно рознице, оптовым клиентам, дилерам и партнёрам. У каждой группы покупателей свои условия: у кого-то процент от прайс-листа, у кого-то отдельная согласованная цена, у кого-то - индивидуальные условия на отдельные категории товаров. Всё это ведётся в 1С:ERP и там же меняется - дублировать условия на сайте никто не должен.

Требование к витрине звучит просто, но стандартными средствами платформы его не выполнить.

Один каталог, одна карточка товара - и каждый покупатель видит свою цену. Розница не должна видеть дилерские условия, а дилер не должен искать свою цену в PDF-прайсе.

Почему это не решается настройками магазина

Стандартный интернет-магазин связывает цену с группой пользователей: "этой группе - такая-то ценовая колонка". Такая связка плоская и покрывает только простые случаи. В реальной коммерческой политике компании оказалось три требования, которых в ней нет.

  • Условия зависят сразу от двух вещей. Не только от того, кто покупатель, но и от того, что он покупает: на шиноремонтные материалы у дилера одни условия, на автохимию - другие. Это два измерения, а стандартная связка "группа - цена" знает только одно.
  • Покупателю доступна не одна цена, а несколько. У сегмента одновременно есть личная согласованная цена, общая розничная и цена распродажи. Вопрос "какую из них показать" платформа не решает - она отдаёт цену конкретной колонки.
  • Фильтровать и сортировать нужно по цене, которой ещё нет. Пока не известно, кто перед нами, неизвестна и цена товара. А покупателю нужен фильтр "от 30 до 50 тысяч" и сортировка по возрастанию - по его ценам, а не по общим.

Решение

Одна витрина - у каждого своя цена

Одна витрина - у каждого покупателя своя цена
1С:ERP
Здесь ведут коммерческую политику: виды цен, сегменты клиентов, скидки
правила и виды цен обновляются из 1С
Правила ценообразования
Кто какой товар по какой цене покупает - 741 правило
витрина знает, какую цену показать
Интернет-магазин
Один каталог, одни карточки товаров
у каждого сегмента - своя картина
Гость
общая цена
Розничный клиент
розничная цена
Дилер
дилерская цена и размер скидки
Дистрибьютор
дистрибьюторская цена
Каждый покупатель видит только свою цену: дилерские условия не видны ни рознице, ни конкурентам. Прайс-листы на сайте никто не ведёт руками - меняете условия в 1С, витрина подхватывает сама.

Коммерческая политика остаётся в 1С. На сайте её никто не заводит руками: правила и суммы приезжают из 1С сами и обновляются в течение минут после изменения.

Что приходит из 1С

Из 1С приходят две разные вещи, и это разделение - ключевое. Правила доступа отвечают на вопрос "кому что видно": какому сегменту покупателей на какой категории товаров какая ценовая колонка доступна. Сейчас таких правил 741 - это 19 сегментов, помноженные на 13 категорий товаров и на 3 доступные колонки. Суммы - это сами цены: "товар, колонка, сумма". Таких записей больше 200 тысяч, и у ходового товара может быть до 22 колонок одновременно.

Отдельно стоит правило-сокращение: если в правиле не указана категория товаров, оно автоматически разворачивается на все категории каталога. Так из одной строки в 1С включается распродажа по всему ассортименту - перечислять категории вручную не нужно.

Правило минимума

Один товар - разные цены для разных покупателей
Товар: диагностический сканер
Из 1С пришли 22 ценовые колонки: розничная около 45 000 ₽, распродажа около 37 000 ₽, дилерская распродажа около 33 500 ₽, личные колонки сегментов - от 29 500 ₽
каждому сегменту доступны свои колонки, витрина берёт минимум
Розничный клиент
доступны розничная и распродажа
≈37 000 ₽
Оптовик с личной ценой
личная около 42 500 ₽, но распродажа выгоднее
≈37 000 ₽
Региональный дилер
дилерская распродажа
≈33 500 ₽
Крупный дилер
личная колонка выгоднее всех
≈29 500 ₽
Из доступных покупателю колонок витрина всегда берёт самую выгодную, а зачёркивает самую дорогую цену товара: покупатель видит и свою цену, и размер своей выгоды. Пример - реальный товар рабочего каталога, цены округлены, покупатели обезличены.

Это правило снимает целый класс ручной работы. Когда начинается распродажа, никто не проверяет, у кого личная цена оказалась выгоднее акционной. Оптовик с личной ценой около 42 500 ₽ во время распродажи получает цену около 37 000 ₽ - система сама отдаёт то, что выгоднее клиенту. Когда распродажа кончится, он вернётся к своей цене.

Путь цены от 1С до ценника

Путь цены: от коммерческой политики в 1С - до ценника на экране
1С:ERP
Меняются условия продаж: новая цена, скидка сегменту, старт распродажи
1С выгружает правила доступа и суммы по ценовым колонкам
очередь проверяется каждые ~10 секунд
Сервис синхронизации
Обновил правила доступа: сегменты, категории, колонки
Записал суммы: у ходового товара - до 22 колонок
пересчитать цены изменившихся товаров
Пересчёт цен на сайте
Для каждого сегмента отобрал доступные ему колонки
Взял самую выгодную - это цена сегмента
Сложил результат в готовую таблицу: товар × сегмент × раздел каталога
готовые ценники лежат в памяти сервера
Витрина
Покупатель видит свою цену - в каталоге, карточке, корзине
Фильтр "от - до" и сортировка работают по его личным ценам

Сайт проверяет очередь выгрузок каждые ~10 секунд, поэтому новая выгрузка из 1С попадает в работу за секунды: цены, остатки и склады на витрине обновляются с той частотой, с какой их отдаёт 1С, а не по расписанию сайта. После каждой выгрузки цен сайт пересчитывает персональные цены изменившихся товаров - для всех сегментов сразу - и складывает результат в готовую таблицу.

Почему цены считаются заранее

Было

Считать цену в момент показа страницы: чтобы отобрать товары "от 30 до 50 тысяч", пришлось бы посчитать цену каждого товара раздела заново - на каждый показ и для каждого посетителя.

Стало

Цены посчитаны заранее, сразу после выгрузки из 1С: около 220 тысяч готовых ценников хранятся в оперативной памяти сервера - витрина ничего не вычисляет, она берёт готовое.

Это главное техническое решение кейса. Готовая таблица хранит по одной строке на сочетание "товар + сегмент + раздел каталога", поэтому фильтр по цене, сортировка и надпись "Цена от…" на разделе работают по личным ценам покупателя и не тормозят каталог.


Как это устроено внутри

СлойРешение
Приём данныхОтдельный сервис синхронизации разбирает выгрузки 1С и пишет правила доступа в справочник, а суммы - в стандартные цены каталога
Правила доступаHighload-справочник "сегмент × категория × ценовая колонка"; развёртка правила без категории на все категории выполняется при импорте, поэтому на витрине правила всегда конкретны
Сегмент покупателяСвойство пользователя, а не группа доступа: гость и непрошедший модерацию клиент получают сегмент по умолчанию, прошедший - свой
РасчётПакетный расчёт по всем сегментам сразу: цена сегмента - минимум из разрешённых правилами колонок; зачёркнутая - максимальная цена товара; выгода - разница между ними
ХранениеДенормализованная таблица "товар × сегмент × раздел" в оперативной памяти, с составным индексом под фильтр и сортировку в разрезе раздела
ВитринаКаталог не обращается к ценам напрямую - только к готовой таблице; сортировка и пагинация по цене выполняются поверх стандартного компонента
ПересчётСервис синхронизации после записи цен вызывает пересчёт на стороне сайта по списку изменившихся товаров

Почему сегмент - не группа пользователей. Группы доступа Битрикса плоские: они не умеют выразить "дилеру на инструмент - одна колонка, на расходники - другая". Сегмент вынесен в отдельный справочник, синхронизируемый с 1С, а доступ к колонкам решает матрица правил. Заодно это развязывает права доступа на сайте и коммерческую сегментацию: новый сегмент в 1С не требует заводить группу пользователей и раздавать права.

Почему скидка вычисляется, а не назначается. 1С присылает готовые суммы по колонкам - никаких процентов на стороне сайта не применяется. Процент выгоды выводится из разницы между самой дорогой колонкой товара и ценой сегмента и служит только витриной ("было / стало"). Это исключает класс ошибок, когда сайт и 1С считают скидку по-разному: единственный источник истины - суммы из 1С.

Что это дало бизнесу

РаньшеСтало
Прайс-листы для дилеров рассылались файлами и устаревалиДилер видит актуальную цену на витрине; условия меняются в 1С и приезжают за минуты
Одна витрина не могла обслуживать розницу и опт одновременноОдин каталог на все сегменты; дилерские условия не видны посторонним
Запуск распродажи требовал проверки, у кого личная цена выгоднееПравило минимума решает это автоматически, для всех сегментов сразу
Индивидуальные условия на категорию товаров вести было негдеУсловия задаются парой "сегмент + категория товаров" и приходят из 1С
Фильтр и сортировка по цене считали бы по единой цене - и вводили покупателя в заблуждениеФильтр "от - до", сортировка и "Цена от…" считают личные цены покупателя
Появление нового сегмента - это доработкаНовый сегмент заводится в 1С; сайт подхватывает его и рассчитывает цены сам

В цифрах

ПоказательЗначение
Сегментов покупателей19
Категорий товаров в правилах13
Правил доступа к ценам741
Записей о ценах товаровболее 200 тысяч
Ценовых колонок у ходового товарадо 22 одновременно
Товаров в каталогеболее 13 000 активных
Готовых персональных ценниковоколо 220 тысяч
Разделов каталога в расчёте585
Подхват выгрузок сайтомочередь проверяется каждые ~10 секунд; свежесть цен равна частоте выгрузки из 1С
Разброс цены одного товара по сегментампримерно от 29 500 до 45 000 ₽ (пример из рабочего каталога)

Эта витрина - часть большой B2B-платформы: каталог, дилерский кабинет и двусторонний обмен с 1С. Что вошло в проект целиком - в кейсе B2B e-commerce платформы.

Нужна витрина, которая понимает вашу коммерческую политику?

Расскажите, как устроены ваши цены: сегменты, скидки, личные условия. Покажем на живом проекте, как это работает на одной витрине, и оценим перенос вашей логики из 1С.