Цель. В 1с создается заказ. Потом добавляется файлик к заказу. И отправляется в битрикс. Штатно не сработало. Обработчиков битрикса нет- делаем хаками. (можно переписать компоненту.)
Добавляем 2 функции в php init. Внимание. для заказов обработчиков нет. т.к компонент bitrix:sale.export.1c без обработчиков
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// не сработало //AddEventHandler('catalog', 'OnSuccessCatalogImport1C', 'customCatalogImportStep'); function customCatalogImportStep($arParams, $arFields) { if (file_exists($arFields)) { Provider1c::loadXml1c($arFields); } file_put_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c/1c_handler.txt", date("d-m-Y H:i:s")."; SESSION=".print_r($_SESSION,1)."; request ".print_r($_REQUEST,1)." pararm".print_r($arParams,1)." arFields ".print_r($arFields,1).";\n", FILE_APPEND); } //обработчик компонента заказов- внутри кода работает function startFrom1c_exchange() { if( !empty($_REQUEST['filename']) && $_REQUEST['mode']='import' ) { $filename=$_SERVER["DOCUMENT_ROOT"]."/upload/1c_exchange/".$_REQUEST['filename']; if( file_exists ( $filename )) { $arParams=array(); customCatalogImportStep($arParams, $filename); } } } |
в файле
bitrix/modules/sale/admin/1c_exchange.php делаем Дописку вызова startFrom1c_exchange
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
if($type=="sale") { file_put_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c/1c_handler.txt", date("d-m-Y H:i:s")."; SESSION=".print_r($_SESSION,1)."; request ".print_r($_REQUEST,1)." ;\n", FILE_APPEND); startFrom1c_exchange(); $APPLICATION->IncludeComponent("bitrix:sale.export.1c", "", Array( "SITE_LIST" => COption::GetOptionString("sale", "1C_SALE_SITE_LIST", ""), "EXPORT_PAYED_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_PAYED_ORDERS", ""), "EXPORT_ALLOW_DELIVERY_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_ALLOW_DELIVERY_ORDERS", ""), "EXPORT_FINAL_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_FINAL_ORDERS", ""), "CHANGE_STATUS_FROM_1C" => COption::GetOptionString("sale", "1C_CHANGE_STATUS_FROM_1C", ""), "FINAL_STATUS_ON_DELIVERY" => COption::GetOptionString("sale", "1C_FINAL_STATUS_ON_DELIVERY", "F"), "REPLACE_CURRENCY" => COption::GetOptionString("sale", "1C_REPLACE_CURRENCY", ""), "GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("sale", "1C_SALE_GROUP_PERMISSIONS", "1")), "USE_ZIP" => COption::GetOptionString("sale", "1C_SALE_USE_ZIP", "Y"), "INTERVAL" => COption::GetOptionString("sale", "1C_INTERVAL", 30), "FILE_SIZE_LIMIT" => COption::GetOptionString("sale", "1C_FILE_SIZE_LIMIT", 200*1024), "SITE_NEW_ORDERS" => COption::GetOptionString("sale", "1C_SITE_NEW_ORDERS", "s1"), "IMPORT_NEW_ORDERS" => COption::GetOptionString("sale", "1C_IMPORT_NEW_ORDERS", "N"), ) ); } |
подрубаем класс 1с в Init php
1 2 3 4 |
\Bitrix\Main\Loader::registerAutoLoadClasses(null, [ 'Provider1c' => '/bitrix/php_interface/include/1c/Provider1c.php',//клас 1c обработчика ]); |
Вот исходный файл класса обработчика
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
<?php class Provider1c { public static function getXml($url) { return json_decode(json_encode(simplexml_load_file($url)), true); } public static function WLog($str) { $date_str= date('Y-m-d H:i:s'); // file_put_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c/1c_log.txt", $date_str."\n$str\n", FILE_APPEND); } public static function addFileInOrder($orderId,$novoe_imya, $filePatch ) { CModule::IncludeModule("sale"); $ORDER_PROPS_ID=3;//файл id свойства // старый файл удаляем в любом случае. может стать и пусто и новый файл // возможно удаление надо сделать, для какого свойства в xml $dbOrderProps = CSaleOrderPropsValue::GetList( array("SORT" => "ASC"), array("ORDER_ID" => $orderId , "ORDER_PROPS_ID" => $ORDER_PROPS_ID,) ); while ($arOrderProps = $dbOrderProps->GetNext()){ CSaleOrderPropsValue::Delete($arOrderProps['ID']); } //добавляем $arFile = CFile::MakeFileArray($filePatch); if (isset($arFile["name"]) && strlen($arFile["name"]) > 0 ) { $re = '/\.(.+)$/m'; $str = $arFile["name"]; preg_match($re, $str, $matches); if($matches){ $arFile["name"]=$novoe_imya.$matches[0]; } $arFile["MODULE_ID"] = "sale"; $fid = CFile::SaveFile($arFile, "sale"); if (intval($fid) > 0) { $arFields = array( "ORDER_ID" => $orderId, "ORDER_PROPS_ID" => $ORDER_PROPS_ID, //id "NAME" => 'Спецификация', "CODE" => 'agreement', "VALUE" => $fid, ); $id=CSaleOrderPropsValue::add( $arFields); } } } //загружаем одиночный пункт из выгрузки public static function loadItem($item){ $ID_1C=$item['Ид']; $rewizity=$item['ЗначенияРеквизитов']['ЗначениеРеквизита']; $orderId=0; $novoe_imya=''; $filePatch=''; foreach ($rewizity as $valR) { if($valR['Наименование']=='Файл') { $filePatch=$_SERVER["DOCUMENT_ROOT"].'/upload/1c_exchange/'.$valR['Значение']; } if($valR['Наименование']=='ОписаниеФайла') { preg_match('/#(.+)$/m', $valR['Значение'], $matches); if($matches){ $novoe_imya=$matches[1]; } } } $order = ['ID' => 'desc']; $select = [ 'ID', 'ID_1C', 'XML_ID' ]; $filter=array( 'ID_1C'=>$ID_1C ); $orders = \CSaleOrder::GetList( $order, $filter, false, false, $select, [] ); if($arOrder = $orders->Fetch()) { $orderId=$arOrder['ID']; } self::addFileInOrder($orderId,$novoe_imya, $filePatch); } //загрузка в цикле public static function loadCycle($mass){ foreach ($mass as $key=>$item) { self::loadItem($item); } } public static function loadXml1c($url) { CModule::IncludeModule("sale"); file_put_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c/1c_file.txt", date("d-m-Y H:i:s").";start file=".print_r($url,1).";\n", FILE_APPEND); $result = self::getXml($url); \CModule::IncludeModule('iblock'); if (is_array($result)) { // 13 секунд // pr($result); if(isset($result['Контейнер'])){ Provider1c::WLog('start files '.$url); self::loadCycle($result['Контейнер']); Provider1c::WLog(' end files '.$url); } } file_put_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c/1c_file.txt", date("d-m-Y H:i:s").";end file=".print_r($url,1).";\n", FILE_APPEND); } } |
вот такой файлик xml к нам прилетел на обработку
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="UTF-8"?> <КоммерческаяИнформация xmlns="urn:1C.ru:commerceml_3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсияСхемы="3.1" ДатаФормирования="2sdfsdfsdfsdf"> <Контейнер> <Документ> <Ид>fbe7759d-945c-11ea-a906-ac1f6b26f7a7</Ид> <ЗначенияРеквизитов> ..... <ЗначениеРеквизита> <Наименование>Файл</Наименование> <Значение>import_files/fb/fbe7759d-945c-11ea-a906-ac1f6b26f7a7_fbe7759e-945c-11ea-a906-ac1f6b26f7a7.pdf</Значение> </ЗначениеРеквизита> <ЗначениеРеквизита> <Наименование>ОписаниеФайла</Наименование> <Значение>import_files/fb/fbe7759d-945c-11ea-a906-ac1f6b26f7a7_fbe7759e-945c-11ea-a906-ac1f6b26f7a7.pdf#Приложение к договору_СК104</Значение> </ЗначениеРеквизита> </ЗначенияРеквизитов> </Контейнер> </КоммерческаяИнформация> |