Примеры небольших, но часто крайне полезных php сниппетов для Битрикса.
Набор полезных рецептов для Bitrix
		 29.09.2020	
    Получаем "пользовательские свойства" (цвет, картинка, и т.д.):
$aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties();
Битрикс тесторование (Битрикс самопроверка)
Запустить проверку можно из раздел Настройки - Инструменты - Проверка системы (http://SITE.local/bitrix/admin/site_checker.php?lang=ru)
Самопроверка Bitrix выдает ошибку. Проблема с сокетами.
Все примеры, если они не в модули/компоненты битрикса должны начинаться с подключения файла:
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
Получить все категории со значениями SEO метатегов:
 
    $aCategories = CIBlockSection::GetList(
        array('sort' => 'asc'),
        array(
            'ACTIVE' => 'Y',
            'GLOBAL_ACTIVE' => 'Y',
            'IBLOCK_ID' => $arParams['arParams']['IBLOCK_ID'],
            //'SECTION_ID' => $arParams['arParams']['SECTION_ID'] // Можно указать ID родительской категории 
        )
    );
    
    $aTMP = array();
    $iPos = 0;
    if ($aCategories->SelectedRowsCount() > 0)
    {
        $i = 0;
//        while ($row = $aCategories->Fetch())
        while ($row = $aCategories->GetNext())
        {
            $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
              $row["IBLOCK_ID"],
              $row["ID"]
            );
            $row["IPROPERTY_VALUES"] = $ipropValues->getValues();
            
            $sTitle = isset($row["IPROPERTY_VALUES"]['SECTION_PAGE_TITLE'])?$row["IPROPERTY_VALUES"]['SECTION_PAGE_TITLE']:$row['NAME'];
        }
    }
Получить категорий со значениями пользовательских полей (userfields):
 
    $aCategories = CIBlockSection::GetList(
        array('sort' => 'asc'),
        array(
            'ACTIVE' => 'Y',
            'GLOBAL_ACTIVE' => 'Y',
            'IBLOCK_ID' => 1, // !!! Нужно передавать обязательно, иначе user fields не возвращаются
            'SECTION_ID' => 98
        ),
        FALSE,
        array("UF_SOTYPE") // Можно указать "UF_*"
    );
    if ($aCategories->SelectedRowsCount() > 0)
    {
        $i = 0;
//        while ($row = $aCategories->Fetch())
        while ($row = $aCategories->GetNext())
        {
            if ($row['UF_SOTYPE'] == 1)
            {
              $aItems1[] = $aItem;
            }
            else
            {
              $aItems2[] = $aItem;            
            }
        }
    }
Как получить значение пользовательских полей, для товара Bitrix:
bitrix разработчикам как получить значение поля продукта списка / bitrix каталог получить значение свойства.
 
$block_id = 1; // block_id магазины, обычно 1
$id = 101; // ID товара
$sCode = 'SO_PUBLISHED'; // Имя пользовательского свойства
$db_props = \CIBlockElement::GetProperty($block_id, $id, array("sort" => "asc"), Array("CODE" => $sCode));
if ($ar_props = $db_props->Fetch()) {
  $sPublished = IntVal($ar_props["VALUE"]);
} else {
  $sPublished = false;   
}
Получение списка товаров (старый "стиль"):
 
    $items = GetIBlockElementList($IBLOCK_ID, false, Array("SORT"=>"ASC"));
    $aTMP = array();
    while ($row = $items->GetNext())
    {
            $sTitle = $row['NAME'];
        $aTMP[$i] = array(
            'url' => $row['DETAIL_PAGE_URL'],
            'name' => $sTitle,
            'id' => $row['ID'],
            'price' => (int) CPrice::GetBasePrice($row['ID'])['PRICE'],
        );
    }
Получение списка товаров:
 
  $arOrder = array('SORT'=>'ASC');
  $arFilter = array();
  $res = CIBlockElement::GetList($arOrder, $arFilter);
  while ($aItem = $res->GetNext())
  {
    $id = $aItem['ID'];
    if($id == 3026)
    {
      echo '<pre>';
      print_r($aItem);
      echo '</pre>';
    }
  }
