Как изменить профиль покупателя в заказе с помощью Bitrix API?
Ситуация такова: в уже сформированном заказе необходимо сменить профиль покупателя с одного на другой (именно профиль покупателя, который привязан к пользователю, а не самого пользователя!). Это можно сделать в административном разделе в режиме редактирования заказа, но в моей ситуации необходимо реализовать данный функционал через API Bitrix.
В методе CSaleOrder::Update($orderID, $arFields) в массиве arFields нет поля Профиля покупателя, есть только USER_ID, что есть ID Пользователя.
Есть функция Sale\Helpers\Admin\OrderEdit::saveProfileData. Но не совсем разобрался, что именно она хочет в качестве аргументов.
Вопрос: каким образом можно сменить профиль через API?
Профиль пользователя не сохраняется в заказе, во время оформления, из указанного профиля копируются данные в свойства заказа и всё. В админке если не менять пользователя, то выбрать профиль во время редактирования заказа нельзя, можно только поправить свойства заказа. Если меняем пользователя или создаём новый заказ, то выбрать профиль можно. Функция \Bitrix\Sale\Helpers\Admin\OrderEdit::saveProfileData() сохраняет сам профиль, а не свойства заказа.
В вашем случае, нужно взять значения свойств из другого профиля и присвоить их вместо текущих.
где $arProfileProps — массив свойств из профиля покупателя.
И при первой попытке PHP выдаёт ошибку: [Error] Call to a member function setValue() on null (0).
Но, если выполнить PHP-сценарий ещё раз, то все данные в заказе обновятся.
Борис Евстратов, попробуйте убрать тот $OrderBX->save(); что в цикле. Не уверен что из-за этого, но его в цикле точно быть не должно. Метод save() на заказе нужно вызывать только один раз, после изменения всех данных заказа.
Кстати, $somePropValue->save(); тоже лучше убрать. А как вы проверяете что свойства назначились? Попробуйте сделать 2 разных скрипта, в одном менять свойства, а во втором только их считывать. Запустите по очереди и посмотрите есть ли результат.