Настройка контрактных цен для дилеров 1С-Битрикс
Контрактная цена — это зафиксированная в договоре цена на конкретный артикул для конкретного дилера. Она не зависит от групповых скидок и актуальна строго в период действия договора. Задача — реализовать именно этот приоритет: контрактная цена перекрывает всё остальное, но только для тех позиций и только в срок действия.
Почему стандартные скидки не подходят
Модуль catalog предоставляет скидки (CCatalogDiscount) и типы цен (b_catalog_group). Скидки задаются в процентах или фиксированной суммой, применяются к типу цены. Для контрактных цен это не подходит: договорная цена — это абсолютное значение, не производное от базовой. Если базовая цена изменилась, контрактная должна остаться прежней.
Хранение контрактных цен
Создаём Highload-блок dealer_contract_prices. Таблица генерируется автоматически по имени блока. Поля:
| Поле | Тип | Описание |
|---|---|---|
UF_DEALER_ID |
Integer | ID дилерской компании |
UF_PRODUCT_ID |
Integer | ID товара в инфоблоке |
UF_XML_ID |
String | Артикул (для синхронизации с 1С) |
UF_PRICE |
Double | Контрактная цена |
UF_CURRENCY |
String | Валюта |
UF_DATE_FROM |
DateTime | Начало действия |
UF_DATE_TO |
DateTime | Конец действия |
UF_ACTIVE |
Boolean | Активность |
Индекс по (UF_DEALER_ID, UF_PRODUCT_ID, UF_ACTIVE) — обязателен, иначе выборка при большом объёме будет медленной.
Логика применения цены
Реализуется через кастомный провайдер цен, подключаемый к событию OnSaleBasketBeforeSaved или через расширение Bitrix\Catalog\v2\Price. Алгоритм:
- Определяем дилерскую компанию текущего пользователя из сессии
- Ищем в
dealer_contract_pricesзапись сUF_DEALER_ID= компания,UF_PRODUCT_ID= товар,UF_DATE_FROM≤ сегодня ≤UF_DATE_TO,UF_ACTIVE= true - Если запись найдена — используем
UF_PRICEкак финальную цену, игнорируем тип цены группы - Если не найдена — откатываемся к стандартному типу цены дилера по его группе в
b_catalog_price
Результат кешируется в memcached/Redis по ключу contract_price_{dealerId}_{productId} на 1 час. Инвалидация — при обновлении записи в Highload-блоке через обработчик события OnAfterHLBlockElementUpdate.
Загрузка контрактных цен из 1С
Контрактные цены ведутся в 1С. Синхронизация через агент:
- 1С выгружает XML с контрактными позициями: дилер (код в 1С), артикул, цена, период
- Агент Битрикс читает файл, находит дилера по
UF_1C_IDв Highload-блоке компаний - Находит товар по
XML_IDвb_iblock_element - Создаёт/обновляет запись в
dealer_contract_prices - Истёкшие записи помечает
UF_ACTIVE= false
Частота синхронизации — при обновлении прайсов в 1С (событийно) или по крону 2 раза в сутки.
Отображение в каталоге
Для авторизованного дилера рядом с ценой показываем метку «Контрактная» или «По договору №...». Это даёт уверенность, что цена применена корректно. Реализуется в result_modifier.php компонента каталога: к данным товара добавляется флаг IS_CONTRACT_PRICE и номер договора.
Настройка хранилища и логики применения контрактных цен: 1-2 недели. Включая интеграцию с выгрузкой из 1С — 2-3 недели.







