1C Webサヌビスを䜿甚したCのクラむアントずの1Cの亀換

1぀のプロゞェクトでは、1C Webサヌビスを䜿甚する必芁があり、倉庫自動化システムを構築し、デヌタ収集端末は1Cに盎接接続され、クラむアント自䜓は.NETで開発されたした。 結果は非垞に興味深い構造でした。 Webサヌビス操䜜モヌドでの1C蚭定に関する情報を受け取り、簡単な構成ずクラむアントをCでチュヌトリアルの実隓圢匏で䜜成し、研究所で成功裏に提瀺したした。



実隓宀の䜜業には少し耇雑な名前が付けられたした。

1Cで開発された゜ヌスの䟋でWebサヌビスを䜿甚するクラむアントサヌバヌマルチプラットフォヌム゜リュヌション間の情報亀換の組織Enterprise 8.2プラットフォヌムずCの.NET 4.0プラットフォヌム䞊のクラむアント



猫の䞋で興味のある方、どうぞ。





仕事の目的



Webサヌビスを構築する技術、WebサヌビスのWSDL蚘述の圢成を習埗する。 Webサヌビスを介した転送の可胜性に぀いお、XMLスキヌマでオブゞェクトをシリアル化する原則を孊習したす。



ハヌドりェアず゜フトりェア



  1. Microsoft Windows 7 x64
  2. プラットフォヌム1C゚ンタヌプラむズ8.2
  3. むンタヌネット情報サヌバヌ
  4. Visual Studio 10 Ultimate


理論的玹介



Webサヌビステクノロゞヌを䜿甚しお、たすたす倚くの亀換が行われおいたす。 ホストデヌタベヌスにはWebサヌビス拡匵機胜ずデヌタハンドラヌをむンストヌルするだけで十分であり、Clint゜リュヌションではWebサヌビスに接続できるため、これは䟿利です。 このテクノロゞヌはマルチプラットフォヌムであり、珟時点ではその䜿甚は非垞に重芁です。



WSDL蚘述を䜿甚したWebサヌビスの䟋は次のずおりです。



  1. http://www.cbr.ru/scripts/Root.asp?Prtid=DWS毎日のデヌタを受信するための䞭倮銀行のWebサヌビス。
  2. http://api.yandex.ru/speller/doc/dg/concepts/api-overview.xml Yandex Webサヌビススペルチェッカヌ。
  3. https://www.flightstats.com/developers/bin/view/Web+Services/WSDLフラむト、倩気情報などを監芖するための、倚数のWebベヌスの統蚈サヌビス。




WSDL Webサヌビス蚘述蚀語は、Webサヌビスを蚘述しおアクセスするためのXMLベヌスの蚀語です。 仕様http://www.w3.org/TR/wsdl 。



SOAP Simple Object Access Protocolは、分散コンピュヌティング環境の構造化メッセヌゞングプロトコルです。 SOAPは、XML圢匏の任意のメッセヌゞずリモヌトプロシヌゞャコヌルRPCの亀換に䜿甚されたす。 仕様http://www.w3.org/TR/soap/ 。



XDTO XMLデヌタ転送オブゞェクト -XMLスキヌマを䜿甚しお蚘述されたデヌタのオブゞェクトモデリングのメカニズム詳现に぀いおは、 http  //v8.1c.ru/overview/xdto.htmを参照。



プリミティブ型をシリアル化するためのほずんどのメ゜ッドはW3によっお開発され、名前空間「 http://www.w3.org/2001/XMLSchema 」で説明されおいたす。



䜜業タスク



タスク11CEnterpriseプラットフォヌムをむンストヌルし、IISサヌバヌコンポヌネントをむンストヌルし、1C Web ExtensionsをIISサヌバヌに接続したす。



1CEnterpriseプラットフォヌムをむンストヌルする堎合、Web拡匵機胜をむンストヌルする必芁がありたす。





図 1. 1Cのむンストヌル時に遞択されたコンポヌネント



「 コントロヌルパネル\すべおのコントロヌルパネル芁玠\プログラムず機胜 」メニュヌで、远加のWindowsコンポヌネントをむンストヌルする必芁がありたす。 「Windows機胜を有効たたは無効にする 」IISコンポヌネントを指定したす。 デフォルトで遞択されたコンポヌネントに加えお、ISAPIテクノロゞヌに関連するコンポヌネントをさらに远加する必芁がありたす。このテクノロゞヌのおかげで、1C Webサヌバヌ゚クステンションはIIS Webサヌバヌず通信でき、認蚌タむプは認蚌を䜿甚しおWebサヌビスぞのアクセスを蚱可する「URLによる」です1Cデヌタベヌスナヌザヌ。 むンストヌル埌、オペレヌティングシステムを再起動するこずをお勧めしたす。





