Ядро D7, примеры, документация

Алексей Будагов,

Важная тема для разработчиков, чем быстрее начнете использовать, тем лучше.

Документация: https://budagov.ru/dev/doc/ и https://dev.1c-bitrix.ru/api_d7/.
Обучающий курс https://dev.1c-bitrix.ru/learning/.

Пара примеров:

Главный модуль

Подключить модуль:

\Bitrix\Main\Loader::includeModule('iblock');

Подключить языковые файлы

\Bitrix\Main\Localization\Loc::getMessage('UPDATE_DATE_TEXT');

Подключить js, css в шаблоне

\Bitrix\Main\Page\Asset::getInstance()->addCss("/path/to/style.css");  
\Bitrix\Main\Page\Asset::getInstance()->addJs("/path/to/script.js");  

Получить настройку модуля:

$option = \Bitrix\Main\Config\Option::get('main', 'rating_normalization_type');

Запись в лог и время выполнения

use Bitrix\Main\Diag\Debug;
Debug::dumpToFile($arResult);

Debug::startTimeLabel("catalogFilter"); 
#code
Debug::endTimeLabel("catalogFilter"); 
Debug::dumpToFile(Debug::getTimeLabels()); 

Вытащить поля пользователя

$dbUser = \Bitrix\Main\UserTable::getList(array(
	'select' => array('ID', 'NAME', 'PERSONAL_PHOTO', 'PERSONAL_WWW'),
	'filter' => array('ID' => $USER->GetID())
));
if ($arUser = $dbUser->fetch()){
	var_dump($arUser);
}

Удобное управление группами пользователя

// Получение групп пользователя 
$dbGroup = \Bitrix\Main\UserGroupTable::getList(array(
	'filter' => array("USER_ID" => 90)
));
$arGroup = $dbGroup->FetchAll();    

// Добавить пользователя в группу
\Bitrix\Main\UserGroupTable::add(array(
	"USER_ID" => $order['USER_ID'],
	"GROUP_ID" => 10,
));
 
// Удалить пользователя из группы  
\Bitrix\Main\UserGroupTable::delete(array(		 
	"USER_ID" => $order['USER_ID'], 
	"GROUP_ID" => 10, 
) );

Кеширование PHP

$cache = Bitrix\Main\Data\Cache::createInstance(); 
if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) { 
    $arResult = $cache->getVars(); 
} elseif ($cache->startDataCache()) { 
    $arResult = array(); 
    if ($isInvalid) { 
        $cache->abortDataCache(); 
    } 
    $cache->endDataCache($arResult); 
} 

Инфоблоки

Получить свойства инфоблока

$dbIblockProps = \Bitrix\Iblock\PropertyTable::getList(array(
	'select' => array('*'),
	'filter' => array('IBLOCK_ID' => $arParams['IBLOCK_ID'])
));
while ($arIblockProps = $dbIblockProps->Fetch()){ 
	var_dump($arIblockProps);
} 

Получить список элементов инфоблока

$dbItems = \Bitrix\Iblock\ElementTable::getList(array(
	'select' => array('ID', 'NAME', 'IBLOCK_ID'),
	'filter' => array('IBLOCK_ID' => $arParams['IBLOCK_ID'])
));
while ($arItem = $dbItems->fetch()){  
	$dbProperty = \CIBlockElement::getProperty(
		$arItem['IBLOCK_ID'],
		$arItem['ID']
	);
	while($arProperty = $dbProperty->Fetch()){  
		$arItem['PROPERTIES'][] = $arProperty;
	}
}

Интернет магазин

Заказ:

// Получаем объект заказа для работы с ним
$order = \Bitrix\Sale\Order::load($orderId); // или по номеру заказа $order = \Bitrix\Sale\Order::loadByAccountNumber($orderNumber);

// Параметры заказа
$order->getFields(); Получает все параметры заказа

