1C-BitrixからBASHぞの暙準的な亀換増分アップロヌドスクリプトの詳现な分析

1CシステムずBitrix管理システム䞊のサむト間で補品カタログの同期を確保するために、1CからBitrixぞの特定のパラメヌタヌを持぀HTTP GETおよびPOSTリク゚ストの転送に基づいお、CommerceML圢匏のBitrix XMLファむル亀換プロトコルの暙準が䜿甚され、ステヌタスを含む暙準応答を受信したす実装の結果を瀺す操䜜。



このシリヌズの最初の蚘事では 、1Cたたは別のシステムたたはプログラムで生成されたXMLファむルを取埗し、暙準プロトコルを䜿甚しおBitrixに転送する別のスクリプトを䜿甚する可胜性を実蚌したす。



この蚘事では、スクリプトの各行に詳现なコメントを付けたす。 これにより、ニヌズぞの倉曎が簡単になりたす。



このスクリプトはBASHで蚘述されおおり、1C-Bitrixが1Cからカタログ補品を転送し、Bitrix管理システムに基づいお構築されたサむトから泚文をダりンロヌドするために提䟛するのず同じ暙準を通じお異なる亀換を提䟛するいく぀かのスクリプトの1぀です。



次はコメント付きのスクリプトのテキストです。 排他的なコヌドを含むスクリプトの簡単なビュヌは、 前の蚘事で説明されおおり、bitrexchangeプロゞェクトのgithubで入手できたす。



スクリプトずロヌカルファむルの蚭定



空たたは砎損したファむルが送信されるのを防ぎ、゚ラヌが発生した堎合のデヌタ砎損を防ぐために、スクリプトを終了したす。



set -e
      
      





珟圚の完党なパスを倉数に保存しながら、これは珟圚のディレクトリぞの非垞に興味深い移動です



 cd $(dirname $0) cdir=$(pwd)"/"
      
      





通垞、1Cはファむルをネットワヌク䞊のサヌバヌ䞊の共有フォルダヌにアップロヌドしたす。これは事前にマりントしたす。 しかし、それはあなたのためのロヌカルディレクトリであり、ネットワヌク䞊であなたによっお共有されたす



 remote_dir="/mnt/localwinserver_fs/import/webdata/"
      
      





xmlファむルがパックされるzipファむルの名前。 代わりに、䞀時的な名前のみを䜿甚できたす。 ただし、このようなハヌドコヌドされたファむル名は、以前に転送されたファむルのコピヌを保存するために䜿甚されたす。 それは非垞に䟿利です。い぀、どの補品がどの日に登堎し、どの䟡栌で衚瀺されたかなどを確認できたす。



 zip_fname="catalogue.zip"
      
      





転送するファむルの名前。 これらのファむルは1Cによっお圢成され、通垞はそのような名前を持っおいたすが、他にもあるかもしれたせん それをチェックアりトする必芁がありたす ファむルはスペヌス付きでリストされたす。



 xml_files="import0_1.xml offers0_1.xml"
      
      





゚ラヌメッセヌゞが送信される管理者のメヌル。



 email1="admin@yourinternetshop.com"; email2="alert@yourinternetshop.com";
      
      





珟圚の時刻を決定したす。



 ctime=$(date +%Y-%m-%d-%H%M)
      
      





ファむルの確認ず準備



このスクリプトは、倚くの皮類のダりンロヌドすべおの特殊なケヌスです。 珟圚実行䞭のカタログをアンロヌドするこずに加えお、別のスクリプトがある他の亀換がありたす。 ただし、このアンロヌドのフレヌムワヌク内-カタログのアンロヌド、2぀のタむプが定矩されおいたす。いわゆる増分アンロヌド、぀たり倉曎のアンロヌドず完党なアンロヌドです。 圢匏では、1぀のパラメヌタヌのみが互いに異なりたす属性の倀



 
      
      





-それはtrueたたはfalseです。 XMLファむルの内容に぀いお蚀えば、むンクリメンタルアンロヌドには完党な補品セットを含めるこずもできたすが、違いは異なりたす。Bitrixが完党なアンロヌドを受け取るず、既存の商品カタログ党䜓を完党に消去し、再び充填したす。 商品の画像もすべお倱われるため、完党なアップロヌドには必ずすべおの画像が含たれたすが、増分アンロヌドには含たれない堎合がありたす。 もちろん、䜜成したバむンディングをサむトのデヌタベヌスに保持するこずが重芁な堎合は、既存のディレクトリを削陀しないこずをお勧めしたす。 䞀般に、䜕らかの方法で、䜿甚するアンロヌドのタむプず定矩する倧きな違いがありたす。 したがっお、1Cを決しお信頌しないで、このアンロヌドが実際に増分であるこずを確認しおください。さらに、䞡方のファむルをチェックむンしたす。 同時に、これらのファむルがたったく存圚するこず、および2぀のファむルがあるこずを確認したす。 たずえば、䜕らかの理由で1Cが補品範囲のみをアンロヌドする堎合があり、ボヌルが萜䞋しおファむルがたったくアップロヌドされないこずがありたす。 したがっお、問題が発生した堎合は、そのこずを自分で通知しお終了したす。



 chan=$(grep -e "=\"true" ${remote_dir}*.xml | wc -l) if test "$chan" != "2"; then echo "Error: XMLs are not in 'changes only' mode or file(s) are missing" mail -s " " -a "From: bitrexchange <${email1}>" $email1,$email2 <<< "     ." exit 1 else echo "OK: Format of XMLs are 'changes only'" fi
      
      





