Заказы из Битрикса выгружаются в учётную программу, а затем после обработки прилетают обратно в виде XML-файла выгрузки.
Иногда в учётной программе меняется контрагент: надо чтоб и в заказе Битрикса он менялся в соответствии с данными из XML.
Парсер XML уже написан. И функция успешно повешена на событие "OnSaleOrderBeforeSaved". Единственное, что не получается — сохранить новые данные в заказ, удалив старые.
Пример: контрагентом был:
[1] Ваше ФИО: Дмитрий
[21] Получатель: Дмитрий Иванов
[20] Паспортные данные: 0000 123456
[2] E-Mail: dima@ivanov.ru
[3] Телефон: +7 (000) 111-22-33
[4] Индекс: 190000
[7] Адрес доставки: Санкт-Петербург, Невский пр.
А новым контрагентом стал:
[8] Название компании: ООО "ОРГАНИЗАЦИЯ"
[10] ИНН: 7800000000
[11] КПП: 780000000
[25] ОГРН: 10000000000
[9] Юридический адрес: 190000 ГОРОД САНКТ-ПЕТЕРБУРГ, НЕВСКИЙ ПРОСПЕКТ, ДОМ 1
[24] Физический адрес: 190000 ГОРОД САНКТ-ПЕТЕРБУРГ, НЕВСКИЙ ПРОСПЕКТ, ДОМ 1
[26] Расчётный счёт: 40000000000000001
[29] Наименование банка: Филиал ПАО Банка «БАНК» г. Санкт-Петербург
[28] Корреспондентский счёт: 30000000000009
[27] БИК: 000000011
[12] Контактное лицо: Иван Петров
[13] E-Mail: ivan.petrov@mail.su
[14] Телефон: +7 (999) 999-99-99
[44] Получатель: Семен
[16] Индекс: 190000
[19] Адрес доставки: г Санкт-Петербург, Московское шоссе, д.1
Вышеприведённые данные выведены таким образом:
$propertyCollection = $OrderBX->getPropertyCollection();
foreach ($propertyCollection as $Prop)
{
echo '['.$Prop->getPropertyId().'] '.$Prop->getName().': '.$Prop->getValue().'<br>';
}
Алгоритм таков:
1. Формируется новый профиль из XML
2. Удаляются все существующие поля из заказа
3. Изменяется тип плательщика
4. Назначаются новые поля по данным из профиля
Фрагмент кода:
// 1. Формирование нового профиля
$arProfileFields = array(
"NAME" => $NAME,
"USER_ID" => $UID,
"PERSON_TYPE_ID" => $PID
);
$PROPS = array ( ... );
$PROFILE_ID = CSaleOrderUserProps::Add($arProfileFields);
foreach ($PROPS as $prop)
{
CSaleOrderUserPropsValue::Add($prop);
}
$newUserIDBX = $PROFILE_ID;
// 2. Удалим все свойства заказа
$orderProperties = $OrderBX->getPropertyCollection();
foreach ($orderProperties as $orderProperty) {
$Del = $orderProperty->getPropertyId();
$orderProperty->delete($Del);
}
$orderProperties->save();
// 3. Установим новый тип плательщика
$OrderBX->setPersonTypeId(intval($PID));
// 4. Получим свойства профиля $newUserIDBX и назначим соответствующие им ORDER_PROPS
$profileProperties = Sale\OrderUserProperties::getProfileValues(intval($newUserIDBX));
$propertyCollection = $OrderBX->getPropertyCollection();
foreach ($profileProperties as $propId => $propVal) {
$orderPropValue = $propertyCollection->getItemByOrderPropertyId($propId);
$orderPropValue->setValue($propVal);
}
// Сохраним
$propertyCollection->save();
Но в результате ловлю ошибку в отладке:
[Error]
Call to a member function setValue() on null (0)
/home/bitrix/www/bitrix/php_interface/init.php:1020
Кто может помочь с решением данной проблемы?