Документация для разработчиков
Темная тема

Add

int
CSaleDiscount::Add(
	array arFields
);

Метод добавляет новую скидку на сумму заказа с параметрами из массива arFields. Нестатический метод.

Параметры вызова

ПараметрОписание
arFields Ассоциативный массив параметров скидки, ключами в котором являются названия параметров скидки, а значениями - значения параметров.

Допустимые ключи:
  • LID - идентификатор сайта;
  • NAME - название;
  • ACTIVE_FROM - дата и время начала действия в формате сайта (если не указано, то действует с момента создания);
  • ACTIVE_TO - дата и время окончания действия в формате сайта (если не указано, то ограничения по времени не имеет);
  • ACTIVE - флаг активности;
  • PRIORITY - приоритет применимости (чем выше, тем раньше применится);
  • SORT - сортировка в рамках одного значения приоритета (чем меньше, тем раньше применится в рамках одного приоритета);
  • LAST_DISCOUNT - флаг "Прекратить применение скидок". Если правило применилось и флаг стоит, все последующие скидки не будут использованы (независимо от того, совпадают их условия или нет);
  • LAST_LEVEL_DISCOUNT - флаг "Прекратить уровень". Аналогичен предыдущему, но отменяет только последующие правила с таким же приоритетом;
  • XML_ID - внешний код;
  • CONDITIONS - массив, описывающий дополнительные условия правила;
  • ACTIONS - массив, описывающий действия правила;
  • USER_GROUPS - массив групп пользователей, на которых распространяется правило (не может быть пустым);
  • CURRENCY - с версии 14.0 принудительно содержит валюту сайта;
  • PRICE_FROM - общая стоимость заказа, начиная с которой предоставляется эта скидка. Устаревшее поле с 14.0, значение жестко переопределяются при добавлении;
  • PRICE_TO - общая стоимость заказа, до достижения которой предоставляется эта скидка. Устаревшее поле с 14.0, значение жестко переопределяются при добавлении;
  • DISCOUNT_VALUE - величина скидки. Устаревшее поле с 14.0, значение жестко переопределяются при добавлении;
  • DISCOUNT_TYPE - тип величины скидки (P - величина задана в процентах, V - величина задана в абсолютной сумме). Устаревшее поле с 14.0, значение жестко переопределяются при добавлении;

  • Блок купонов:
  • COUPON_ADD - создать купоны одного типа при добавлении правила или нет (Y/N);
  • COUPON_COUNT - число создаваемых купонов;
  • COUPON - массив, описывающий купон:
    • TYPE - тип купона (Y - купон на одну позицию заказа, O - купон на один заказ, N - многоразовый купон);
    • ACTIVE_FROM - дата и время начала активности купона в формате сайта либо null;
    • ACTIVE_TO - дата и время окончания активности купона в формате сайта либо null;
    • MAX_USE - максимальное число использования купона (для многоразовых) либо 0.

Возвращаемые значения

Возвращается код добавленной скидки или false в случае ошибки.



Пользовательские комментарии

Помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
1
dapweb

Создание скидки на один или несколько товаров.

Код
\Bitrix\Main\Loader::includeModule('sale');

$DISCOUNT_VALUE = 40;//процент скидки
$arItemIds = [1, 2, 3];//Массив с ID элементов товаров