// Поля со звездочкой лучше получать и изменять внутри нужных объектов (доставка, оплата),
// т.к. может быть несколько платежных документов и несколько отгрузок.

$order->getField("ID"); // ID заказа
$order->getField("LID"); // ID сайта
$order->getField("ACCOUNT_NUMBER"); // Номер заказа (по шаблону)
$order->getField("TRACKING_NUMBER"); // 
$order->getField("PAY_SYSTEM_ID"); //* ID платежной системы
$order->getField("DELIVERY_ID"); //* ID службы доставки
$order->getField("DATE_INSERT"); // object(DateTime) Время добавления
$order->getField("DATE_UPDATE"); // object(DateTime) Время обновления
$order->getField("PERSON_TYPE_ID"); // ID типа плательщика (физ/юр лицо)
$order->getField("USER_ID"); // ID пользователя
$order->getField("PAYED"); //* Статус оплаты (Y/N)
$order->getField("DATE_PAYED"); //* object(DateTime) Дата оплаты
$order->getField("EMP_PAYED_ID"); // 
$order->getField("DEDUCTED"); //* Отгрузка заказа
$order->getField("DATE_DEDUCTED"); //* object(DateTime) Дата отгрузки
$order->getField("EMP_DEDUCTED_ID"); //*
$order->getField("REASON_UNDO_DEDUCTED"); //* Причина отмены отгрузки
$order->getField("STATUS_ID"); // Статус заказа (F/N/H  т.п., посмотреть можно тут /bitrix/admin/sale_status.php?lang=ru)
$order->getField("DATE_STATUS"); // object(DateTime) Дата изменения статуса
$order->getField("EMP_STATUS_ID"); // 
$order->getField("MARKED"); // 
$order->getField("DATE_MARKED"); // object(DateTime)
$order->getField("EMP_MARKED_ID"); // 
$order->getField("REASON_MARKED"); // 
$order->getField("PRICE_DELIVERY"); //* Стоимость доставки
$order->getField("ALLOW_DELIVERY"); //* Доставка разрешена
$order->getField("DATE_ALLOW_DELIVERY"); //* object(DateTime) Дата разрешения доставки
$order->getField("EMP_ALLOW_DELIVERY_ID"); //*
$order->getField("RESERVED"); // 
$order->getField("PRICE"); // Сумма заказа
$order->getField("CURRENCY"); // Код валюты
$order->getField("DISCOUNT_VALUE"); // Скидка
$order->getField("TAX_VALUE"); // Налог
$order->getField("SUM_PAID"); //  Оплаченная сумма
$order->getField("USER_DESCRIPTION"); // Комментарий покупателя к заказу
$order->getField("PAY_VOUCHER_NUM"); // Номер документа прихода
$order->getField("PAY_VOUCHER_DATE"); // object(DateTime) Дата прихода
$order->getField("ADDITIONAL_INFO"); // Дополнительная информация
$order->getField("COMMENTS"); // Комментарий администратора
$order->getField("COMPANY_ID"); // Офис
$order->getField("CREATED_BY"); // 
$order->getField("RESPONSIBLE_ID"); // Ответственный
$order->getField("STAT_GID"); // 
$order->getField("DATE_PAY_BEFORE"); // 
$order->getField("DATE_BILL"); // 
$order->getField("IS_RECURRING"); // 
$order->getField("RECURRING_ID"); // 
$order->getField("LOCKED_BY"); // ID пользователя, заблокировавший заказ
$order->getField("DATE_LOCK"); // object(DateTime) Дата блокировки
$order->getField("RECOUNT_FLAG"); // 
$order->getField("AFFILIATE_ID"); // 
$order->getField("DELIVERY_DOC_NUM"); // 
$order->getField("DELIVERY_DOC_DATE"); // 
$order->getField("UPDATED_1C"); // 
$order->getField("ORDER_TOPIC"); // 
$order->getField("XML_ID"); // 
$order->getField("ID_1C"); // 
$order->getField("VERSION_1C"); // 
$order->getField("VERSION"); // 
$order->getField("EXTERNAL_ORDER"); // 
$order->getField("STORE_ID"); // 
$order->getField("CANCELED"); // Омена заказа (N/Y)
$order->getField("EMP_CANCELED_ID"); // 
$order->getField("DATE_CANCELED"); // object(DateTime) Дата отмены
$order->getField("REASON_CANCELED"); // Причина отмены
$order->getField("BX_USER_ID"); // 
$order->getField("RUNNING"); // 

