Скрытие цен с кнопкой «Узнать цену»: архитектура и реализация
Оптовый клиент заходит в каталог, видит розничную цену и уходит — решив, что дорого. Или конкурент мониторит ваши цены через парсер. Скрытие цен с кнопкой «Узнать цену» решает обе проблемы: 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 рабочий день. Свяжитесь с нами — подготовим точный план работ и сроки.







