Jump to content

Вопрос по 1с_exchange


Go to solution Solved by phukortsin,

Recommended Posts

Здравствуйте. Сделал сервис по проверки статуса заказ наряда (добавил поля в БД, интерфейс в админке, импорт через csv, клиентская часть -  здесь всё отлично). Не совсем правильно прогружаются поля в БД через 1С. Делал по подобию импорта товаров. Иногда парсится нормально, иногда только 4-5 позиций. Никак не хочет в id заказ наряда встать внешний id из 1С. Если полностью очистить таблицу, то первая выгрузка проходит отлично. Дальше через раз. Вот код:

 

if($simpla->request->get('type') == 'usc' && $simpla->request->get('mode') == 'checkauth')
{
	print "success\n";
	print session_name()."\n";
	print session_id();
}
if($simpla->request->get('type') == 'usc' && $simpla->request->get('mode') == 'init')
{
	$tmp_files = glob($dir.'*.*');
	if(is_array($tmp_files))
	foreach($tmp_files as $z)
	{
    	unlink($z);
    }
	unset($_SESSION['last_1c_imported_product_num']);
	print "zip=no\n";
	print "file_limit=1000000\n";
}
if($simpla->request->get('type') == 'usc' && $simpla->request->get('mode') == 'file')
{
	$filename = basename($simpla->request->get('filename'));
	$f = fopen($dir.$filename, 'ab');
	fwrite($f, file_get_contents('php://input'));
	fclose($f);
	print "success\n";
} 
if($simpla->request->get('type') == 'usc' && $simpla->request->get('mode') == 'import')
{
	print "success\n";
	$filename = basename($simpla->request->get('filename'));
	echo $filename;
	if($filename === 'usc_exchange.xml')
	{
	// Заказ наряды	
		$z = new XMLReader;
		$z->open($dir.$filename);
		while ($z->read() && $z->name !== 'Документ');
		// Последний заказ-наряд, на котором остановились
		$last_product_num = 0;
		if(isset($_SESSION['last_1c_imported_product_num']))
			$last_product_num = $_SESSION['last_1c_imported_product_num'];
		// Номер текущего товара
		$current_product_num = 0;
	while($z->name === 'Документ')
		{
			if($current_product_num >= $last_product_num)
			{
				$xml = new SimpleXMLElement($z->readOuterXML());
				// Товары
				import_zakaz($xml);
				$exec_time = microtime(true) - $start_time;
				if($exec_time+1>=$max_exec_time)
				{
					header ( "Content-type: text/xml; charset=utf-8" );
					print "\xEF\xBB\xBF";
					print "progress\r\n";
					print "Выгружено заказ-нарядов: $current_product_num\r\n";
					$_SESSION['last_1c_imported_product_num'] = $current_product_num;
					exit();
				}
			}
			$z->next('Документ');
			$current_product_num ++;
		}
		$z->close();
		print "success";
		print "Выгружено заказ-нарядов: $current_product_num\r\n";
		//unlink($dir.$filename);
		unset($_SESSION['last_1c_imported_product_num']);
	}
}	
function import_zakaz($xml)
{
	global $simpla;
	global $dir;
	global $full_update;
	// Товары0
	//  Id товара и варианта (если есть) по 1С
	@list($usc_1c_id) = explode('#', $xml->Ид);
	if(empty($usc_1c_id))
		$usc_1c_id = '';
	// Подгатавливаем вариант
	$zakaz_id = null;
	$zakaz = new stdClass;
	$zakaz->sku = (string)$xml->Номер;
	$zakaz->id = $usc_1c_id;
	// Ищем заказанаряд
	$simpla->db->query('SELECT id FROM __zakazs WHERE id=?', $usc_1c_id);
	$id = $simpla->db->result('id');
		if(empty($id))
	{
		$id = $simpla->zakazs->add_zakaz(
								array(
									'id'=>$usc_1c_id, 
									'name'=>$xml->name, 
									'sku'=>$xml->Номер, 
									'equipment'=>$xml->equipment, 
									'status'=>$xml->status 
								)
							);
	}
	else
	{
	if($full_update)
		{
			$z = new stdClass();
			$z->id = $usc_1c_id;
			$z->sku = $xml->Номер;
			$z->name = $xml->name;
			$z->equipment = $xml->equipment;
			$z->status = $xml->status;
            $id = $simpla->zakazs->update_zakaz($id, $z);
		}
	}
}

 

