Битрикс. Типы цен и наценки

24.08.2018

Теги: CMSWeb-разработкаБитриксИнтернетМагазинКаталогТоваровНастройкаПользовательПраваДоступа

Для работы интернет-магазина необходимо установить цены, с которыми он будет работать. Если позволяет редакция продукта, то в каталоге можно использовать несколько типов цен, но при этом один из типов цен является базовым. Базовая цена — это цена, относительной которой рассчитываются все остальные цены системы.

Типы цен

По умолчанию в системе уже доступна Розничная цена, она же назначена и базовой. Давайте создадим еще два типа цен: для постоянных клиентов и оптовых покупателей. Но для начала надо создать две группы пользователей, потому что типы цен привязываются к группам.

В панели управления переходим в «Настройки • Пользователи • Группы пользователей» и создаем две новые группы:

  • Постоянные покупатели
  • Оптовые покупатели

Управление типами цен осуществляется на странице «Магазин • Настройки • Цены • Типы цен»:

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

  • Постоянный покупатель, код REGULAR_BUYER
  • Оптовый покупатель, код WHOLESALE_BUYER

Обязательно указываем группы пользователей, которые имеют право на просмотр этой цены и на покупку по этой цене:

Теперь при редактировании товара можно кроме розничной цены задать еще и цену для постоянных клиентов и для оптовых покупателей:

Наценки

Наценки — заранее установленная величина в относительном выражении, на которую уменьшается или увеличивается цена товара. Наценки применяются к базовой цене при расчете других типов цен товара (базовую цену сменить невозможно). Каждая цена будет считаться по формуле:
[Цена]=[Базовая цена]+[Базовая цена]*[Наценка в процентах/100]

Наценка может быть представлена как положительной, так и отрицательной величиной.

Переходим на страницу «Магазин • Настройки • Цены • Наценки» и создаем две наценки:

  • Постоянный покупатель, наценка -10%
  • Оптовый покупатель, наценка -20%

При редактировании наценки можно отметить checkbox «Пересчитать цены»:

После этого произойдёт автоматическое изменение цены для всех товаров, у которых применена эта наценка:

Примеры кода

// получаем тип цен с идентификатором $ID, включая языкозависимые параметры
$result = CCatalogGroup::GetByID($ID);
if ($result['CAN_ACCESS'] == 'Y') {
    echo 'Вы можете видеть цены типа '.$result['NAME_LANG'].'<br/>';
}
if ($result['CAN_BUY'] == 'Y') {
    echo 'Вы можете покупать товары по ценам типа '.$result['NAME_LANG'].'<br/>';
}
// получаем типы цен с внутренним именем RETAIL
$result = CCatalogGroup::GetList(
    array('SORT' => 'ASC'),
    array('NAME' => 'RETAIL')
);
while ($arPriceType = $result->Fetch()) {
    echo $arPriceType['NAME_LANG'].' - '.$arPriceType['CAN_ACCESS'].'<br/>';
}
// получаем цену типа $PRICE_TYPE_ID для товара с идентификатором $PRODUCT_ID
$result = CPrice::GetList(
    array(),
    array(
        'PRODUCT_ID' => $PRODUCT_ID,
        'CATALOG_GROUP_ID' => $PRICE_TYPE_ID
    )
);
if ($price = $result->Fetch()) {
    echo CurrencyFormat($price['PRICE'], $price['CURRENCY']);
} else {
    echo 'Цена не найдена!';
}

Пример получения цены товара, в зависимости от того, авторизован пользователь или нет. И если авторизован — какой группе он принадлежит (постоянный покупатель или оптовый покупатель):

/*
 * Определяемся, какую цену товара будем показывать
 */