$arDiscountFields = [
   "LID" => SITE_ID,
   "SITE_ID" => SITE_ID,
   "NAME"=> "Скидка ".$DISCOUNT_VALUE."%",
   "DISCOUNT_VALUE" => $DISCOUNT_VALUE,
   "DISCOUNT_TYPE" => "P",
   "LAST_LEVEL_DISCOUNT" => "Y",
   "LAST_DISCOUNT" => "Y",
   "ACTIVE" => "Y",
   "CURRENCY" => "EUR",
   "USER_GROUPS" => [2],
   'ACTIONS' => [
      "CLASS_ID" => "CondGroup",
      "DATA" => [
         "All" => "AND"
      ],
      "CHILDREN" => [
         [
            "CLASS_ID" => "ActSaleBsktGrp",
            "DATA" => [
               "Type" => "Discount",
               "Value" => $DISCOUNT_VALUE,
               "Unit" => "Perc",
               "Max" => 0,
               "All" => "OR",
               "True" => "True",
            ],
            "CHILDREN" => [
               [
                  "CLASS_ID" => "ActSaleSubGrp",
                  "DATA" => [
                     "All" => "AND",
                     "True" => "True",
                  ],
                  "CHILDREN" => [
                     [
                        "CLASS_ID" => "CondIBElement",
                        "DATA" => [
                           "logic" => "Equal",
                           "value" => $arItemIds,
                        ]
                     ]
                  ]
               ]
            ]
         ]
      ]
   ],
   "CONDITIONS" =>  [
      'CLASS_ID' => 'CondGroup',
      'DATA' => [
         'All' => 'AND',
         'True' => 'True',
      ],
      'CHILDREN' => [
         [
            "CLASS_ID" => "CondBsktProductGroup",
            "DATA" => [
               "Found" => "Found",
               "All" => "OR",
            ],
            "CHILDREN" => [
               [
                  "CLASS_ID" => "CondIBElement",
                  "DATA" => [
                     "logic" => "Equal",
                     "value" => $arItemIds,
                  ]
               ]
            ]
         ],
      ],  
   ]
];
$iDiscountNumber = \CSaleDiscount::Add($arDiscountFields);
if(IntVal($iDiscountNumber) > 0)
   \Bitrix\Sale\Internals\DiscountGroupTable::updateByDiscount($DISCOUNT_ID, [2], "Y", true);//Обновить параметры для группы пользователей с ID = 2, только тогда скидка появляется в списке скидок в админке

******
Комментарий от разработчика: не вполне корректный пример, группы надо сразу передавать.
0
Дима Парфенов
В моем случае стояла задача -> 1 товар = 1 правило для корзины
Цитата

   //Собираем массив для CSaleDiscount:Add
$Conditions = array (
 'CLASS_ID' => 'CondGroup',
 'DATA' =>
 array (
   'All' => 'AND',
   'True' => 'True',
 ),
 'CHILDREN' =>
 array (
 ),
);

   $arSD = [
       "LID" => "s1",
       "NAME" => $code . "_skidka",
       "LAST_DISCOUNT" => "N",
       "MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем
       "ACTIVE" => "Y",
       'ACTIONS' => [
           'CLASS_ID' => 'CondGroup',
           'DATA' => ['All' => 'AND'],
           'CHILDREN' => [
               [
                   'CLASS_ID' => 'ActSaleBsktGrp',
                   'DATA' => [
                       'Type' => 'Closeout', // фиксированная цена
                       'Value' => $newprice, // сама цена
                       'Unit' => 'CurEach', // для каждого товара
                       'Max' => 1,
                       'All' => 'AND',
                       'True' => 'True'
                   ],
                   'CHILDREN' => [
                       [
                           'CLASS_ID' => 'CondIBElement', // это я взял из документации по методу CCatalogDiscount::Add
                           'DATA' => [
                               'logic' => 'Equal', // только равно
                               'value' => [$PRODUCT_ID]  // коду продукта
                           ]
                       ]
                   ]
               ]
           ]
       ],
       "CONDITIONS"=>$Conditions,
       "USER_GROUPS" => array(2), // группы пользователей, можно просмотреть в настройки -> пользователи -> группы
       "CURRENCY" => "RUB"
   ];
   if ($newprice > 0) {
       addDiscount($arSD);
   }
function addDiscount($arFields)
{
   if ($ID = CSaleDiscount::Add($arFields))
       echo "new ID disctount {$ID}";
   else
       echo "error {$ID}";

}
© «Битрикс», 2001-2025, «1С-Битрикс», 2025
Наверх