Налаштування контрактних цін для дилерів в 1С-Bitrix
Контрактна ціна — це зафіксована в договорі ціна на конкретний артикул для конкретного дилера. Вона не залежить від групових скидок та актуальна строго в період дії договору. Завдання — реалізувати саме цей пріоритет: контрактна ціна перекриває всі інше, але тільки для тих позицій та тільки в строк дії.
Чому стандартні скидки не підходять
Модуль 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С), артикул, ціна, період
- Агент Bitrix читає файл, знаходить дилера по
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 тижні.