図 2. IISのむンストヌル時に遞択されたコンポヌネント



「 コントロヌルパネル\すべおのコントロヌルパネル芁玠\管理ツヌル」メニュヌで、「 IISマネヌゞャヌ 」コン゜ヌルを起動し、「 アプリケヌションプヌル 」芁玠を開き、コンテキストメニュヌで「 DefaultAppPool 」プヌルを開き、「 詳现蚭定... 」を遞択したす。 「むンストヌルする必芁がありたす」「 True 」。 これは、Web-Extension 1Cの操䜜に必芁です。なぜなら、 32ビットアプリケヌションです。 これはデバッグに䟿利ですコンフィギュレヌタヌから公開する堎合、デフォルトで「 DefaultAppPool 」が眮き換えられるため、管理察象環境なしでサヌビスごずに個別のプヌルを䜜成するこずをお勧めしたす。



同じIISマネヌゞャヌコン゜ヌルで、 既定のWebサむト芁玠を遞択し、 認蚌アクションを遞択したす。ここで、オプション 匿名認蚌を有効にする必芁がありたす。



IISサヌバヌで1C Webサヌビスを公開できるようになりたした。 ただし、このパブリケヌションを可胜にするには、 管理者ナヌザヌに代わっお1CEnterprise Configuratorを起動する必芁がありたす。



タスク2単玔な1C構成を䜜成したす。

構成の開発を開始する最初のこずは次のずおりです。管理者ロヌルを䜜成する必芁がありたす 構成開発の方法論に埓っお、これはFull Rightsず呌ばれるべきです



デヌタベヌスには、泚文されたアむテムの数量ずタむプを含むすべおの泚文に関する情報が含たれおいるず考えおいたす。1぀の泚文にはアむテムず数量を含むリストがあり、泚文には独自の番号ず䜜成日もありたす。 すべおの泚文に関する情報は、Webサヌビスを介しお送信する必芁がありたす。

これを説明するには、デヌタベヌスオブゞェクトを䜜成する必芁がありたす。





図 3.䜜成された1C構成のデヌタ構造



远加の詳现なしのディレクトリ「 呜名法 」。 「デフォルト」の詳现には、アむテムの名前ずコヌドに関する情報が含たれおいたす。



ドキュメント「 バむダヌの泚文 」。衚郚分「 補品 」が含たれ、その各行には、呜名法タむプ「 DirectoryReference.Nomenclature 」の芁玠および数量タむプ「 数倀 」の小数点以䞋15桁の「 数量 」の芁玠ず3埌。



次に、1Cを゚ンタヌプラむズモヌドで実行し、䜜成した呜名法ず察応する番号で蚘入された耇数のドキュメントを䜜成できたす。



タスク31C Webサヌビスの䜜成ず公開。

「 䞀般 」構成グルヌプで、最初にアむテムを転送するために、「 XDTO-packages 」タむプの新しい芁玠を䜜成したす。 たずえば、「 NomenclatureXDTO 」ず呌ぶこずができたす。 名前空間URLは、WSDL仕様に埓っお、このパッケヌゞの仕様のURLアドレスずしお割り圓おる必芁がありたす。たずえば、

「 Company.com/1C/Nomenclature 」 このパッケヌゞでは、「 Nomenclature 」などのオブゞェクトタむプを䜜成する必芁がありたす。詳现には「 Code 」ず「 Name 」があり、察応するタむプ「 stringhttp://www.w3.org/2001/XMLSchema 」がありたす。

次に、顧客の泚文に関する情報を含む2番目のXDTOパッケヌゞを䜜成する必芁がありたす。これは、名前空間「 company.com/1C/ClientOrder 」の「 ClientOrderXDTO 」ず呌ぶこずができたす。 たず、䜜成した呜名パッケヌゞを䜿甚できるようにするために、むンポヌトディレクティブ「 company.com/1C/Nomenclature 」を接続する必芁がありたす。 これは、ドキュメント「 顧客の泚文 」の衚郚分に含たれるアむテムの転送に必芁です。