и содержимое xml (блок Документ)

 

<Документ>
		<ТипДокумента>ЗаказНаряд</ТипДокумента>
		<Ид>618c5c27-17b2-11e9-8066-002590597037</Ид>
		<Номер>Ц0000528790</Номер>
		<sku>0528790</sku>
		<Дата>2019-01-14</Дата>
		<ХозОперация>Ремонт</ХозОперация>
		<Роль>Продавец</Роль>
		<Контрагенты>
			<Контрагент>
				<Ид>618c5c18-17b2-11e9-8066-002590597037</Ид>
				<Наименование>Мавлеева Наиля Исламгалеевна</Наименование>
				<ПолноеНаименование>Мавлеева Наиля Исламгалеевна</ПолноеНаименование>
				<Роль>Покупатель</Роль>
			</Контрагент>
		</Контрагенты>
		<name>Мавлеева Наиля Исламгалеевна</name>
		<equipment>СТИРАЛЬНАЯ МАШИНА BOSCH </equipment>
		<publish_date>2019-01-14</publish_date>
		<Время>09:34:44</Время>
		<Комментарий>Позвонить за 1 час!!!!     Модель не знают</Комментарий>
		<status>Утверждено</status>
		<ЗначенияРеквизитов>
			<ЗначениеРеквизита>
				<Наименование>НомерПо1С</Наименование>
				<Значение>Ц0000528790</Значение>
			</ЗначениеРеквизита>
			<ЗначениеРеквизита>
				<Наименование>ДатаПо1С</Наименование>
				<Значение>2019-01-14</Значение>
			</ЗначениеРеквизита>
			<ЗначениеРеквизита>
				<Наименование>ПометкаУдаления</Наименование>
				<Значение>false</Значение>
			</ЗначениеРеквизита>
			<ЗначениеРеквизита>
				<Наименование>Проведен</Наименование>
				<Значение>true</Значение>
			</ЗначениеРеквизита>
		</ЗначенияРеквизитов>
	</Документ>

 

 

 

 
Link to post
Share on other sites

$_SESSION['last_1c_imported_product_num'] - переменная, которая УЖЕ используется и ее в новом функционале использовать нельзя.

Заменяйте на что-то типа  $_SESSION['last_1c_imported_zakazs_num'].

Link to post
Share on other sites

$_SESSION['last_1c_imported_product_num'] - переменная, которая УЖЕ используется и ее в новом функционале использовать нельзя.

Заменяйте на что-то типа  $_SESSION['last_1c_imported_zakazs_num'].

 

Дело было не в этом. Странно почему не встаёт в поле id поле из XML - Документ->Ид

Link to post
Share on other sites
  • Solution

Дело было не в этом. Странно почему не встаёт в поле id поле из XML - Документ->Ид

 

Проверяйте точно все детали. Похоже, Вы, в поле типа int пытаетесь пихнуть значение вроде '618c5c27-17b2-11e9-8066-002590597037' - отсюда и результат...

Link to post
Share on other sites

Проверяйте точно все детали. Похоже, Вы, в поле типа int пытаетесь пихнуть значение вроде '618c5c27-17b2-11e9-8066-002590597037' - отсюда и результат...

 

Спасибо. Изменил на varchar

Link to post
Share on other sites

Опять таки, надо проверять все детали. Для данного вопроса, проверять как минимум

1. $full_update,

2. Приходит ли из 1С изменение,

3. Работает ли правильно zakazs->update_zakaz($id, $z) с Вашим нестандартным типом поля.

 

И, как обычно, возможны и прочие причины...

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...