䜜業自䜓を開始したす。ファむルをパックし、以前のファむルのアヌカむブを珟圚の日付にしたす。 このコマンドは、すべおのxmlファむルをディレクトリにパックするこずに泚意しおください。



 if [ -f $zip_fname ]; then mv $zip_fname "${zip_fname}.${ctime}"; fi /usr/bin/zip -9j "$zip_fname" ${remote_dir}*.xml
      
      





HTTPリク゚スト蚭定



HTTPリク゚ストのヘッダヌを蚭定したす。 実際、これは、第䞀に、完党にオプションであり、第二に、ナヌザヌ゚ヌゞェントなど、独自の䞀郚を蚭定できたす。これにより、受信偎のApacheログでこれらのリク゚ストをキャッチできたす。



 headers="--header=\"User-Agent: 1C+Enterprise/8.2\" --header=\"Accept-Encoding: deflate\""
      
      





ログむンがロヌドされるナヌザヌのナヌザヌ名ずパスワヌド。 これは通垞1c_importたたはimportです。 このナヌザヌ名ずパスワヌドは、Bitrixコントロヌルパネルで蚭定されたす テストには、管理者アカりントadminを䜿甚できたす。



 login="import" password="yourpasswordonbitrix"
      
      





スクリプトを煩雑にしないために、すべおのリク゚ストのベヌスURLを個別の倉数に入れたす。 これは通垞、 ドメむン/ bitrix / admin / 1c_exchange.phpです



 baseurl="http://yourinternetshop.com/bitrix/admin/1c_exchange.php"
      
      





実際の亀換



文曞は非垞に衚面的であり、プロトコルの䜿甚方法は1C構成ずは異なるため、䜿甚される亀換方法は実隓的に怜蚌および確認され、いく぀かの䜜業プロゞェクトで倉曎なしで機胜し、倧量䜿甚の可胜性を確認したす。



亀換プロトコルによれば、いく぀かのタむプのリク゚ストが順番に送信されたす。 リク゚ストのタむプは、ベヌスURLに远加されたパラメヌタヌによっお決たりたす。このパラメヌタヌは、既にベヌスURLずしお蚭定しおいたす。 URLの2぀の倉数は、リク゚ストのタむプを指定したす。 最初のタむプは、販売たたはカタログのいずれかです。 少なくずも最初のリク゚ストでこれを倉曎し、垞にカタログを䜿甚するこずができたす。 2番目は、倉数モヌドで亀換の段階を決定するため、私たちにずっおより重芁です。



最初のリク゚スト、モヌド= checkauth

2番目の芁求、mode = init

3番目の芁求、mode = file + POST zip file。

埌続のリク゚スト、モヌド=むンポヌト



最初のリク゚スト



HTTP認蚌を䜿甚しおログむンしたす 通垞、このメ゜ッドはbitrixに含たれおいたすが、含たれおいない堎合はサヌバヌ蚭定を確認しおください。 私の知る限り、bitrixでこのメ゜ッドを有効たたは無効にする蚭定はありたせんが、倚くの方法でプログラムで認蚌をオフにするこずができたす。 いわゆる「プロアクティブな防埡」も干枉する可胜性がありたす。ログむンできない堎合は、テスト䞭は無効にしおみおください。



 ret_line=$( wget $headers --user=${login} --password=${password} --auth-no-challenge -O - -q "${baseurl}?type=sale&mode=checkauth" ) read -a ret_ar <<< $ret_line
      
      





プロトコルによるず、ログむンが成功した堎合、BitrixはHTTP応答の本文に3行の圢匏で応答を返したす。



最初は文字列の成功です

2番目はセッション倉数で、通垞はPHPSESSIDです

第䞉-セッション倀、文字列。



susseccを受信した堎合は、セッション倉数ずその倀を保存しお、将来䜿甚できるようにしたす。保存しない堎合は、スクリプトを終了したす。 この時点で゚ラヌが発生した堎合、䜕らかの方法で保存および衚瀺できるHTMLペヌゞを取埗できたす。ほずんどの堎合、ログむンが必芁であるずいうメッセヌゞが衚瀺されたす。 この段階-ほずんどの堎合-ナヌザヌのナヌザヌ名ずパスワヌドを確認し、たず、このナヌザヌ名ずパスワヌドの䞋でBitrixコントロヌルパネルに移動したす。



 if [ ${ret_ar[0]} != "success" ]; then echo "Login error\r\n"; exit -1; fi sessvar=${ret_ar[1]} sessid=${ret_ar[2]} echo sessid=$sessid
      
      





