Приховування цін з кнопкою «Дізнатися ціну»: архітектура та реалізація
Оптовий клієнт заходить у каталог, бачить роздрібну ціну і йде — вирішивши, що дорого. Або конкурент моніторить ваші ціни через парсер. Приховування цін з кнопкою «Дізнатися ціну» вирішує обидві проблеми: B2B-клієнт залишає заявку, а парсер отримує пусте поле замість числа.
Ми в команді налаштовували приховані ціни для проекту з 15 000+ товарів і 4 типами дилерів. Підхід виявився не таким тривіальним — довелося комбінувати права на типи цін, властивості інфоблоків і кастомну форму запиту. Нижче ділимося архітектурою і гарантуємо, що рішення впишеться у ваш каталог за термін від 2 годин.
Як зберігаються ціни в 1С-Бітрікс?
Ціна товару лежить у таблиці b_catalog_price, прив'язана до типу ціни (b_catalog_group). Компонент catalog.element використовує CCatalogProduct::GetOptimalPrice() — вибирає доступний тип ціни для поточного користувача. Якщо жоден тип ціни не дозволений, метод повертає порожній масив. Це і є точка для приховування.
Рівні приховування ціни
-
Рівень шаблону компонента. Найпростіше: у
template.phpперевіряєте умову і замість ціни виводите кнопку. Умови: група користувача, властивість інфоблокуHIDE_PRICE, наявність певного типу ціни. -
Рівень типу ціни. Створюєте окремий тип ціни «За запитом» у Магазин → Налаштування → Типи цін. Товарам, для яких ціна прихована, не призначаєте роздрібну ціну.
CCatalogProduct::GetOptimalPrice()не знаходить ціну — обробляєте в шаблоні. -
Рівень властивості інфоблоку. Додаєте властивість
PRICE_ON_REQUESTтипу «Список» (Так/Ні). У шаблоні перевіряєте значення властивості і підміняєте блок ціни на форму запиту. Цей спосіб зручний для масового управління через CommerceML.
Реалізація кнопки «Дізнатися ціну»
Кнопка має відкривати форму з мінімумом полів: ім'я, телефон/email, автоматично підставлений артикул товару. Основні варіанти:
| Варіант | Швидкість впровадження | Додаткові можливості |
|---|---|---|
bitrix:form.result.new |
2–3 години | Готові шаблони, подієва модель |
| BX.SidePanel | 4–6 годин | Не відводить зі сторінки, можна вбудувати CRM-форму |
| AJAX-запит | 3–5 годин | Мінімальна форма, повний контроль над дизайном |
Заявка має потрапляти в CRM (якщо Бітрікс24) або відправлятися на email менеджеру. Для CRM використовуйте crm.lead.add через REST API або подію OnAfterResultAdd веб-форми з обробником створення ліда. На одному проекті через подію створювали не тільки лід, але й угоду з прив'язкою до товару через crm.item.add — клієнти отримували пропозицію з актуальною прихованою ціною.
Чому важливо перевіряти кошик?
Якщо ціна прихована на сторінці товару, але товар можна додати в кошик і оформити замовлення, сенс приховування втрачається. Потрібно перевизначити CatalogBasketProvider або перевіряти ціну в OnBeforeBasketAdd. Це часта помилка: забувають налаштувати кошик, і клієнти бачать ціну тільки на етапі оформлення.
Як організувати масове оновлення ознаки приховування?
Для каталогів від 1000 товарів використовуйте властивість інфоблоку PRICE_ON_REQUEST та імпорт з CSV або обмін з 1С (CommerceML). Ми пишемо скрипт-агент, який за 1-2 дні обходить всі товари і встановлює прапорець. Також можлива групова установка через API інфоблоків.
Приховування цін за групами користувачів
Для B2B-сценарію: авторизовані дилери бачать ціну, гості — кнопку запиту. Перевірка через $USER->GetUserGroupArray() у шаблоні компонента. Або через права доступу до типу ціни — в налаштуваннях типу ціни задаєте, які групи користувачів мають доступ. Метод CCatalogGroup::GetGroupsList() повертає дозволені групи.
| Сценарій | Підхід | Термін налаштування |
|---|---|---|
| Приховування для всіх, кнопка «Дізнатися ціну» | Властивість інфоблоку + доопрацювання шаблону | 2–4 години |
| Приховування для гостей, показ для дилерів | Права на тип ціни + перевірка групи | 4–6 годин |
| Масове управління (1000+ товарів) | Властивість + імпорт з CSV/1С | 1–2 дні |
Як ми налаштовували приховування цін у проекті з 4 рівнями дилерів
Конкретний кейс: інтернет-магазин запчастин. 4 групи дилерів, у кожної своя ціна на один і той самий товар. Роздрібна ціна показується тільки гостьовим користувачам, дилери бачать свою групову ціну. Завдання: приховати роздрібну ціну і для гостей, і для дилерів, тому що постачальник заборонив публікувати ціни.
Рішення: створили тип ціни «За запитом» без прив'язки до груп. Всім товарам призначили цей тип ціни з нулем. У шаблоні catalog.element додали перевірку: якщо тип ціни «За запитом» і ціна дорівнює 0, то виводимо кнопку «Дізнатися ціну». Для дилерів — додаткова перевірка: якщо користувач у групі дилерів, то замість кнопки показуємо його ціну (зберігається в окремій властивості інфоблоку). Форму реалізували через BX.SidePanel з формою на bitrix:form.result.new. Заявки йдуть у ліди через REST, менеджер бачить товар і групу клієнта — одразу може відповісти.
Які помилки допускають найчастіше
- Забувають налаштувати права на тип ціни — тоді
GetOptimalPrice()може повернути іншу доступну ціну, і приховування не спрацює. - Не перевіряють пусту ціну — кнопка «Дізнатися ціну» показується навіть якщо ціна фактично є (дорівнює 0).
- Не враховують кошик — якщо ціна прихована, але товар можна додати в кошик і оформити замовлення, сенс приховування втрачається.
Права доступу до типів цін
Метод `CCatalogGroup::GetGroupsList()` повертає масив дозволених груп для кожного типу ціни. Якщо жодна група не вказана, ціна видна всім. Переконайтеся, що для прихованого типу ціни не задані групи-виключення.Що входить в роботу з налаштування прихованих цін
- Аналіз поточної структури каталогу та типів цін.
- Проектування логіки відображення (за групами, властивостями, умовами).
- Реалізація шаблону компонента з кнопкою та формою.
- Налаштування інтеграції з CRM (ліди/угоди).
- Тестування на 10+ сценаріях (гість, дилер, парсер).
- Документація з подальшого управління.
Оцінимо ваш проект за 1 робочий день. Зв'яжіться з нами — підготуємо точний план робіт та терміни.