$productPrice = CurrencyFormat(0.0, 'RUB');
// это идентификатор типа цен BASE (розничная цена)
$PRICE_TYPE_ID = PRICE_TYPE_BASE;
// если пользователь авторизован, он может принадлежать группе «Постоянные покупатели»
// или «Оптовые покупатели», а для таких пользователей надо показать цену со скидкой
if ($USER->IsAuthorized()) {
    // массив групп, к которым принадлежит авторизованный пользователь
    $arGroups = $USER->GetUserGroupArray();
    // если пользователь принадлежит группе «Постоянные покупатели»
    if (in_array(CATALOG_GROUP_REGULAR_BUYER, $arGroups)) {
        $PRICE_TYPE_ID = PRICE_TYPE_REGULAR_BUYER;
    }
    // если пользователь принадлежит группе «Оптовые покупатели»
    if (in_array(CATALOG_GROUP_WHOLESALE_BUYER, $arGroups)) {
        $PRICE_TYPE_ID = PRICE_TYPE_WHOLESALE_BUYER;
    }
}
// получаем цену товара: розничную, для постоянного покупателя или
// для оптового покупателя — в зависимости от $PRICE_TYPE_ID 
$result = CPrice::GetList(
    array(),
    array(
        'PRODUCT_ID' => $PRODUCT_ID, // идентификатор товара
        'CATALOG_GROUP_ID' => $PRICE_TYPE_ID  // идентификатор типа цены
    )
);
if ($temp = $result->Fetch()) {
    $productPrice = CurrencyFormat($temp['PRICE'], $temp['CURRENCY']);
}

В коде выше использованы пять констант, которые определены в файле init.php:

<?php
/*
 * Файл local/php_interface/init.php
 */

define('DEFAULT_TEMPLATE_PATH', '/local/templates/.default');

// Идентификатор группы пользователей «Постоянные покупатели»
define('CATALOG_GROUP_REGULAR_BUYER', 9);
// Идентификатор группы пользователей «Оптовые покупатели»
define('CATALOG_GROUP_WHOLESALE_BUYER', 10);
// Идентификатор типа цен «Базовый»
define('PRICE_TYPE_BASE', 1);
// Идентификатор типа цен «Постоянные покупатели»
define('PRICE_TYPE_REGULAR_BUYER', 2);
// Идентификатор группы пользователей «Оптовые покупатели»
define('PRICE_TYPE_WHOLESALE_BUYER', 3);

function debug($data) {
    echo '<pre>' . print_r($data, true) . '</pre>';
}

База данных

--
-- Структура таблицы `b_catalog_group`
--

