Задать вопрос
  • Почему метод \Bitrix\Sale\Internals\BasketTable::getList() возвращает параметр 'BASE_PRICE' равным нулю?

    @Surzhenko Автор вопроса
    Антон, где? В параметре 'select'? Без изменений:
    array(5) {
      ["BASE_PRICE"]=>
      string(6) "0.0000"
      ["CURRENCY"]=>
      string(3) "RUB"
      ["PRODUCT_ID"]=>
      string(5) "24630"
      ["LID"]=>
      string(2) "s1"
      ["ID"]=>
      string(6) "175687"
    }

    В админке всё корректно указано
  • Почему не применяются типы цен в корзине Битрикс?

    @Surzhenko Автор вопроса
    Ярослав Александров, всё-таки дело в методе \Bitrix\Sale\Internals\BasketTable::getList()
    Даже если применить его, например, в header.php, всё равно возвращается параметр 'BASE_PRICE' со значением "0.0000". В этом дело. Указанный модуль просто использует данный метод для получения данных, а не передачи. Я не могу уйти от используемого решения от Сотбит, приходится работать с этим. Почему же этот метод может не видеть величину базовой цены товара? Разумеется в админке цена установлена. Спасибо
  • Почему не применяются типы цен в корзине Битрикс?

    @Surzhenko Автор вопроса
    Ярослав Александров, нашёл некий код в файле /bitrix/modules/sotbit.regions/lib/sale/price.php
    public function changeBasket()
    	{
    		if (\Bitrix\Main\Loader::includeModule( "sale" ) && \Bitrix\Main\Loader::includeModule( "catalog" ))
    		{
    			global $USER;
    
    			$catalog_groups = array();
    			$db_res = \CCatalogGroup::GetGroupsList(array("GROUP_ID"=>$USER->GetUserGroupArray(), "BUY"=>"Y"));
    			while($arRes = $db_res->Fetch())
    			{
    				array_push($catalog_groups, $arRes['CATALOG_GROUP_ID']);
    			}
    
    			$result = \Bitrix\Sale\Internals\BasketTable::getList(
    				array (
    					'select' => array (
    						'BASE_PRICE',
    						'PRODUCT_ID',
    						'LID',
    						'ID'
    					),
    					'filter' => array (
    						'LID' => SITE_ID,
    						'FUSER_ID' => \CSaleBasket::GetBasketUserID(),
    						"ORDER_ID" => "NULL"
    					)
    				) );
    
    			while ( $BasketItem = $result->fetch() )
    			{
    				$Prices = array ();
    				$dbPrice = \CPrice::GetList( array (
    					"QUANTITY_FROM" => "ASC",
    					"QUANTITY_TO" => "ASC",
    					"SORT" => "ASC"
    				), array (
    					"PRODUCT_ID" => $BasketItem['PRODUCT_ID'],
    					'CATALOG_GROUP_ID' => $catalog_groups
    				), false, false, array (
    					"ID",
    					"CATALOG_GROUP_ID",
    					"PRICE",
    					"CURRENCY"
    				) );
    				while ( $arPrice = $dbPrice->Fetch() )
    				{
    					$arDiscounts = \CCatalogDiscount::GetDiscountByPrice( $arPrice["ID"],
    						$USER->GetUserGroupArray(), "N", $BasketItem['LID'] );
    					$discountPrice = \CCatalogProduct::CountPriceWithDiscount( $arPrice["PRICE"], $arPrice["CURRENCY"], $arDiscounts );
    					$Prices[$arPrice['CATALOG_GROUP_ID']]["DISCOUNT_PRICE"] = $discountPrice;
    					$Prices[$arPrice['CATALOG_GROUP_ID']]["PRICE"] = $arPrice;
    					unset( $Prices[$arPrice['ID']]["PRICE"]['ID'] );
    				}
    
    				if($Prices)
    				{
    					foreach($Prices as $i => $price)
    					{
    						if($_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'])
    						{
    							switch ($_SESSION['SOTBIT_REGIONS']['PRICE_VALUE_TYPE'])
    							{
    								case 'PROCENT_UP':
    									$price['DISCOUNT_PRICE'] = $price['DISCOUNT_PRICE'] + ($price['DISCOUNT_PRICE'] / 100) * $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									$price['PRICE']['PRICE'] = $price['PRICE']['PRICE'] + ($price['PRICE']['PRICE'] / 100) * $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									break;
    								case 'PROCENT_DOWN':
    									$price['DISCOUNT_PRICE'] = $price['DISCOUNT_PRICE'] - ($price['DISCOUNT_PRICE'] / 100) * $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									$price['PRICE']['PRICE'] = $price['PRICE']['PRICE'] - ($price['PRICE']['PRICE'] / 100) * $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];									break;
    								case 'FIX_UP':
    									$price['DISCOUNT_PRICE'] = $price['DISCOUNT_PRICE'] + $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									$price['PRICE']['PRICE'] = $price['PRICE']['PRICE'] + $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									break;
    								case 'FIX_DOWN':
    									$price['DISCOUNT_PRICE'] = $price['DISCOUNT_PRICE'] - $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									$price['PRICE']['PRICE'] = $price['PRICE']['PRICE'] - $_SESSION['SOTBIT_REGIONS']['PRICE_VALUE'];
    									break;
    							}
    						}
    						if($price['PRICE']['PRICE'] != $BasketItem['BASE_PRICE'])
    						{
    							\Bitrix\Sale\Internals\BasketTable::Update( $BasketItem['ID'], array (
    								'PRICE' => $price['DISCOUNT_PRICE'],
    								'CURRENCY' => $price['PRICE']['CURRENCY'],
    								'CUSTOM_PRICE' => 'Y'
    							) );
    						}
    					}
    				}
    			}
    		}
    	}

    Где $BasketItem['BASE_PRICE'] равно "0.0000". Содержимое переменной $Prices
    array(2) {
      [78]=>
      array(2) {
        ["DISCOUNT_PRICE"]=>
        float(292.6)
        ["PRICE"]=>
        array(4) {
          ["ID"]=>
          string(8) "13916530"
          ["CATALOG_GROUP_ID"]=>
          string(2) "78"
          ["PRICE"]=>
          string(6) "292.60"
          ["CURRENCY"]=>
          string(3) "RUB"
        }
      }
      [1]=>
      array(2) {
        ["DISCOUNT_PRICE"]=>
        float(308)
        ["PRICE"]=>
        array(4) {
          ["ID"]=>
          string(8) "13371316"
          ["CATALOG_GROUP_ID"]=>
          string(1) "1"
          ["PRICE"]=>
          string(6) "308.00"
          ["CURRENCY"]=>
          string(3) "RUB"
        }
      }
    }

    В следствие чего последнее условие срабатывает как для персональной цены, так и для базовой! Потому как первый элемент массива с индексом 78 - это параметры персональной цены, а второй элемент с индексом 1 - параметры базовой цены. И так как последней проверяется базовая цена, она и попадает в корзину! Почему же метод \Bitrix\Sale\Internals\BasketTable::getList() возвращает параметр 'BASE_PRICE' со значением "0.0000"? Может в этом дело? В документации Битрикса об этом методе ни слова. Спасибо!
  • Почему не применяются типы цен в корзине Битрикс?

    @Surzhenko Автор вопроса
    По инструкции в методе 1 указано:

    • Пересчёта цены не будет никогда, ни в корзине, ни в админке. Товар положен в корзину "намертво", при смене цены товара этот товар не бует пересчитан


    Но ведь, когда я отключаю покупку по базовому типу цен, цена в корзине ПЕРЕСЧИТЫВАЕТСЯ, что противоречит работе данного флага
  • Почему не применяются типы цен в корзине Битрикс?

    @Surzhenko Автор вопроса
    Ярослав Александров, есть только для каталога, для корзины нет (если верить обозначениям). Предоставлен выбор типа и кода инфоблока, ниже выбор типа цен в виде списка множественного выбора (цены выбраны). В настройках компонента корзины параметра тип цены нет. Файл result_modifier.php в шаблоне отсутствует
  • Почему не применяются типы цен в корзине Битрикс?

    @Surzhenko Автор вопроса
    Ярослав Александров, версия платформы 18.1.2, используется решение Сотбит: B2BShop. Если запретить покупку по базовой цене, действительно срабатывает персональная! Но это не выход из ситуации, потому что персональные цены действуют не на все товары. Заметил в $arResult флаг 'CUSTOM_PRICE' => 'Y", может в нём причина? Где его можно снять? Обработчика в init.php нет. До недавнего времени всё работало корректно, проблема появилась после выгрузки на сайт персональных цен
  • Как получить профили всех типов плательщиков в bitrix:sale.order.ajax?

    @Surzhenko Автор вопроса
    Андрей Николаев, выбрать значит вернуть, получить, задействовать, активировать все типы плательщиков, а не один конкретный. По типу checkbox, а не radio как по умолчанию. Такое возможно вообще? Чтобы на странице были доступны все профили покупателя всех типов плательщиков без необходимости переключать по input'у. Просто выбрать из выпадающего списка имя профиля и всё, а блок "Тип плательщика" нужно просто скрыть со страницы. Спасибо
  • Как получить профили всех типов плательщиков в bitrix:sale.order.ajax?

    @Surzhenko Автор вопроса
    Андрей Николаев, с помощью события OnSaleComponentOrderOneStepPersonType пытаюсь добавить параметр "CHECKED" => "Y" в свойства другого типа плательщика в массиве "PERSON_TYPE". Но в результате на странице оформления заказа всё равно выбран только один тип плательщика (последний). И список доступных профилей привязан к этому типу. Возможно ли всё-таки как-то выбрать сразу все типы активные в системе?
  • Как получить профили всех типов плательщиков в bitrix:sale.order.ajax?

    @Surzhenko Автор вопроса
    Спасибо за ответ! В системе количество полей для разных типов профилей одинаково. Поэтому при оформлении заказа они автоматически подгружаются в поля формы на странице. Список профилей доступен из выпадающего меню, которое формируется в зависимости от типа плательщика. Можете написать подробнее как обойти фильтрацию по типам и выводить в общем списке все профили доступные пользователю с помощью этих событий?
  • Как получить ID профиля покупателя по ID заказа?

    @Surzhenko Автор вопроса
    Как я уже писал у пользователя может быть несколько профилей покупателя, и ваш способ возвращает их все в виде списка. Необходимо получить только один определённый профиль, который использовался при оформлении заказа