Получение списка товаров для определенной категории со свойствами:
 
  $arOrder = array('SORT'=>'ASC');
  $arFilter = array(
      'SECTION_ID'=>23, // Id категории
      'IBLOCK_ID' => 1
  );
  $res = CIBlockElement::GetList($arOrder, $arFilter);
  $i = 0;
  $aTMP = [];
  while ($aItem = $res->GetNext())
  {
    $aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties();
    $aTMP[$i]['sku'] = $aProp['EL_SKU']; // Артикул
    $aTMP[$i]['title'] = $aItem['NAME']; // Название товара
        echo '<pre>';
            print_r($aTMP[$i]);
            print_r($prop);
            print_r($aItem);
        echo '</pre>';
    
    $i++;
  }
Получение всех категорий/разделов, к которым относиться товар:
 
  $id = $arParams['arResult']['ID'];
  $IBLOCK_ID = $arParams['arResult']['IBLOCK_ID'];
  $res = CIBlockElement::GetElementGroups(
    $id,
    false,
    array('ID', 'NAME', 'SECTION_PAGE_URL')
  );
  $aItems = array();
  
  while($row = $res->GetNext())
  {
    echo '<pre>';
    print_r($row);
    echo '</pre>';
  }
Получение картинки:
// Сразу выводит изображение echo CFile::ShowImage($row['PICTURE'], 200, 200, "", "", true); // Возвращает массив с данными о фотографии $file = CFile::GetFileArray($row['PICTURE']);
Включенние вывода всех товаров каталога, если категория не указана:
 
  // bitrix/components/bitrix/catalog/templates/.default/section.php
  $APPLICATION->IncludeComponent(
    'bitrix:catalog.section',
    '',
    array(
        'SHOW_ALL_WO_SECTION' => 'Y', // показывать товары, если не задан раздел
        // …
    ),
    $component
  );
Пример вывода всех товаров из категории, со значением свойства "ASKARON_REVIEWS_COUNT" больше 0
 
    $arSelect = Array("ID", "NAME", "PROPERTY_ASKARON_REVIEWS_COUNT");
    $arFilter = Array("IBLOCK_ID"=>1, "SECTION_ID"=>$id_cat, ">PROPERTY_ASKARON_REVIEWS_COUNT" => 0, "ACTIVE"=>"Y");
    $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
    while($ob = $res->GetNextElement())
    {
      $arFields = $ob->GetFields();
      echo '<pre>';
      print_r($arFields); // ASKARON_REVIEWS_COUNT
      echo '</pre>';
    }