2回目のリク゚スト



2番目の芁求はInitです。 このリク゚ストを受信するず、ディレクトリ/ upload / 1c_catalog /は完党にクリアされたす前のダりンロヌドからのデヌタが必芁な堎合は泚意しおください。 たずえば、商品の写真を転送するこずが重芁です。 1Cバヌゞョン8.3は発芋されたため、䜕らかの理由でこの芁求は送信されず、すぐにファむル芁求に進みたす。 この段階で゚ラヌが発生する可胜性がありたす。これに぀いおは付録で説明したす。゚ラヌの可胜性を参照しおください1。



 ret=$(wget $headers --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=init"); echo $ret
      
      





3番目のリク゚スト



3番目の芁求では、POST芁求ずずもにzipファむルを転送する必芁がありたす。 mode = fileである必芁がありたすが、ファむル名-パラメヌタファむル名-私が理解するように、リク゚ストにはどこにも衚瀺されず、送信されたデヌタがファむルずしお保存される名前のみを蚭定するためファむルはPOSTリク゚ストであるため、実際にはHTTPのコンテキストでは、これはファむルではなく、単なるデヌタの䞀郚にすぎたせん。



このステップでは、upload / 1c_catalogディレクトリヌに、解凍されたimport.zipファむルがありたす。 興味深いこずに、それ以䞊の远加リク゚ストは必芁ありたせん。 最初のむンポヌト芁求があるずすぐに、自身を解凍したす。



 ret=$(wget $headers --post-file ${zip_fname} --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=file&filename=import.zip"); echo $ret
      
      





むンポヌトリク゚スト



さらに、1C-Bitrix亀換プロトコルによれば、成功文字列が受信されるたで、mode = fileでリク゚ストを送信する必芁がありたす。 実際、成功ではないこずを確認する必芁がありたすが、各リク゚ストに進捗応答があり、もしあれば、むンポヌトを続行できたす。䜕か他のものが来た堎合、䜕らかの理由でむンポヌトが終了したした。たぶん成功。 文曞化されおいない倚くのポむントの1぀は、そのようなリク゚ストサむクルを展開されたファむルごずに繰り返す必芁があり、zipファむルの名前は他の堎所で指定する必芁がないこずです。 付録の゚ラヌ2も参照しおください。



 for fname in $xml_files; do st="progress"; while [ "$st" = "progress" ]; do ret=$(wget $headers --header="Cookie: ${sessvar}=${sessid}" -O - -q "${baseurl}?type=catalog&mode=import&filename=${fname}"); st=$( <<< "$ret" head -n1 | cut -c1-8); echo "$ret" | iconv -f cp1251 -t utf-8 done done
      
      





このサむクルの埌、最埌のメッセヌゞ=成功であるこずを確認する必芁がありたす。そうでない堎合は、再床自分自身に通知したす。 これは、このスクリプトのフレヌムワヌク内で、たたは他の方法ログの確認などで実行できたす。



最埌のリク゚スト



ドキュメントによるず、最埌の芁求はtype = successである必芁があり、1Cはこの芁求を送信したすが、このスクリプトはこれを䞍芁にしたす。



アプリケヌション



考えられる゚ラヌ1



2番目の芁求では、゚ラヌ「倱敗」がスロヌされたす。 コンポヌネントは、゚ラヌずずもに「倱敗」ずいう単語を返し、その埌に゚ラヌの説明が続きたす。 しかし、どうやら、芁求時に蚀語を刀別できないため、゚ラヌを詳现に蚘述せずに倱敗を返すだけです。 䜕らかの皮類のデフォルト蚀語が必芁ですが。 おそらくその理由は他の䜕かかもしれたせんが、事実は倱敗が䞎えられ、それがすべおだずいうこずです。 ゚ラヌの原因を特定できたせん。 い぀ものように、コヌドに忍び蟌むこずで解決したす。



 COption::GetOptionString("sale", "secure_1c_exchange", "N") == "Y"
      
      





コヌドでこのパラメヌタヌの怜蚌を盎接無効にできたす。Nに蚭定できたす。

蚭定-ツヌル-PHPコマンドラむン。



 COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y" ); COption::SetOptionString("sale", "secure_1c_exchange", "N" );
      
      





考えられる゚ラヌ2



非自明な間違い各段階で2行が衚瀺されたす。1行目は進行状況で、2行目は䜕が行われおいるかの説明です。 ですから、間違いなくプログレスブロックが必芁です。 YYYYYアむテムのXXXXを凊理したした。



-ここでは、「非垞に倚くの芁玠の非垞に倚くを凊理したす」-これはむンポヌトです。 そうでない堎合、むンポヌトは行われたせん。 そのような堎合は、特定の構成でした。



1C-BitrixからBASHぞの暙準亀換 䞀連の出版物の最初の蚘事 。



All Articles