Россия

d7 Импорт ZIP-кодов из csv-файла СДЕК в местоположения


Задача:

Модуль службы доставки СДЕК для 1С Битрикс грузит местоположения без ZIP-кодов. В результате, для таких местоположений не работает Почта России. Поэтому берем csv-файл с сайта СДЕК, парсим его и устанавливаем индексы для местоположений.


Решение:

1. Берем все местоположения на сайте, у которых: - CODE начинается с "c_" - нет ZIP кода

 array(
        //'CODE' => array('newly-created-location-code', 'c_'),
		'PARENT_ID' => $parentID,
		'NAME.LANGUAGE_ID' => 'ru'
    ),
    'select' => array(
		'ID',
		'CITY_ID',
		'CODE',
		'PARENT_ID',
                'EXTERNAL.*',
                'EXTERNAL.SERVICE.CODE',
		'LNAME' => 'NAME.NAME'
    )
));
$i = 0;
$arParentID = array();
while($item = $res->fetch())
{
	if((!strlen($item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID])>0
 || $item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID]==1
 || $item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID]=='000001')
 && preg_match("#c_#",$item[CODE]))
	{
		
		if(strlen($arParentID[$item['PARENT_ID']])>0)
		{ 
			$arLocations[$i][ELEMENT] = $item;
			$arLocations[$i][PARENT_NAME] = $arParentID[$item['PARENT_ID']];			
		}
		else
		{	
			$arParentLocation =\Bitrix\Sale\Location\LocationTable::getList(array(
				'filter' => array(
					'NAME.LANGUAGE_ID' => 'ru',
					'ID' => $item['PARENT_ID']
				),
				'select' => array(
					'ID',
					'CITY_ID',
					'CODE',
					'PARENT_ID',
					'EXTERNAL.*',
					'EXTERNAL.SERVICE.CODE',
					'LNAME' => 'NAME.NAME',
				)
			));
			if($itemParentLocation = $arParentLocation->fetch())
			{			
				$arLocations[$i][ELEMENT] = $item;
				$arLocations[$i][PARENT_NAME] = $itemParentLocation[LNAME];
				$arParentID[$item['PARENT_ID']] = $itemParentLocation[LNAME];
			}
		}		
		$i++;
    }		
} 
sort($arParentID);

?>

2. Парсим csv-файл и делаем update ZIP-кодов.
Также, если встречаем дубли, удаляем их.
Местоположения идентифицируем по наименованию и наименованию родительского местоположения.

 0)
		{
			if(strlen($data[7])>1 && $data[7]!=1 && $data[7]!='000001')
			{
				$arResult['ITEMS'][] = $data; 
				//$arNames - содержит все совпадения по имени
				$arNames = array();
				foreach($arLocations as $k => $v)
				{
					if($data[2] == $v[ELEMENT][LNAME] && $data[3]==$csvParentName)
					{					
						$arNames[] = $v;
					}
				}
					
				if(count($arNames)>1)
				{
						for($del=1;$del0)
							{						
								$resDel = \Bitrix\Sale\Location\LocationTable::delete($arNames[$del][ELEMENT][ID]);
							
								if($resDel->isSuccess())
								{
									print('Deleted!');
								}
							}
						}
						
				}
				elseif(count($arNames)>0)
				{
					//Обновляем ZIP-коды
						
						$sp = preg_split("#,#",$data[7]);
						
						$dataUpdate = array(
							"PARENT_ID" => $arNames[0][ELEMENT][PARENT_ID]		
						);
						foreach($sp as $ksp => $vsp)
						{
							$dataUpdate["EXTERNAL"]["n".$ksp] = array( 
									"SERVICE_ID" => 1, // ID сервиса ZIP
									"XML_ID" => $vsp // значение
							);				
							
						}
					
						$resUpdate = \Bitrix\Sale\Location\LocationTable::update($arNames[0][ELEMENT][ID], $dataUpdate);
						if($resUpdate->isSuccess())
						{
							?>