CREATE TABLE `b_catalog_group` (
  `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `NAME` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `BASE` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N',
  `SORT` int(11) NOT NULL DEFAULT '100',
  `XML_ID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `TIMESTAMP_X` datetime DEFAULT NULL,
  `MODIFIED_BY` int(18) DEFAULT NULL,
  `DATE_CREATE` datetime DEFAULT NULL,
  `CREATED_BY` int(18) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `b_catalog_group`
--

INSERT INTO `b_catalog_group`
(`ID`, `NAME`, `BASE`, `SORT`, `XML_ID`, `TIMESTAMP_X`, `MODIFIED_BY`, `DATE_CREATE`, `CREATED_BY`)
VALUES
(1, 'BASE', 'Y', 100, 'BASE', '2018-08-18 09:16:48', 1, '2018-08-18 09:12:58', 1),
(2, 'REGULAR_BUYER', 'N', 100, '', '2018-08-24 16:17:27', 1, '2018-08-24 15:36:32', 1),
(3, 'WHOLESALE_BUYER', 'N', 100, '', '2018-08-24 16:17:43', 1, '2018-08-24 15:45:09', 1);
  • ID — уникальный индентификатор
  • NAME — внутреннее имя цены
  • BASE — указывает на то, является ли этот тип цен базовым
  • SORT — число для сортировки
  • XML_ID — идентификатор из 1С:Предприятие
--
-- Структура таблицы `b_catalog_price`
--

CREATE TABLE `b_catalog_price` (
  `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `PRODUCT_ID` int(11) NOT NULL,
  `EXTRA_ID` int(11) DEFAULT NULL,
  `CATALOG_GROUP_ID` int(11) NOT NULL,
  `PRICE` decimal(18,2) NOT NULL,
  `CURRENCY` char(3) COLLATE utf8_unicode_ci NOT NULL,
  `TIMESTAMP_X` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `QUANTITY_FROM` int(11) DEFAULT NULL,
  `QUANTITY_TO` int(11) DEFAULT NULL,
  `TMP_ID` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  `PRICE_SCALE` decimal(26,12) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `b_catalog_price`
--

INSERT INTO `b_catalog_price`
(`ID`, `PRODUCT_ID`, `EXTRA_ID`, `CATALOG_GROUP_ID`, `PRICE`, `CURRENCY`,
`TIMESTAMP_X`, `QUANTITY_FROM`, `QUANTITY_TO`, `TMP_ID`, `PRICE_SCALE`)
VALUES
(314, 317, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:24:19', NULL, NULL, NULL, '1000.000000000000'),
(315, 318, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:25:24', NULL, NULL, NULL, '2000.000000000000'),
(316, 319, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:25:59', NULL, NULL, NULL, '3000.000000000000'),
(317, 320, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:26:36', NULL, NULL, NULL, '4000.000000000000'),
(318, 321, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:27:03', NULL, NULL, NULL, '5000.000000000000'),
(319, 322, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:27:37', NULL, NULL, NULL, '1000.000000000000'),
(320, 323, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:28:12', NULL, NULL, NULL, '2000.000000000000'),
(321, 324, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:28:48', NULL, NULL, NULL, '3000.000000000000'),
(322, 325, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:29:17', NULL, NULL, NULL, '4000.000000000000'),
(323, 326, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:29:44', NULL, NULL, NULL, '5000.000000000000'),
(324, 327, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:30:17', NULL, NULL, NULL, '1000.000000000000'),
(325, 328, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:30:44', NULL, NULL, NULL, '2000.000000000000'),
(326, 329, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:31:14', NULL, NULL, NULL, '3000.000000000000'),
(327, 330, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:31:42', NULL, NULL, NULL, '4000.000000000000'),
(328, 331, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:32:05', NULL, NULL, NULL, '5000.000000000000'),
(329, 332, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:45:36', NULL, NULL, NULL, '1000.000000000000'),
(330, 333, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:46:03', NULL, NULL, NULL, '2000.000000000000'),
(331, 334, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:46:29', NULL, NULL, NULL, '3000.000000000000'),
(332, 335, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:46:55', NULL, NULL, NULL, '4000.000000000000'),
(333, 336, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:47:21', NULL, NULL, NULL, '4000.000000000000'),
(334, 337, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:47:59', NULL, NULL, NULL, '1000.000000000000'),
(335, 338, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:48:25', NULL, NULL, NULL, '1000.000000000000'),
(336, 339, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:48:49', NULL, NULL, NULL, '3000.000000000000'),
(337, 340, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:49:13', NULL, NULL, NULL, '4000.000000000000'),
(338, 341, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:49:40', NULL, NULL, NULL, '5000.000000000000'),
(339, 342, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:50:13', NULL, NULL, NULL, '1000.000000000000'),
(340, 343, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:50:43', NULL, NULL, NULL, '2000.000000000000'),
(341, 344, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:51:12', NULL, NULL, NULL, '3000.000000000000'),
(342, 345, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:51:43', NULL, NULL, NULL, '4000.000000000000'),
(343, 346, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:52:13', NULL, NULL, NULL, '5000.000000000000'),
(344, 331, 1, 2, '4500.00', 'RUB', '2018-08-24 13:53:00', NULL, NULL, NULL, '4500.000000000000'),
(345, 331, 2, 3, '4000.00', 'RUB', '2018-08-24 13:53:00', NULL, NULL, NULL, '4000.000000000000'),
(346, 330, 1, 2, '3600.00', 'RUB', '2018-08-24 13:53:14', NULL, NULL, NULL, '3600.000000000000'),
(347, 330, 2, 3, '3200.00', 'RUB', '2018-08-24 13:53:14', NULL, NULL, NULL, '3200.000000000000'),
(348, 329, 1, 2, '2700.00', 'RUB', '2018-08-24 13:53:29', NULL, NULL, NULL, '2700.000000000000'),
(349, 329, 2, 3, '2400.00', 'RUB', '2018-08-24 13:53:29', NULL, NULL, NULL, '2400.000000000000'),
(350, 328, 1, 2, '1800.00', 'RUB', '2018-08-24 13:53:50', NULL, NULL, NULL, '1800.000000000000'),
(351, 328, 2, 3, '1600.00', 'RUB', '2018-08-24 13:53:50', NULL, NULL, NULL, '1600.000000000000'),
(352, 327, 1, 2, '900.00', 'RUB', '2018-08-24 13:54:03', NULL, NULL, NULL, '900.000000000000'),
(353, 327, 2, 3, '800.00', 'RUB', '2018-08-24 13:54:03', NULL, NULL, NULL, '800.000000000000'),
(354, 321, 1, 2, '4500.00', 'RUB', '2018-08-24 13:54:20', NULL, NULL, NULL, '4500.000000000000'),
(355, 321, 2, 3, '4000.00', 'RUB', '2018-08-24 13:54:20', NULL, NULL, NULL, '4000.000000000000'),
(356, 320, 1, 2, '3600.00', 'RUB', '2018-08-24 13:54:34', NULL, NULL, NULL, '3600.000000000000'),
(357, 320, 2, 3, '3200.00', 'RUB', '2018-08-24 13:54:34', NULL, NULL, NULL, '3200.000000000000'),
(358, 319, 1, 2, '2700.00', 'RUB', '2018-08-24 13:54:47', NULL, NULL, NULL, '2700.000000000000'),
(359, 319, 2, 3, '2400.00', 'RUB', '2018-08-24 13:54:47', NULL, NULL, NULL, '2400.000000000000'),
(360, 318, 1, 2, '1800.00', 'RUB', '2018-08-24 13:55:00', NULL, NULL, NULL, '1800.000000000000'),
(361, 318, 2, 3, '1600.00', 'RUB', '2018-08-24 13:55:00', NULL, NULL, NULL, '1600.000000000000'),
(362, 317, 1, 2, '900.00', 'RUB', '2018-08-24 13:55:12', NULL, NULL, NULL, '900.000000000000'),
(363, 317, 2, 3, '800.00', 'RUB', '2018-08-24 13:55:12', NULL, NULL, NULL, '800.000000000000'),
(364, 326, 1, 2, '4500.00', 'RUB', '2018-08-24 13:55:38', NULL, NULL, NULL, '4500.000000000000'),
(365, 326, 2, 3, '4000.00', 'RUB', '2018-08-24 13:55:38', NULL, NULL, NULL, '4000.000000000000'),
(366, 325, 1, 2, '3600.00', 'RUB', '2018-08-24 13:55:48', NULL, NULL, NULL, '3600.000000000000'),
(367, 325, 2, 3, '3200.00', 'RUB', '2018-08-24 13:55:48', NULL, NULL, NULL, '3200.000000000000'),
(368, 324, 1, 2, '2700.00', 'RUB', '2018-08-24 13:56:01', NULL, NULL, NULL, '2700.000000000000'),
(369, 324, 2, 3, '2400.00', 'RUB', '2018-08-24 13:56:01', NULL, NULL, NULL, '2400.000000000000'),
(370, 323, 1, 2, '1800.00', 'RUB', '2018-08-24 13:56:17', NULL, NULL, NULL, '1800.000000000000'),
(371, 323, 2, 3, '1600.00', 'RUB', '2018-08-24 13:56:17', NULL, NULL, NULL, '1600.000000000000'),
(372, 322, 1, 2, '900.00', 'RUB', '2018-08-24 13:56:30', NULL, NULL, NULL, '900.000000000000'),
(373, 322, 2, 3, '800.00', 'RUB', '2018-08-24 13:56:30', NULL, NULL, NULL, '800.000000000000'),
(374, 336, 1, 2, '3600.00', 'RUB', '2018-08-24 13:56:49', NULL, NULL, NULL, '3600.000000000000'),
(375, 336, 2, 3, '3200.00', 'RUB', '2018-08-24 13:56:49', NULL, NULL, NULL, '3200.000000000000'),
(376, 335, 1, 2, '3600.00', 'RUB', '2018-08-24 13:57:00', NULL, NULL, NULL, '3600.000000000000'),
(377, 335, 2, 3, '3200.00', 'RUB', '2018-08-24 13:57:00', NULL, NULL, NULL, '3200.000000000000'),
(378, 334, 1, 2, '2700.00', 'RUB', '2018-08-24 13:57:13', NULL, NULL, NULL, '2700.000000000000'),
(379, 334, 2, 3, '2400.00', 'RUB', '2018-08-24 13:57:13', NULL, NULL, NULL, '2400.000000000000'),
(380, 333, 1, 2, '1800.00', 'RUB', '2018-08-24 13:57:25', NULL, NULL, NULL, '1800.000000000000'),
(381, 333, 2, 3, '1600.00', 'RUB', '2018-08-24 13:57:25', NULL, NULL, NULL, '1600.000000000000'),
(382, 332, 1, 2, '900.00', 'RUB', '2018-08-24 13:57:37', NULL, NULL, NULL, '900.000000000000'),
(383, 332, 2, 3, '800.00', 'RUB', '2018-08-24 13:57:37', NULL, NULL, NULL, '800.000000000000'),
(384, 341, 1, 2, '4500.00', 'RUB', '2018-08-24 13:57:56', NULL, NULL, NULL, '4500.000000000000'),
(385, 341, 2, 3, '4000.00', 'RUB', '2018-08-24 13:57:56', NULL, NULL, NULL, '4000.000000000000'),
(386, 340, 1, 2, '3600.00', 'RUB', '2018-08-24 13:58:09', NULL, NULL, NULL, '3600.000000000000'),
(387, 340, 2, 3, '3200.00', 'RUB', '2018-08-24 13:58:09', NULL, NULL, NULL, '3200.000000000000'),
(388, 339, 1, 2, '2700.00', 'RUB', '2018-08-24 13:58:23', NULL, NULL, NULL, '2700.000000000000'),
(389, 339, 2, 3, '2400.00', 'RUB', '2018-08-24 13:58:23', NULL, NULL, NULL, '2400.000000000000'),
(390, 338, 1, 2, '900.00', 'RUB', '2018-08-24 13:58:35', NULL, NULL, NULL, '900.000000000000'),
(391, 338, 2, 3, '800.00', 'RUB', '2018-08-24 13:58:35', NULL, NULL, NULL, '800.000000000000'),
(392, 337, 1, 2, '900.00', 'RUB', '2018-08-24 13:58:47', NULL, NULL, NULL, '900.000000000000'),
(393, 337, 2, 3, '800.00', 'RUB', '2018-08-24 13:58:47', NULL, NULL, NULL, '800.000000000000'),
(394, 346, 1, 2, '4500.00', 'RUB', '2018-08-24 13:59:02', NULL, NULL, NULL, '4500.000000000000'),
(395, 346, 2, 3, '4000.00', 'RUB', '2018-08-24 13:59:02', NULL, NULL, NULL, '4000.000000000000'),
(396, 345, 1, 2, '3600.00', 'RUB', '2018-08-24 13:59:14', NULL, NULL, NULL, '3600.000000000000'),
(397, 345, 2, 3, '3200.00', 'RUB', '2018-08-24 13:59:14', NULL, NULL, NULL, '3200.000000000000'),
(398, 344, 1, 2, '2700.00', 'RUB', '2018-08-24 13:59:27', NULL, NULL, NULL, '2700.000000000000'),
(399, 344, 2, 3, '2400.00', 'RUB', '2018-08-24 13:59:27', NULL, NULL, NULL, '2400.000000000000'),
(400, 343, 1, 2, '1800.00', 'RUB', '2018-08-24 13:59:40', NULL, NULL, NULL, '1800.000000000000'),
(401, 343, 2, 3, '1600.00', 'RUB', '2018-08-24 13:59:40', NULL, NULL, NULL, '1600.000000000000'),
(402, 342, 1, 2, '900.00', 'RUB', '2018-08-24 13:59:59', NULL, NULL, NULL, '900.000000000000'),
(403, 342, 2, 3, '800.00', 'RUB', '2018-08-24 13:59:59', NULL, NULL, NULL, '800.000000000000');

--
-- Индексы таблицы `b_catalog_price`
--

ALTER TABLE `b_catalog_price`
  ADD KEY `IXS_CAT_PRICE_PID` (`PRODUCT_ID`,`CATALOG_GROUP_ID`),
  ADD KEY `IXS_CAT_PRICE_GID` (`CATALOG_GROUP_ID`),
  ADD KEY `IXS_CAT_PRICE_SCALE` (`PRICE_SCALE`);
  • ID — уникальный индентификатор
  • PRODUCT_ID — идентификатор товара
  • EXTRA_ID — идентификатор наценки
  • CATALOG_GROUP_ID — идентификатор типа цен
  • PRICE — цена
  • CURRENCY — валюта
--
-- Структура таблицы `b_catalog_extra`
--

CREATE TABLE `b_catalog_extra` (
  `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `NAME` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `PERCENTAGE` decimal(18,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Дамп данных таблицы `b_catalog_extra`
--

INSERT INTO `b_catalog_extra` (`ID`, `NAME`, `PERCENTAGE`) VALUES
(1, 'Постоянный покупатель', '-10.00'),
(2, 'Оптовый покупатель', '-20.00');

Поиск: CMS • Web-разработка • Битрикс • Интернет магазин • Каталог товаров • Наценки • Пользователь • Права доступа • Типы цен • Настройка

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.