Типы цен - розница и опт, права групп, цена по количеству
Заводим розничную и оптовую цены, раздаём их группам покупателей и разбираемся, почему на витрине видна не та цена.
Решение
Смотрим заведённые типы цен:
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']);// вызов учитывает и права групп, и правила корзины: витрина показывает это жеИз доступных покупателю типов платформа берёт минимальную цену, а не первую по порядку. Поэтому оптовик с правами на оба типа видит оптовую, а розничный покупатель - розничную, и специально выбирать тип не нужно.
Компонент выводит только те типы цен, что перечислены в его собственных параметрах. Тип, доступный покупателю по правам, но забытый в настройках компонента, на витрину всё равно не попадёт: это отдельная от прав проверка.
Порядок настройки цен всегда один: типы, потом права групп, потом параметры компонента. Пропуск среднего шага даёт «цены не работают», пропуск последнего - «цены есть в админке, но не на витрине». Симптомы разные, а причина в обоих случаях в незакрытом шаге.
Наценки считаются от базового типа. Тип цены с наценкой не хранит своих значений у товаров: цена вычисляется на лету, и в таблице цен её нет. Отсюда пустой результат при прямой выборке цен по такому типу.
Типичные проблемы
Оптовые цены видит только администратор.
У типа цены не выданы права группам покупателей. Права на тип цены отдельны от прав на каталог.
На витрине не та цена, что в карточке товара.
Компонент выводит другой тип цены. Список выводимых типов задаётся параметрами компонента отдельно от прав.
Цена по количеству не применяется.
Диапазоны перекрываются или не покрывают нужное количество. Платформа берёт первую подходящую строку.
Выборка по типу цены с наценкой пуста.
Такая цена вычисляется от базовой и в таблице цен не хранится. Читают базовую и применяют наценку.
Покупатель видит минимальную цену вместо своей.
Это штатное поведение: из доступных типов выбирается наименьшая цена. Лишний тип убирают из прав его группы.
Частые вопросы
Сколько типов цен разумно заводить?
По одному на реальную группу покупателей: розница, опт, дилеры. Каждый тип умножает объём выгрузки и усложняет разбор, поэтому «на всякий случай» их не создают.
Как показать зачёркнутую старую цену?
Вторым типом цены, который выводится рядом с основным. Скидка от правил корзины показывается иначе - её считает модуль продаж.
Можно ли скрыть цену от неавторизованных?
Да, не выдавая права на тип цены группе всех пользователей. Тогда гость видит товар без цены и кнопки покупки.
Почему цена в корзине отличается от цены в каталоге?
В корзине к цене применяются правила корзины, зависящие от состава заказа. В каталоге они показываются только при включённом показе скидок.
Смежное
-
Фильтр по цене и наличию: диапазон, валюта, склад - тип цены в умном фильтре
-
Цены и скидки - оглавление подтемы
-
Цена на витрине не та: разбор причин - когда покупатель видит не ту цену
-
Правила работы с корзиной: условия, порядок, отладка - скидки поверх цены
-
Выгрузка цен из 1С: типы цен, единицы, частичный обмен - откуда приезжают цены
-
Региональность магазина: выбор города, цены и склады - тип цены, выбранный регионом
-
Каталог и продажи - устройство магазина целиком
-
Валюты и курсы: несколько валют и пересчёт цен - в какой валюте хранится цена
-
НДС в каталоге и заказах: ставки, цена с налогом и доставка - налог поверх той же цены
-
Скидки и ручные цены при обмене: что перезаписывает обмен - какие типы переписывает обмен
-
Дилерский доступ: свои цены, свой каталог, документы - задача целиком, а не только цены
-
Путь цены: от типа цены до суммы в корзине - как из типов цен получается сумма заказа
-
Массовая смена цен: наценка, округление, откат - разовая правка цен пачкой