И что нам говорит Битрикс: Пожалуйста переходите на редакцию «Бизнес» и будет всё замечательно и сразу. На редакцию перешли и оказалось, что многоценновость и многоскладовость в 1С-Битрикс живут отдельной жизнью. Первая нужна для отображения разных цен для разных групп пользователей, а второе для отображения остатков на разных складах.
Нам нужно было выводить остатки со своей ценой по каждому складу, так как цена у партнеров и у нас может отличаться на одну и ту же позицию. Штатного такого функционала оказалось, что нет.
Тут и пришла в голову идея переделать стандартные шаблоны и на стороне сайта сделать связку склад-цена.
Первое что пришлось сделать это переделать шаблоны catalog.section и catalog.element. В них был вставлен компонент catalog.store.amount:
1. Для карточки товара был выведен список складов с ценами
if ($arResult['CATALOG_QUANTITY']!=0){ //не отображать если не на одном складе нет остатков $APPLICATION->IncludeComponent("bitrix:catalog.store.amount","finnit_buy", array("ELEMENT_ID" => $arResult["ID"] //фильтрация по ID элемента
2. Для списка товаров через компонент сделана выборка всего одной цены (или самая низкая цена или минимальный срок доставки).
$APPLICATION->IncludeComponent( "bitrix:catalog.store.amount", "finnit_1sk", array( "ELEMENT_ID" => $arElement["ID"]//фильтрация по ID элемента
Так для каждого вида был создан свой шаблон, по мимо этого было создано еще несколько шаблонов. К примеру шаблон для быстрой покупки в котором выводится оптимальный склад с ценой для совершения покупки.
Работы по компоненту catalog.store.amount шли в 3 этапа.
1. Ручное сопоставление в коде склад — цена (удобно при малом количестве складов). В данном случае в коде пишется указание типа цены для определенного склада.
if ($arProperty['ID'] == 29){// Идентификатор склада $db_res = CPrice::GetList( array(), array("PRODUCT_ID" => $arParams['ELEMENT_ID'],"CATALOG_GROUP_ID" => '28')); // 28 - это идентификатор необходимого типа цены if ($ar_res = $db_res->Fetch()){ if($min_price > (ceil(($ar_res["PRICE"] + ($ar_res["PRICE"]/100))/10)* 10)) $min_price = ceil(($ar_res["PRICE"] + ($ar_res["PRICE"]/100))/10)* 10; // получаем минимальную цену по всем складам по данному товару и округляем $amount = $arProperty["AMOUNT"]; // получаем количество по складу $title = $arProperty["ID"]; // изначально передалось Наименование в переменную, но при смене наименования в 1С при обмене склад переименовывался и на сайте - по этому привязку сделали по ID, а название переменной не трогали. }
2. После того как стали подключаться еще склады первый вариант оказался непригодным и было принято решение вести связки склад- цена в отдельном инфоблоке.
<?// запрос инфоблока со списком сопоставления $arSelectEquals = Array("ID", "IBLOCK_ID"); $arFilterEquals = Array("IBLOCK_ID"=>18); //ID инфоблока сопоставления $equals = CIBlockElement::GetList(Array(), $arFilterEquals, false, Array(), $arSelectEquals); while($equal = $equals->GetNextElement()){ $arPropsEquals = $equal->GetProperties(); if ($arProperty["ID"] == $arPropsEquals["SKLAD_ID"]["VALUE"]){// если склад сопоставлен $db_res = CPrice::GetList( array(), array("PRODUCT_ID" => $arParams['ELEMENT_ID'],"CATALOG_GROUP_ID" => $arPropsEquals["PRICE_ID"]["VALUE"])); if ($ar_res = $db_res->Fetch()){ if (!isset($ar_res["PRICE"])){ echo GetMessage('FINN_PRICE_MANAGER');//вывод сообщения если нет цены }else{ // если цена есть по сопоставленным данным $pricen = ceil( $ar_res["PRICE"] );// получение данных для дальнейшего заказа $price_id = $ar_res["CATALOG_GROUP_ID"];// получение данных для дальнейшего заказа $price_name = $ar_res["CATALOG_GROUP_NAME"];// получение данных для дальнейшего заказа } //echo number_format( $pricen, 0, ',', ' ' ); $torgId = $ar_res["ID"]; // получение данных для дальнейшего заказа $torgGId = $ar_res["CATALOG_GROUP_ID"];// получение данных для дальнейшего заказа } } else{}} } ?>
Таким образом уже можно вести достаточно большой объем складов.
3. Использование пользовательских полей непосредственно в складах для сопоставления с типами цен.
Этот вариант изначально не рассматривался. И только после того как открылся магазин по мимо Челябинска еще и в Санкт-Петербурге понадобилось указывать срок поставки товара в зависимости от склада, для этих целей как раз и использовали пользовательские поля в складах.
Считаю данный вариант самый оптимальный. И на данный момент уже несколько шаблонов переведены на этот же вариант сопоставления складов и цен.
P.S. Если Вы знаете более подходящий вариант — пишите в комментариях, буду благодарен.
P.P.S. Если есть замечания или вопросы пишите — отвечу.
ссылка на оригинал статьи https://habr.com/post/420071/
Добавить комментарий