Configuring Individual B2B Prices in 1C-Bitrix: Group vs Highload-Block

Imagine: two clients order the same product but see different prices—because each has their own contract. We know this is a standard B2B scenario that Bitrix solves with price types. However, incorrect configuration leads to clients seeing wrong prices or none at all. This article explains how to av

Our competencies:

Frequently Asked Questions

Imagine: two clients order the same product but see different prices—because each has their own contract. We know this is a standard B2B scenario that Bitrix solves with price types. However, incorrect configuration leads to clients seeing wrong prices or none at all. This article explains how to avoid mistakes and build a flexible system of individual price lists.

Price Type Mechanism in the Catalog Module

In Bitrix, each product can have multiple prices—one per price type (b_catalog_group). A price type is simply a named price level: "Retail", "Wholesale", "VIP", "Contract". For each type, you specify which user groups (b_user_group) can see it.

Configuration in the control panel: Store → Settings → Price Types. Create types for each price level. In "Buyer groups", assign which group sees which type.

Individual Prices: Two Approaches

Approach 1 — Group per Client. Each B2B client gets its own user group and its own price type. The client belongs to that group and sees their prices. Works until you have dozens of clients. With hundreds, management becomes cumbersome: each new client requires creating a group and a price type, plus uploading prices.

Approach 2 — Highload-block for Contract Prices. More scalable (10x better for 50+ clients). Create a Highload-block b2b_contract_prices with fields: UF_COMPANY_ID, UF_PRODUCT_ID, UF_PRICE, UF_CURRENCY, UF_DATE_FROM, UF_DATE_TO. When requesting a product price, first check for a contract price for the client's company, then fall back to group price, then base price. The logic is implemented via a custom price provider.

Criterion Group per Client Highload-block
Max clients 10–20 500+
Time to add 2–3 hours 30 minutes
Flexibility Low High (terms, volumes)
1C integration Direct Via handler

How to Set Price Type Priority?

The order in which the system searches for a price for a specific user is set in the price type settings—field "Sort". Lower number = higher priority. An individual contract price should have sort 1, retail base price 100. This ensures the client sees their agreed price, not the general one.

What to Do with a Large Number of Clients?

If you have more than 50 clients, using a Highload-block is the only reasonable path. We recommend it: our experience (10+ years in the market, 500+ catalog configurations) shows that the group approach breaks down under scaling. Contract prices can be loaded manually via the admin interface or through a CommerceML exchange with 1C.

Loading Prices from 1C

When using CommerceML exchange with 1C, prices are synchronized automatically per price type. In the exchange file, the price type is identified by the ТипЦены field—mapped to CATALOG_GROUP_ID in Bitrix. Contract prices not in the standard price list are exported as a separate file and loaded into the Highload-block via the OnSuccessCatalogImport1C event handler.

Work Process

  1. Analysis – Review current pricing scheme, client count, and groups.
  2. Design – Choose the approach (groups or HL-block), design price type structure.
  3. Implementation – Configure price types, create Highload-block, write custom provider.
  4. Testing – Verify each client sees their prices, cache works, permissions are correct.
  5. Deployment – Move to production server, set up 1C exchange.

What's Included

  • Configuration of price types and their priorities
  • Creation of Highload-block for contract prices (if needed)
  • Writing a custom price provider
  • Setting up price import from 1C (including contract handler)
  • Testing scenarios: authorized/unauthenticated users, different groups
  • Documentation on changing prices and adding new clients

Estimated Timelines

Stage Duration
Setting up price types and groups (up to 5 types) 3–5 days
Developing contract provider with HL-block 1–2 weeks
Full cycle with 1C integration 2–3 weeks

Cost is calculated individually. Contact us to evaluate your project and propose the optimal solution. Place an order to get a transparent individual pricing system without errors.

What to Check After Setup

  • Authorized user in "Wholesale" group does not see "Retail" price and vice versa
  • Unauthenticated user does not see B2B prices at all (if the catalog is closed)
  • Price cache invalidates on change—via tagged cache or CCatalogProduct::clearCacheProductPrice()

Setting up price types and groups for a standard scheme (up to 5 price types, no contract Highload): 3-5 days. Developing a contract price provider with Highload-block: 1-2 weeks.

Comparison of Approaches: Which to Choose?

If you have up to 20 clients and prices change rarely, use the group approach. If you have more clients or individual prices, the Highload-block provides 10x better scalability and flexibility. Our experience guarantees you won't face issues as your business grows.