次に、テヌブルパヌツの1行を含むオブゞェクトタむプ「 ClientOrderRow 」を䜜成する必芁がありたす。 このタむプは、詳现「 呜名法 」ず「 カりント 」の組み合わせで構成されたす。それぞれの呜名法に぀いおは、オブゞェクトの皮類「呜名法http://company.com/1C/Nomenclature」を瀺し、数量に぀いおは「 doublehttp// www.w3.org/2001/XMLSchema 。 "

泚文自䜓を含むオブゞェクトのタむプは「 ClientOrder 」ず呌ばれ、泚文番号、䜜成日、泚文の衚圢匏郚分の芁玠の配列を含む必芁がありたす。 タむプ文字列の「 番号 」、タむプ「 dateTimehttp://www.w3.org/2001/XMLSchema 」の「 日付 」およびタむプ「 ClientOrderRowhttp://company.com/1C/ClientOrder 」の「 補品 」、最小数が「 0 」、最倧数が「 -1 」であるこずを瀺す必芁がありたす。これは、このオブゞェクトが配列であるこずを瀺しおいたす。



ただし、泚文のリストを返す必芁があるため、この配列を含むオブゞェクトタむプを䜜成する必芁がありたす。したがっお、タむプ「 ClientOrder 」 http// companyの 「 ClientOrder 」ずいう属性を 1぀だけ持぀「 ArrayOfClientOrders 」ずいう別の芁玠を䜜成する必芁がありたす.com / 1C / ClientOrder 。」





図4. 1CのXDTOパッケヌゞの構造



これに関しお、転送された倀の説明の䜜成は完了したず芋なすこずができたす。 Webサヌビス自䜓ずそのメ゜ッドを蚘述する必芁がありたす。

「䞀般」構成グルヌプでは、オブゞェクト、Webサヌビスを䜜成する必芁がありたす。 「 サヌビス 」ず呌ぶこずができたす。 「その他」タブで、Webサヌビスが属する名前空間、䟋えば「 company.com/1C 」、および新しく䜜成されたパッケヌゞ「 company.com/1C/Nomenclature、company.com/を含むXDTOパッケヌゞのリスト」を指定したす1C / ClientOrder 。」 「操䜜」タブで、「 GetClientOrders 」メ゜ッドを䜜成したす。このメ゜ッドは、倀「 ArrayOfClientOrdershttp://company.com/1C/ClientOrder 」を返したす。同時に、空の倀を返す機胜を蚭定し、「Method Name」ずいう虫県鏡のフィヌルドをクリックしたす」、それにより、このWebサヌビスメ゜ッドにアクセスするずきに呌び出されるWebサヌビスモゞュヌルに関数を䜜成したす。



デヌタベヌスから受け取っお顧客泚文のリストを返す関数を正しく蚘述するためには、この関数のコヌドは付録1にあるため、内郚蚀語1Cを知る必芁がありたす。説明が必芁なのは、「 XDTO Factory 」はシリアル化を実行する䜕らかのマネヌゞャヌであるずいうこずですオブゞェクト、およびこのシリアル化されたオブゞェクトを返す必芁がありたす。 同時に、デヌタベヌスに含たれるすべおの泚文が遞択され、衚郚分の番号、日付、行のシリアル化が行われたすが、呜名法には远加のシリアル化が必芁で、既にパックされたオブゞェクトが䞀般構造に挿入されたす。 パックされたオブゞェクトの配列がアセンブルされ、配列パッケヌゞにシリアル化されたす。 呌び出された関数の結果ずしおクラむアントに送信されたす。

Webサヌビスを公開するには、1C configuratorメニュヌで「 Administration \ Publish on a web server ... 」を遞択し、Webサヌビスパブリケヌションの名前、たずえば「 Company 」、サヌビスの名前、䟋えば「 Service 」およびアドレス「 service.1cws 」を指定したす。たた、パブリケヌションのパスも指定したす䟋 " C\ inetpub \ wwwroot \ Company \ "。



その埌、WSDL Webサヌビス構造はアドレス「 localhost / Company / ws / service.1cwsWsdl 」で利甚可胜になりたす



タスク4CPlatform .NET 4.0でのクラむアントの䜜成。

Visual Studioで、新しいCコン゜ヌルアプリケヌションを䜜成したす。



次に、「 Reference 」プロゞェクト芁玠のコンテキストメニュヌを呌び出し、「 Add service reference ... 」アクションを実行し、開いたメニュヌの「 Advanced ... 」ボタンをクリックしたす。「 Add Web Reference ... 」ボタンをクリックする必芁があるりィンドりが開きたす。

WebサヌビスのWSDL蚘述ぞのリンクを挿入する必芁があるメニュヌが開きたす。





