Попробуйте такое
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', 'orderModify');
function orderModify(Bitrix\Main\Event $event)
{
global $USER;
/** @var \Bitrix\Sale\Order $order */
$order = $event->getParameter('ENTITY');
$personTypeId = 3;
$profileId = CSaleOrderUserProps::DoSaveUserProfile($USER->GetID(), null, 'Профиль ' . random_int(0, 500), $personTypeId,
// код свойства и его значение
[
20 => random_int(100, 900),
21 => random_int(500, 599)
], $errors);
// Получаем текущую коллекцию свойств заказа и удаляем все свойства
/** @var \Bitrix\Sale\PropertyValueCollection $orderProperties */
$orderProperties = $order->getPropertyCollection();
/** @var \Bitrix\Sale\PropertyValue $orderProperty */
foreach ($orderProperties as $orderProperty) {
$orderProperty->delete();
}
// Меняем тип плательщика
$order->setPersonTypeId($personTypeId);
// Далее взято из \Bitrix\Sale\PropertyValueCollection::load()
// Т.к. на объекте заказа уже была получена коллекция, то при вызове $order->getPropertyCollection(),
// коллекция не будет заполнена свойствами под новый тип плательщика.
// Поэтому нужно добавлять свойства вручную
// Получаем список свойств нового плательщика
$props = \Bitrix\Sale\PropertyValue::loadForOrder($order);
// Добавляем свойства к коллекции
/** @var \Bitrix\Sale\PropertyValue $prop */
foreach ($props as $prop) {
$prop->setCollection($orderProperties);
$orderProperties->addItem($prop);
// В своём коде напямую этого сделать не можем, т.к. метод и свойство имеют приватный доступ
// Но можно сделать обходным путём
// $orderProperties->setAttributes($prop);
// $orderProperties->propertyGroupMap[$prop->getGroupId() > 0 && isset($groups[$personTypeId][$prop->getGroupId()]) ? $prop->getGroupId() : 0][] = $prop;
}
// Получаем значения профиля
$profileProperties = \Bitrix\Sale\OrderUserProperties::getProfileValues($profileId);
// Записываем к заказу
$orderProperties->setValuesFromPost(array('PROPERTIES' => $profileProperties), array());
}
Обратите внимание, сохранять сущности самостоятельно не нужно, они сохранятся позже в методе save() заказа. Преждевременное сохранение может дать неожиданный результат.