$order->setField('PAYED', 'N'); // изменить любой параметр
$order->save(); // и сохраняем

Пример создание заказа

// Массив товаров
$arItems = array(
	array(
		'PRODUCT_ID' => 18,
		'NAME' => 'Товар 1', 
		'PRICE' => 500,
		'CURRENCY' => 'RUB',
		'QUANTITY' => 3.25
	)
);

// Создаем и наполняем корзину
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
foreach ($arItems as $i => $arItem) {
	$basketItem = $basket->createItem("catalog", $arItem['PRODUCT_ID']);
	$basketItem->setFields($arItem);
}

// Создаем заказ и привязываем корзину, перерасчет происходит автоматически
$order = \Bitrix\Sale\Order::create(SITE_ID, $userId);
$order->setPersonTypeId($personTypeId);
$order->setBasket($basket);

// Создание отгрузки
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem(
	\Bitrix\Sale\Delivery\Services\Manager::getObjectById(1)
);
$shipmentItemCollection = $shipment->getShipmentItemCollection();

/** @var \Bitrix\Sale\BasketItem $basketItem */
foreach ($basket as $basketItem) {
	$item = $shipmentItemCollection->createItem($basketItem);
	$item->setQuantity($basketItem->getQuantity());
}

// Создание оплаты
$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem(
	\Bitrix\Sale\PaySystem\Manager::getObjectById(1)
);
$payment->setField("SUM", $order->getPrice());
$payment->setField("CURRENCY", $order->getCurrency());

// Coхраняем заказ
$result = $order->save();
if (!$result->isSuccess()) {
	//$result->getError();
}

Пример обновление заказа

$order = \Bitrix\Sale\Order::load($orderId);
$order->setField('USER_DESCRIPTION', 'Доставить к подъезду');

// Разрешаем отгрузку
$shipmentCollection = $order->getShipmentCollection();
/** @var \Bitrix\Sale\Shipment $shipment */
foreach ($shipmentCollection as $shipment) {
	if (!$shipment->isSystem()) { // существует системная отгрузка, т.к. товары не могут быть без отгрузки
		$shipment->allowDelivery();
	}
}

// Coхраняем заказ
$result = $order->save();
if (!$result->isSuccess()) {
	//$result->getError();
}

Другие примеры можно поискать по тегу примеры d7

Опубликовано 16 Марта 2016 | Обновлено 19 Марта 2018
документация, примеры d7, разработчику

Возврат к списку

