Блог

Обновление статусов заказов после выгрузки из 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)

  • babyshaq

    необходимо добавить в начало функции
    global $USER;
    if (!is_object($USER)) $USER = new CUser;

    22 мая, 2020 в 1:25

Оставить комментарий



Вам нужен сайт? С чего начать?

Проконсультируем, найдем оптимальное решение, подготовим индивидуальное предложение.