Задача: При оформлении заказа пользователь может выбрать пункт самовывоза (склады магазина). Нужно заполнить свойство заказа адресом пункта и передать в 1С-Предприятие.
Создаем свойство и передаем в 1С как дополнительный реквизит
Переходим в свойства заказа и создаем новое свойство: тип строка, системное, код свойства "ADRESS_STORE_GET", обязательное со значением по умолчанию "-".

Привязку этого свойства делаем только для службы доставки "Самовывоз", чтобы не создавалось при выборе других доставок.

Далее, в настройках обмена с 1С, на вкладке "Профили обмена", в самом низу добавляем новый реквизит:
"Пункт самовывоза" => "Свойство заказа" => "Пункт самовывоза".

Теперь при выборе службы доставки "Самовывоз" будет создаваться скрытое (от пользователя) свойство "Пункт самовывоза" со значением "-".
Получаем выбранный пункт самовывоза и меняем значение свойства
Нам нужно вместо "-" перезаполнить свойство адресом выбранного магазина/склада. Для этого открываем шаблон компонента оформления заказа и в файл confirm.php добавляем код:
$order = \Bitrix\Sale\Order::load($arResult['ORDER']['ID']);
$collection = $order->getPropertyCollection();
$shipments = $order->getShipmentCollection();
foreach ($shipments as $shipment) {
if (!$shipment->isSystem()) {
$storeId = $shipment->getStoreId();
if ($storeId > 0) {
$dbList = \CCatalogStore::GetList(
array(
'ID' => 'DESC'
),
array(
'ID' => $storeId
),
false,
false,
array(
'ID',
'ADDRESS',
'DESCRIPTION' // Не обязательно, но можете получить все поля склада через '*'
)
);
if ($store = $dbList->Fetch()) {
// Меняем значение свойства ADRESS_STORE_GET
$dbResOrdVals = \Bitrix\Sale\PropertyValueCollection::getList([
'select' => [
'ID',
'CODE' // В целом, тоже не нужен
],
'filter' => [
'=ORDER_ID' => $arResult['ORDER']['ID'],
'=CODE' => 'ADRESS_STORE_GET'
]
]);
while ($itemProp = $dbResOrdVals->fetch()) {
$propertyValue = $collection->getItemById($itemProp['ID']);
$r = $propertyValue->setField('VALUE', $store['ADDRESS']);
$order->save();
}
}
}
}
}
Этот файл срабатывает после успешного оформления заказа, когда собственно заказ уже создан. Мы знаем его ID и далее:
- Загружаем заказ с использованием ID заказа из массива $arResult["ORDER"]['ID'].
- Получаем коллекцию свойств заказа.
- Получаем коллекцию отгрузок заказа.
- Проходим по каждой отгрузке в коллекции.
- Проверяем, что отгрузка не является системной.
- Получаем ID склада из отгрузки. Здесь я получаю и описание склада, но это не обязательно - мне нужен только адрес.
- Если ID склада больше нуля, выполняем запрос к базе данных, чтобы получить информацию о складе.
- Если запрос вернул результат, получаем адрес склада.
- Выполняем запрос для получения свойства заказа с кодом ADRESS_STORE_GET.
- Проходим по результатам запроса и обновляем значение свойства адресом выбранного склада.
- Сохраняем изменения в заказе.