Получение списка профилей покупателя по ID пользователя:

function getList($userId)
{
    $profiles = \Bitrix\Sale\Internals\UserPropsTable::getList([
        'filter' => [
            'USER_ID' => $userId,
        ],
    ]);

    $result = [];

    while ($profile = $profiles->fetch()) {
        $result[] = $profile;
    }

    return $result;
}

Получение списка значений полей профиля (свойств заказа) по ID профиля:

function getProfileFields($profileId)
{
    $fields = \CSaleOrderUserPropsValue::GetList([], ['USER_PROPS_ID' => $profileId]);

    $profileFields = [];

    while ($field = $fields->GetNext()) {
        $profileFields[$field['PROP_CODE']] = $field;
    }

    return $profileFields;
}

Получение профиля покупателя по типу плательщика и ID покупателя:

function getUserProfileByPersonType($personType, $userId)
{
    $profile = \Bitrix\Sale\Internals\UserPropsTable::getList([
        'filter' => [
            'USER_ID' => $userId,
            'PERSON_TYPE_ID' => $personType,
        ],
    ]);

    if ($profile = $profile->fetch()) {
        return $profile;
    }

    return false;
}

Получение списка полей профиля (не значений) по типу плательщика:

function getProfileFieldsByPersonType($personType)
{
    $fields = \CSaleOrderProps::GetList(
        ['SORT' => 'ASC'],
        [
            'PERSON_TYPE_ID' => $personType,
            'USER_PROPS' => 'Y',
        ]
    );

    $result = [];

    while ($field = $fields->GetNext()) {
        $result[] = $field;
    }

    return $result;
}

Добавление профиля покупателя по типу плательщика:

function addProfile($personType, $data, $userId)
{
    $profile = \Bitrix\Sale\Internals\UserPropsTable::add([
        'NAME' => $data['NAME'],
        'USER_ID' => $userId,
        'PERSON_TYPE_ID' => $personType,
        'DATE_UPDATE' => new \Bitrix\Main\Type\DateTime,
    ]);

    if (!$profile->isSuccess()) {
        return false;
    }

    $profileId = $profile->getId();

    $requiredFields = getProfileFieldsByPersonType($personType);

    foreach ($requiredFields as $field) {
        \CSaleOrderUserPropsValue::Add([
            'USER_PROPS_ID' => $profileId,
            'ORDER_PROPS_ID' => $field['ID'],
            'NAME' => $field['NAME'],
            'VALUE' => $data[$field['CODE']],
        ]);
    }

    return $profileId;
}

Изменение профиля покупателя по типу плательщика:

function updateProfile($profileId, $personType, $data)
{
    $requiredFields = getProfileFieldsByPersonType($personType);

    \Bitrix\Sale\Internals\UserPropsTable::update($profileId, [
        'NAME' => $data['NAME'],
        'XML_ID' => $data['DEFAULT'],
        'DATE_UPDATE' => new \Bitrix\Main\Type\DateTime,
    ]);

    $profileFields = getProfileFields($profileId);

    foreach ($requiredFields as $field) {
        if (isset($profileFields[$field['CODE']])) {
            \CSaleOrderUserPropsValue::Update($profileFields[$field['CODE']]['ID'], [
                'USER_PROPS_ID' => $profileId,
                'ORDER_PROPS_ID' => $field['ID'],
                'VALUE' => $data[$field['CODE']],
            ]);
        }
    }

    return $profileId;
}

$data – массива вида:

$data = [
    'NAME' => 'Иван',
    'LAST_NAME' => 'Иванов',
    'PHONE' => '+7 999 888-77-66',
    //... и т.д.
];