Комментарии
Алексей
10 Сен 2018
Добрый день, подскажите как можно изменить сумму заказа? Мне надо её уменьшить на сумму пользовательского поля, никак не получается...
Алексей Будагов
Алексей Будагов
10 Сен 2018
Алексей, а в битриксе нельзя менять сумму заказа :) Нужно делать скидку на товары.
Ян
25 Июн 2018
Спасибо, что помогаете.
Я обратил внимание, что если создавать заказ по коду выше, то почему-то цена в корзине у меня меняется на последний тип цен.
Т.е. я наполняю корзину (не сохраняю ее). Потом корзину привязываю к заказу.
В каждом товаре в корзине прописываю все поля (цену, тип цен, ид цены, ид продукта, кастом прайс и т.д.)
Потом проверяю $basketItem->getFields(), поля записались в объект.
Сохраняю заказ - а там встает другая цена (по которой покупать нельзя, НО можно смотреть).
Алексей Будагов
Алексей Будагов
25 Июн 2018
Ян, тут стоит обратиться в тех поддержку битрикс. Если Вы указываете тип цены у товаров, то он не должен меняться. Честно говоря я давно не делал полный цикл создания заказа и не смогу помочь, т.к. данную ситуацию нужно разбирать на "горячем" примере.
Ян
21 Июн 2018
Вы могли бы рассказать про метод:
$shipmentItemCollection->resetCollection($basket);
?
Ян
22 Июн 2018
Алексей Будагов, спасибо
Ян
20 Июн 2018
Еще не подскажите как удалить товар из отгрузки в существующем заказе после изменения корзины заказа?
Алексей Будагов
Алексей Будагов
22 Июн 2018
Ян, не подскажу, нужно смотреть объект отгрузок $shipmentCollection = $order->getShipmentCollection();
Ян
19 Июн 2018
На этапе формирования заказа
$payment->setField("SUM", $order->getPrice());
Вот это $order->getPrice() показывает 0,0.
Хотя товары есть в корзине.
Алексей Будагов
Алексей Будагов
20 Июн 2018
Ян, так не скажу. По идее товары должны быть добавлены в заказ и нужно сделать перерасчет заказа. Посмотрите исходный код компонента оформления заказа.
Ян
20 Июн 2018
Алексей Будагов, простите. Нашел ошибку у себя. Все работает!
Ян
18 Июн 2018
Подскажите.
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
...
$order->setBasket($basket);
На этом этапе уже есть запись в БД или она появится после сохранения заказа?
Алексей Будагов
Алексей Будагов
18 Июн 2018
Ян, нету. Все нужно сохранять методом save();
Ян
18 Июн 2018
Еще вопрос.
Встречаю 2 варианта кода перебора товаров корзины:
1. foreach ($order->getBasket() as $basketItem)
2. $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID);
   $basketItems = $basket->getBasketItems();
   foreach ($basketItems as $basketItem)
Как правильно все-таки?
Алексей Будагов
Алексей Будагов
18 Июн 2018
Ян, первый вариант - когда заказ уже создан (через объект $order выбираются заказанные товары), второй - когда заказа еще нет (выбираются товары которые на данный момент лежат у пользователя в корзине)
Ян
18 Июн 2018
Алексей Будагов, спасибо )
Евгений
14 Фев 2018
Пипец. Я так понимаю получить заказ в D7 вообще невозможно. Где не ищешь, только "давайте создадим заказ" или "создание заказа". Видимо основная цель всех инет магазинов это создать заказ. Прочитать его потом вовсе не обязательно.
Алексей Будагов
Алексей Будагов
15 Фев 2018
Евгений, посмотрите последний блок "Обновление заказа". Самая первая строка $order = \Bitrix\Sale\Order::load($orderId); это и есть получение заказа на D7, далее уже через этот объект можно поменять/получить все возможные параметры, в том числе и доставку с оплатой.
Andrey
17 Янв 2018
Здравствуйте.
Как изменить статус заказа на "Выполнен" на d7?
Алексей Будагов
Алексей Будагов
17 Янв 2018
Andrey, попробуйте так
получаем заказ $order = \Bitrix\Sale\Order::load($orderId); //$orderId - id заказа
ставим статус $order->setField('STATUS_ID', 'F'); // F - заказ выполнен
сохраняем $order->save();
Иван
9 Авг 2017
Здравствуйте, как можно из не сохраненного еще заказа получить информацию о товарах?
Алексей Будагов
Алексей Будагов
9 Авг 2017
Иван, необходимо получить данные о корзине.
Новым методом $basket = $order->getBasket(); или старым, если заказ уже создан $dbBasket = CSaleBasket::GetList(Array("ID" => "ASC"), Array("ORDER_ID" => $orderId));