Перейти к содержимому

Типы цен - розница и опт, права групп, цена по количеству

Заводим розничную и оптовую цены, раздаём их группам покупателей и разбираемся, почему на витрине видна не та цена.

Решение

Смотрим заведённые типы цен:

use Bitrix\Main\Loader;
Loader::includeModule('catalog');
$res = CCatalogGroup::GetList(['SORT' => 'ASC'], []);
// порядок сортировки решает, какой тип берётся первым при показе
while ($group = $res->Fetch()) {
printf("%-4s %-16s база=%s код обмена=%s\n",
$group['ID'], $group['NAME'], $group['BASE'], $group['XML_ID'] ?: '-');
}

Тип цены - это справочник магазина, общий для всех товаров каталога. Базовый тип в нём всегда один: от него считаются наценки других типов, и удалить его платформа не даёт.

Раздаём права на типы цен:

CCatalogGroup::Update($priceTypeId, [
'USER_GROUP' => [2, 6], // кто видит цену этого типа
'USER_GROUP_BUY' => [6], // кто может по ней покупать
]);
// покупателю показываются только разрешённые его группам типы

Права на тип цены решают, кто вообще её увидит на сайте. Оптовая цена без прав видна только администратору, и менеджер после этого честно сообщает, что «оптовые цены не работают».

Задаём цену по количеству:

CPrice::Add([
'PRODUCT_ID' => $productId,
'CATALOG_GROUP_ID' => $wholesaleTypeId,
'PRICE' => 900,
'CURRENCY' => 'RUB',
'QUANTITY_FROM' => 10, // от десяти штук
'QUANTITY_TO' => null, // и до бесконечности
]);
// диапазоны не должны перекрываться: платформа берёт первый подходящий

Диапазоны количества - это отдельные строки цены одного типа. Платформа выбирает подходящую строку по количеству в корзине и пересчитывает позицию при каждом его изменении.

Смотрим, какую цену увидит покупатель:

$price = CCatalogProduct::GetOptimalPrice($productId, 1, $USER->GetUserGroupArray());
printf("тип=%s цена=%.2f скидка=%.2f\n",
$price['PRICE']['CATALOG_GROUP_ID'], $price['PRICE']['PRICE'], $price['DISCOUNT_PRICE']);
// вызов учитывает и права групп, и правила корзины: витрина показывает это же

Из доступных покупателю типов платформа берёт минимальную цену, а не первую по порядку. Поэтому оптовик с правами на оба типа видит оптовую, а розничный покупатель - розничную, и специально выбирать тип не нужно.

Компонент выводит только те типы цен, что перечислены в его собственных параметрах. Тип, доступный покупателю по правам, но забытый в настройках компонента, на витрину всё равно не попадёт: это отдельная от прав проверка.

Порядок настройки цен всегда один: типы, потом права групп, потом параметры компонента. Пропуск среднего шага даёт «цены не работают», пропуск последнего - «цены есть в админке, но не на витрине». Симптомы разные, а причина в обоих случаях в незакрытом шаге.

Наценки считаются от базового типа. Тип цены с наценкой не хранит своих значений у товаров: цена вычисляется на лету, и в таблице цен её нет. Отсюда пустой результат при прямой выборке цен по такому типу.

Типичные проблемы

Оптовые цены видит только администратор.

У типа цены не выданы права группам покупателей. Права на тип цены отдельны от прав на каталог.

На витрине не та цена, что в карточке товара.

Компонент выводит другой тип цены. Список выводимых типов задаётся параметрами компонента отдельно от прав.

Цена по количеству не применяется.

Диапазоны перекрываются или не покрывают нужное количество. Платформа берёт первую подходящую строку.

Выборка по типу цены с наценкой пуста.

Такая цена вычисляется от базовой и в таблице цен не хранится. Читают базовую и применяют наценку.

Покупатель видит минимальную цену вместо своей.

Это штатное поведение: из доступных типов выбирается наименьшая цена. Лишний тип убирают из прав его группы.

Частые вопросы

Сколько типов цен разумно заводить?

По одному на реальную группу покупателей: розница, опт, дилеры. Каждый тип умножает объём выгрузки и усложняет разбор, поэтому «на всякий случай» их не создают.

Как показать зачёркнутую старую цену?

Вторым типом цены, который выводится рядом с основным. Скидка от правил корзины показывается иначе - её считает модуль продаж.

Можно ли скрыть цену от неавторизованных?

Да, не выдавая права на тип цены группе всех пользователей. Тогда гость видит товар без цены и кнопки покупки.

Почему цена в корзине отличается от цены в каталоге?

В корзине к цене применяются правила корзины, зависящие от состава заказа. В каталоге они показываются только при включённом показе скидок.

Смежное

Первоисточник