JavaScriptおよびHtmlからSOAP 1C Webサービスへのアクセス

説明した方法を使用すると、JavaScriptを使用してhtmlページから1C Webサービスにアクセスできます。 例としてディレクトリのリストが表示されます。 任意のディレクトリをクリックすると、名前の最初の文字が表示されます。 文字をクリックすると、その文字で始まる名前のデータが表示されます。



このメソッドは、WebサービスとHTMLページが同じサーバーで公開されている場合に適用できます。 この場合、クロスドメインの問題はありません。 たとえば、ドメインが異なる場合、Chromeはエラーをスローします。



Failed to load resource: Origin localhost:3299 is not allowed by Access-Control-Allow-Origin







Webサービスの公開の詳細に進むことなく、1C側で、実行操作を含むカタログWebサービスが作成および公開されたとします。 入力時-タイプ文字列のスクリプトパラメーター、出力タイプ文字列。 この操作は、パラメーターからの任意のスクリプトコード側で実行され、変数の結果からJSONシリアル化を返します。



  ExecuteCommands(script) result = null; Execute(script); return JSON(result); 
      
      







JSONシリアル化を使用してJavaScriptを操作し、1つのコマンドeval(resultText)で文字列をオブジェクト/配列に変換すると便利です。 インターネットでは、1C用のJSONシリアライザーがいくつか見つかります。



アドレスを入力して、Webサービスが応答することを確認します。



Webサービスの応答





すべてのブラウザケースのスタイルが登録されている既製のテンプレートでHtmlファイルプロジェクトを開始することをお勧めします。 非常にまともなテンプレートはhtml5boilerplate.comにあり、テンプレートにはjQuery 1.9.1が含まれています。



上記のフォームに、ウェブサーバーの設定を配置します:wsUrl-ウェブサービスアドレス、wsUser-ログイン、wsPassword-パスワード。 1C Webサービスの側では、基本的な認証が有効になっています。 ログインとパスワードは、1Cで指定されたユーザーに対応しています。



左側のパネルは使用可能なcatalogsListディレクトリを表示し、右側のパネルは文字(文字)とデータ(catalogRecords)を表示します。



Javascript





SOAP Webサービスにアクセスする機能は、次のように定義されています。



  function executeSoap(script, successHandler) { var wsUrl = $("#wsUrl").val(); var soapRequest = '<?xml version="1.0" encoding="utf-8"?>' + '<soapenv:Envelope ' + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + 'xmlns:api="http://www.1cbit.ru/dominicana/soap-html-js" ' + 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' + 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' + '<soapenv:Body>' + '<api:Execute soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' + '<' + 'script xsi:type="xsd:string">' + script + '</' + 'script>' + '</api:Execute>' + '</soapenv:Body>' + '</soapenv:Envelope>'; $.ajax({ type: "POST", url: wsUrl, contentType: "text/xml", dataType: "xml", username: $("#wsUser").val(), password: $("#wsPassword").val(), data: soapRequest, success: successHandler, error: processError }); }
      
      







executeSoapの入り口で、1C側で実行される1Cスクリプトと、正常に実行されるためのハンドラーが実行されます。 エラーが発生した場合、processErrorハンドラーが呼び出され、エラーメッセージが表示されます。



1Cコードは、scriptタグを介してhtmlコードで記述されます。 jQuery $( "#enumerate1CCatalogs")。Text()を使用して、実行する各コードのテキストを取得できます。



ディレクトリ名のリストを取得します。



  <script id="enumerate1CCatalogs" type="text/1c"> result =  ();     .   =  ("name, synonym"); .name = .; .synonym = .; result.(); ; </script>
      
      







ディレクトリ名の最初の文字を取得する{カタログ}



  <script id="getFirstLetters" type="text/1c">  =  (); . = "  (, 0, 1)  letter  .{catalog}   (, 0, 1)"; result = .().(); </script>
      
      







{catalog}ディレクトリのデータを取得しています。最初の文字は{condition}条件の一部です。



  <script id="getCatalogData" type="text/1c">  =  (); . = "  as ref,  as name  .{catalog}  (, 0, 1)  ({condition})"; result = .().(); </script>
      
      







[更新]ボタンをクリックすると、関数呼び出し



executeSoap($("#enumerate1CCatalogs").text(), processSuccess);







成功した場合、processSuccessハンドラーが呼び出されます



  function processSuccess(data, status, req) { var resultText = $(req.responseText).find("m\\:return").html(); result = eval(resultText); $("#catalogRecords").empty(); catalogsList = $("#catalogsList"); catalogsList.empty(); $(result).each(function (index, item) { var li = '<li catalog="' + item.name + '">' + item.synonym + '</li>'; catalogsList.append( $(li).addClass("catalogTitle") ); }); }
      
      







Webサービスはxmlを返します。m:戻りタグのコンテンツは重要です-JSONシリアル化。 eval呼び出しを介してJavaScriptオブジェクトに変換できます。 ハンドラーはディレクトリのリストをクリアし、カタログ属性を持つli-tagsを介して再度作成します。 各アイテムは、catalogTitleクラスに設定されます。



Webサービスはxmlを返します。m:戻りタグのコンテンツは重要です-JSONシリアル化。 eval呼び出しを介してJavaScriptオブジェクトに変換できます。 ハンドラーはディレクトリのリストをクリアし、カタログ属性を持つli-tagsを介して再度作成します。 各アイテムは、catalogTitleクラスに設定されます。



同様に、すべてのコントロールのクリックが処理されます。 ディレクトリをクリックすると、文字とデータが消去され、文字が補充されます。 文字をクリックすると、ディレクトリからデータが補充されます。 「text / 1c」タイプのスクリプトブロック内のコードは、1Cでコードを処理します。

アプリケーションは次のようになります。



例の外観



IEブラウザーでの未解決の承認の問題





IEに認証の問題があります。 IE 8/9では、他のブラウザでも同じ方法で基本認証の問題を解決することはできませんでした。



Internet Explorerを介したアクセスエラー

IEでは、Ajaxはuser / password-$ .ajaxプロパティを使用して機能しません。 FFおよびChromeではすべて正常に動作します。 何らかの理由で、IEの場合、ヘッダーはサーバーに送信されません



Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==





誰かが理由と回避方法を知っているなら、コメントに書いてください。



結論





提案されたSOAPベースのアプローチには、十分な数のJavaScriptコードが伴うため、単純なタスクに対して存在する権利があります。 おそらく将来的には、JavaScriptフレームワークを作成して、アプリケーションの作成プロセスを簡素化することが可能になるでしょう。



この方法の開発者は、自分でセキュリティに責任を負います。 記録時に入力パラメーターを確認する必要があります。クライアントから送信された任意のスクリプトの起動を許可しないでください。 この記事では、例として任意のコード実行を示します。 任意のクエリの実行を統合できますが、これはSQLインジェクションの危険性と関連しています。



1CのネイティブAPIの外部コンポーネントは、この環境では機能しません。 これは、機器のドライバーの作成に関する問題をさらに解決する必要があることを意味します。



ウェブサイトの例: web-site.zip(81.76 kb)



All Articles