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

2525
Алексей,

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

Документация: 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);
}

Пользовательские поля

$dbUserFields = \Bitrix\Main\UserFieldTable::getList(array(
	'filter' => array('ENTITY_ID' => 'IBLOCK_'.$iblockId.'_SECTION')
));
while ($arUserField = $dbUserFields->fetch()) {
	if ($arUserField["USER_TYPE_ID"] == 'enumeration') {
		$dbEnums = CUserFieldEnum::GetList(
			array(),
			array('USER_FIELD_ID' => $arUserField['ID'])
		);
		while ($arEnum = $dbEnums->GetNext()) {
			$arUserField['ENUMS'][$arEnum['XML_ID']] = $arEnum;
		}
	}
	$arResult['USER_FIELDS'][$arUserField["FIELD_NAME"]] = $arUserField;
}

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

// Получение групп пользователя 
$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); 
} 

Инфоблоки

Более подробная статья: Bitrix D7 для инфоблоков

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

$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();

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();

foreach ($shipmentCollection as $shipment) {
	if (!$shipment->isSystem()) { // существует системная отгрузка, т.к. товары не могут быть без отгрузки
		$shipment->allowDelivery();
	}
}

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

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

Опубликовано 16 Марта 2016 | Обновлено 4 Ноября 2019
примеры d7, разработчику

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

Похожие статьи
Bitrix D7 для инфоблоков 0
Bitrix D7 это просто, просто нужно покопаться в исходниках :) На самом деле, если понять как раб...
Читать дальше »
Алексей,
Покупка в 1 клик, минимальный код 0
Частая задача для интернет-магазина на 1С-Битрикс. В примере показаны все этапы минимально необходим...
Читать дальше »
Алексей,
Комментарии
Кирилл
16 Окт 2019
Алексей, а подскажите, как при создании заказа не отправлять сообщение пользователю, я про  SALE_NEW_ORDER
Алексей
Алексей
16 Окт 2019
Кирилл, самый простой вариант - отключите активность почтового шаблона. Посложнее, есть событие OnBeforeEventAdd, в его обработчике нужно вернуть false
Кирилл
16 Окт 2019
Алексей, задача стоит такая, при создании заказа не отправлять сообщение пользователю(отменить отправление SALE_NEW_ORDER), скажем, через быстрый заказ.. а с оформление, чтобы отправлялось. Точно OnBeforeEventAdd может подойти. Но в целом было бы удобнее, если бы Битрикс сделал параметр при создании заказа, напишу им в тех поддержку, может реализуют :) Спасибо.
Алексей
Алексей
16 Окт 2019
Кирилл, тогда есть еще один способ, в методе сохранения заказа есть параметр "не отправлять сообщение", точно не помню, попозже напишу как им воспользоваться.
Алексей
Алексей
16 Окт 2019
Кирилл, немного ошибся, не параметр, а отдельный метод. Попробуйте перед созданием заказа отключить уведомление методом \Bitrix\Sale\Notify::setNotifyDisable(true); Если это поможет, дайте знать.
Кирилл
17 Окт 2019
Алексей, добавил идею в Битрикс https://idea.1c-bitrix.ru/36486/
toorr2p
20 Дек 2018
Товар как добавить в каталог?
Алексей
Алексей
30 Янв 2019
toorr2p, через старое ядро лучше CIBlockElement::Add. Если я правильно понял вопрос.
Алексей
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));