Обновление статусов заказов после выгрузки из 1С
Создаем периодический агент. Добавляем в файл /bitrix/php_interface/init.php следующую функцию:
<? function ordersStatusUpdate() { chdir('/полный путь к папке');//Переходим в папку с xml-файлом выгрузки заказов /upload/1c_exchange $arFile = array(); foreach (glob("*.xml") as $filename) { $arFile[] = $filename; } if(count($arFile)==1){ $filetime = filemtime($arFile[0]); if (file_exists('../status_exchange_date.txt')){ $time = file_get_contents('../status_exchange_date.txt', FILE_USE_INCLUDE_PATH); if(intval(trim($filetime))>intval(trim($time))) $ok_date='Y'; else $ok_date='N'; }else{ $ok_date='Y'; } if($ok_date=='Y') { file_put_contents('../status_exchange_date.txt', $filetime); CModule::IncludeModule("iblock"); CModule::IncludeModule("sale"); $obXMLFile = new CIBlockXMLFile; $obXMLFile->DropTemporaryTables();// Удаляем результат предыдущей загрузки $strError = ''; if(!$obXMLFile->CreateTemporaryTables()){// Подготавливаем БД $strError .= 'Ошибка создания БД.'.PHP_EOL; } if($fp = fopen($arFile[0], "rb")) { $obXMLFile->ReadXMLToDatabase($fp, $NS, 0);// Чтение содержимого файла за один шаг fclose($fp); } if(!CIBlockXMLFile::IndexTemporaryTables()){// Индексируем загруженные данные для ускорения доступа $strError .= 'Ошибка создания индексов БД.'.PHP_EOL; } $CIBlockXMLFile = new CIBlockXMLFile(); $rs = $CIBlockXMLFile->GetList(array()); $arTemp = array(); $arGroups = array(); $step = 0; $groupStep = 0; while($ar = $rs->Fetch()){ $arTemp[] = $ar; if($ar['NAME']=='Номер'){ $groupTemp = array(); $groupTemp['ORDER_ID'] = $ar['VALUE']; $groupStep = 1; }elseif($ar['NAME']=='Статус' && $groupStep == 1){ $groupTemp['ORDER_STATUS'] = $ar['VALUE']; $groupStep = 2; } if($groupStep ==2 && count($groupTemp)==2){ $arGroups[$groupTemp['ORDER_ID']] = $groupTemp; unset($groupTemp); $groupStep = 0; } } $strAllOrders = $strError; $strAllOrders .= date("H:i:s d.m.Y").PHP_EOL; foreach($arGroups as $arOrder){ if($arOrder['ORDER_STATUS']=='Создан') $arOrderFields = array("STATUS_ID" => "C"); elseif($arOrder['ORDER_STATUS']=='Принят') $arOrderFields = array("STATUS_ID" => "N"); elseif($arOrder['ORDER_STATUS']=='В работе') $arOrderFields = array("STATUS_ID" => "W"); elseif($arOrder['ORDER_STATUS']=='Отправлен в ТК') $arOrderFields = array("STATUS_ID" => "S"); elseif($arOrder['ORDER_STATUS']=='Доставлен') $arOrderFields = array("STATUS_ID" => "F"); elseif($arOrder['ORDER_STATUS']=='Удален') $arOrderFields = array("STATUS_ID" => "R"); $arOrder1 = CSaleOrder::GetByID(intval(trim($arOrder['ORDER_ID']))); if(!empty($arOrderFields) && !empty($arOrder1)){ if (CSaleOrder::Update($arOrder1['ID'], $arOrderFields)){ $strAllOrders .= $arOrder['ORDER_ID'].' - '.$arOrder['ORDER_STATUS'].' (Статус заказа установлен)'.PHP_EOL; }else{ $strAllOrders .= $arOrder['ORDER_ID'].' - '.$arOrder['ORDER_STATUS'].' (Ошибка установки нового статуса заказа)'.PHP_EOL; } } } file_put_contents('../ordersstatus.txt', $strAllOrders); } } return "ordersStatusUpdate();"; } ?>
Строки 45-60 изменяем соответственно структуре xml-файла.
Строки 65-70 изменяем соответственно статусам заказов на сайте.
Комментарии (1)
необходимо добавить в начало функции
22 мая, 2020 в 1:25global $USER;
if (!is_object($USER)) $USER = new CUser;