Подробнее:
Основная функция
Фильтр по числам
Фильтр по маскам (для определенных типов полей)
Как повлиять на выводимые в каталоге товары:
 
    global $_aSoGlobal,  $arrFilter;
    if($_aSoGlobal['otzyvy-o-tovarakh'])
    {
      $arrFilter = Array("IBLOCK_ID"=>1, ">PROPERTY_ASKARON_REVIEWS_COUNT" => 0, "ACTIVE"=>"Y");
    }
  $APPLICATION->IncludeComponent(
	"bitrix:catalog", 
	"catalog_new", 
	array(
        ...
    ...
Получение товаров из корзины:
С проверкой, есть ли товароы в корзине из определенной категории.
 
  // Проверка на наличие продукции "Barrier"
  $bBarrier = FALSE;
    
  $dbBasketItems = CSaleBasket::GetList(
    array("NAME" => "ASC","ID" => "ASC"),
    array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
    false,
    false,
    array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE")
  );
  while ($arItems=$dbBasketItems->Fetch())
  {
    $arItems=CSaleBasket::GetByID($arItems["ID"]);
    $res = CIBlockElement::GetElementGroups(
      $arItems["PRODUCT_ID"],
      false,
      array('ID', 'NAME', 'SECTION_PAGE_URL')
    );
      
    while($row = $res->GetNext())
    {
      if($row['ID'] == 188)
      {
        $bBarrier = TRUE;
        break;
      }
    }
  }
Обновление цены товара (у товарного предложения):
 
  CModule::IncludeModule("catalog");
  $PRODUCT_ID = 3026;
  $PRICE_TYPE_ID = 1;
  $arFields = Array(
    "PRODUCT_ID" => $PRODUCT_ID,
    "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
    "PRICE" => 29.95,
  );
  $res = CPrice::GetList(
    array(),
    array(
      "PRODUCT_ID" => $PRODUCT_ID,
      "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
    )
  );
  if ($arr = $res->Fetch())
  {
    CPrice::Update($arr["ID"], $arFields);
  }
/*
  else
  {
    CPrice::Add($arFields);
  }
*/
Подробнее:
Массовое изменение цен товаров.
Массовое изменение цен в 1C-Bitrix
CPrice::Update
CIBlockElement::Add
Как программно запустить экспорт (например в Маркет):
10 - это ID нужной выгрузки. Посмотреть его можно в пенале администрирования.
CCatalogExport::PreGenerateExport(10);
Как программно добавить товар:
 
<?php
//die('!');
  error_reporting(E_ALL);
  ini_set('display_errors', 'On');
  require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
  //CModule::IncludeModule("catalog");
  CModule::IncludeModule("iblock");
  $IBLOCK_ID = 2; // ID Инфоблока каталога
  $el = new CIBlockElement;
  $PROP = array();
  $PROP[12] = "Белый";  // свойству с кодом 12 присваиваем значение "Белый"
  $PROP[3] = 38;
  $PROP[11] = 111111;
  $arLoadProductArray = Array(
    "MODIFIED_BY"    => $USER->GetID(), // элемент изменен текущим пользователем
    //"IBLOCK_SECTION_ID" => false,          // элемент лежит в корне раздела
    "IBLOCK_SECTION_ID" => 7,          // ID категории
    "IBLOCK_ID"      => $IBLOCK_ID,
    "PROPERTY_VALUES"=> $PROP,
    "NAME"           => "Элемент",
    "ACTIVE"         => "N",            // активен
    "CODE"         => "MySyperCode2",            // Ссылочный код
    "PREVIEW_TEXT"   => "текст для списка элементов",
    "DETAIL_TEXT"    => "текст для детального просмотра",
    "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif")
  );
  if($PRODUCT_ID = $el->Add($arLoadProductArray))
    echo "New ID: ".$PRODUCT_ID;
  else
    echo "Error: ".$el->LAST_ERROR;
?>
Done
<?
По теме: CIBlockElement add
Получение заказа по ID:
 
if (!($arOrder = CSaleOrder::GetByID($ORDER_ID)))
{
   echo "Заказ с кодом ".$ORDER_ID." не найден";
}
else
{
   echo "<pre>";
   print_r($arOrder);
   echo "</pre>";
}
Получение цены товара (стоимость товара) по его ID:
'price' => CPrice::GetBasePrice($arItem['ITEM_ID'])['PRICE'];
bitrix includearea:
Как добавить в bitrix Include Area
Данные из заказа (текущей корзины):
 
    /**
    * Возвращает сумму текущего заказа из в корзине
    * 
    * @return float
    */
    static function getCurrentOrderTotalPrice()
    {
      $arBasketItems = array();
      $dbBasketItems = CSaleBasket::GetList(
        array("NAME" => "ASC","ID" => "ASC"),
        array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
        false,
        false,
        array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE")
      );
      $fRet = 0;
      while ($arItems=$dbBasketItems->Fetch())
      {
        $arItems=CSaleBasket::GetByID($arItems["ID"]);
        $arBasketItems[]=$arItems;   
        //$cart_num+=$arItems['QUANTITY'];
        $fRet += $arItems['PRICE']*$arItems['QUANTITY'];
      }
      return $fRet;
    }
Как получить ссылку на товар в Bitrix:
$res= \CIBlockElement::GetByID( $id ); $aTMP = $res->GetNext(); echo $aTMP[ 'DETAIL_PAGE_URL' ];