図 5. CでWebサヌビスをプロゞェクトに接続する



1Cで䜜成されたWebサヌビスの堎合、このリンクは「 localhost / Company / ws / service.1cwsWsdl 」のようになりたす。Webサヌビスの説明を正しく受け取った埌、Webぞのアクセス元ずなる.NET名前空間の名前を指定する必芁がありたすサヌビス、たずえば「 CompanyService 」、「 参照の远加... 」ボタンをクリックするず、Visual Studioはこの説明に埓っおクラスを自動的に生成したす。 プロゞェクトでは、生成されたクラスのメ゜ッドを呌び出すだけで十分ですが、シリアル化ず呌び出しは.NETプラットフォヌムによっお実行されたす。



次に、Webサヌビスにアクセスし、受信したデヌタをナヌザヌに衚瀺するプログラムを䜜成する必芁がありたす。 これを行うには、C蚀語を知っおおく必芁がありたす。プログラムコヌドは付録2に蚘茉されおいたす。このコヌドから、「 サヌビス 」オブゞェクトの䜜成はサヌビスアクセスマネヌゞャヌの䜜成に過ぎないこずを明確にする必芁がありたす。 これに代わっお、Webサヌビスメ゜ッドが呌び出されたす。

「 _1CWebServiceClientConsole 」はプロゞェクトの䞀般的な名前空間であり 、䜜成時に遞択されたす。 WSDL構造から取埗したWebサヌビスの名前空間は、プロゞェクトの名前空間に完党に含たれおいるため、「独自の」リモヌトメ゜ッドを呌び出すこずができたす。



このようなアヌキテクチャの構築はプログラマにずっお透過的ですが、その埌の送信のためにどのポむントで䜕がシリアル化されおいるかを理解する必芁がありたす。 このクラむアント/サヌバヌアプリケヌションアヌキテクチャは、珟圚最も人気がありたす。



ラボレポヌト
レポヌトは必芁ありたせん。ワヌクスタンドの䜜成が必芁であり、その䜜業のデモンストレヌションが必芁です。





劎働保護手順
ワヌクスタンドを衚瀺し、接続順序ず構成機胜、およびオブゞェクトのシリアル化の機胜を説明する必芁がありたす。 保護を成功させるには、すべおの質問に答える必芁がありたす。





テストの質問ずタスク
  1. 1C Web拡匵ずはどのようなビット深床ですか
  2. デヌタのシリアル化のためにパッケヌゞの構造を栌玍する1Cは䜕ですか
  3. Webサヌビス蚘述構造を取埗する方法は
  4. WebサヌビスをVisual Studioで開発䞭のプロゞェクトに接続する方法は
  5. クラむアントのコヌルマネヌゞャヌを䜜成する理由ずは






付録11C蚀語のGetClientOrders関数コヌド
 GetClientOrders()  = XDTO.("http://company.com/1C/ClientOrder", "ArrayOfClientOrders");  = XDTO.("http://company.com/1C/ClientOrder", "ClientOrder");  = XDTO.("http://company.com/1C/ClientOrder", "ClientOrderRow");  = XDTO.("http://company.com/1C/Nomenclature", "Nomenclature");  =  ; . = " | ., | ., | . | | .  ";  = .();  = .();  .() = 0   Null; ;  = XDTO.();  .()   = XDTO.(); .Number = .; .Date = .;     ..  //       !  = XDTO.();  = XDTO.(); .Code = ..; .Name = ..; .Nomenclature = ; .Count = .; .Products.(); ; .ClientOrder.(); ;  ; 
      
      







付録2WebサヌビスにアクセスするCプログラムコヌド
 using System; using _1CWebServiceClientConsole.CompanyService; namespace _1CWebServiceClientConsole { class Program { static void Main(string[] args) { using (Service service = new Service()) { service.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12; service.Credentials = new System.Net.NetworkCredential("LOGIN", "PASS"); var arrayOfClientOrders = service.GetClientOrders(); if (arrayOfClientOrders == null) Console.WriteLine(" "); foreach (var clientOrder in arrayOfClientOrders) { Console.WriteLine("  №" + clientOrder.Number + "  " + clientOrder.Date); Console.WriteLine("-----"); foreach (var clientOrderRow in clientOrder.Products) { Console.WriteLine(clientOrderRow.Nomenclature.Name + " " + clientOrderRow.Count); } Console.WriteLine("-----"); } } Console.ReadKey(); } } }
      
      








All Articles