1C Web クラむアントに぀いお

1C:Enterprise テクノロゞヌの優れた機胜の 5 ぀は、マネヌゞド フォヌム テクノロゞヌを䜿甚しお開発されたアプリケヌション ゜リュヌションが、Windows、Linux、MacOS X のシン (実行可胜) クラむアントず XNUMX ぀のブラりザヌの Web クラむアントの䞡方で起動できるこずです。 Chrome、Internet Explorer、Firefox、Safari、Edge などすべおを、アプリケヌションの゜ヌス コヌドを倉曎するこずなく利甚できたす。 さらに、倖郚から芋るず、シン クラむアントずブラりザのアプリケヌションは機胜し、芋た目もほが同じです。
10 個の違いを芋぀けたす (カットの䞋に 2 枚の写真):

Linux 䞊のシン クラむアント りィンドり:

1C Web クラむアントに぀いお

Web クラむアント (Chrome ブラりザヌ) の同じりィンドり:

1C Web クラむアントに぀いお

なぜ Web クラむアントを䜜成したのでしょうか? やや情けない蚀い方をすれば、時間が私たちにそのような課題を課したのです。 むンタヌネット䞊での䜜業は、長い間、ビゞネス アプリケヌションの前提条件でした。 たず、シン クラむアントにむンタヌネット経由で動䜜する機胜を远加したした (ちなみに、競合他瀟の䞀郚はこれでやめたしたが、他の競合他瀟は逆にシン クラむアントを攟棄し、Web クラむアントの実装に限定したした)。 私たちは、ナヌザヌに最適なクラむアント オプションを遞択する機䌚を提䟛するこずにしたした。

1C Web クラむアントに぀いお

シン クラむアントに Web ベヌスの機胜を远加するこずは、クラむアント/サヌバヌ アヌキテクチャを完党に倉曎する倧芏暡なプロゞェクトでした。 Web クラむアントの䜜成は、れロから始めるたったく新しいプロゞェクトです。

問題の定匏化

したがっお、プロゞェクトの芁件は次のずおりです。Web クラむアントはシン クラむアントず同じこずを実行する必芁がありたす。぀たり、次のずおりです。

  1. ナヌザヌむンタヌフェヌスを衚瀺する
  2. 1C蚀語で曞かれたクラむアントコヌドを実行する

1C のナヌザヌ むンタヌフェむスはビゞュアル ゚ディタヌで蚘述されおいたすが、芁玠をピクセルごずに配眮するこずなく宣蚀的に蚘述されおいたす。 ボタン、入力フィヌルド (テキスト、数倀、日付/時刻)、リスト、衚、グラフなど、玄 XNUMX 皮類のむンタヌフェむス芁玠が䜿甚されたす。

1C 蚀語のクラむアント コヌドには、サヌバヌ呌び出し、ロヌカル リ゜ヌス (ファむルなど) の操䜜、印刷などを含めるこずができたす。

シン クラむアント (Web 経由で䜜業する堎合) ず Web クラむアントは䞡方ずも、同じ Web サヌビス セットを䜿甚しお 1C アプリケヌション サヌバヌず通信したす。 もちろん、クラむアントの実装は異なりたす。シン クラむアントは C++ で蚘述され、Web クラむアントは JavaScript で蚘述されたす。

歎史を少し

Web クラむアント プロゞェクトは 2006 幎に (平均) 5 人のチヌムで始たりたした。 プロゞェクトの特定の段階では、開発者が特定の機胜 (スプレッドシヌト ドキュメント、図など) の実装に関䞎したした。 原則ずしお、これらはシン クラむアントでこの機胜を実行したのず同じ開発者でした。 それらの。 開発者は、以前に C++ で䜜成したコンポヌネントを JavaScript で曞き盎したした。

XNUMX ぀の蚀語の間には抂念的な倧きな違いがあるため、私たちは最初から、C++ シン クラむアント コヌドを JavaScript Web クラむアントに自動的に (郚分的であっおも) 倉換するずいう考えを拒吊したした。 Web クラむアントは JavaScript で最初から䜜成されたした。

プロゞェクトの最初の反埩では、Web クラむアントは組み蟌み 1C 蚀語のクラむアント コヌドを JavaScript に盎接倉換したした。 シン クラむアントの動䜜は異なりたす。組み蟌み 1C 蚀語のコヌドがバむトコヌドにコンパむルされ、このバむトコヌドがクラむアントで解釈されたす。 その埌、Web クラむアントも同様のこずを行うようになりたした。第䞀に、パフォヌマンスが向䞊し、第二に、シン クラむアントず Web クラむアントのアヌキテクチャを統合できるようになりたした。

Web クラむアントをサポヌトする 1C:Enterprise プラットフォヌムの最初のバヌゞョンは 2009 幎にリリヌスされたした。 圓時の Web クラむアントは、Internet Explorer ず Firefox の 2 ぀のブラりザをサポヌトしおいたした。 圓初の蚈画には Opera のサポヌトが含たれおいたしたが、圓時は Opera のアプリケヌション終了ハンドラヌに克服できない問題があったため (アプリケヌションが終了しおいるこずを 100% 確実に远跡するこずができず、その時点でアプリケヌションからの切断手順を実行するこずはできたせんでした)。 1C アプリケヌション サヌバヌ) などの蚈画は断念する必芁がありたした。

プロゞェクトの構造

合蚈で、1C:Enterprise プラットフォヌムには JavaScript で曞かれた 4 ぀のプロゞェクトがありたす。

  1. WebTools – 他のプロゞェクトで䜿甚される共有ラむブラリ (これも含たれおいたす) Google Closure ラむブラリ).
  2. 制埡芁玠 フォヌマットされたドキュメント (シンクラむアントずWebクラむアントの䞡方でJavaScriptで実装されたす)
  3. 制埡芁玠 プラハ (シンクラむアントずWebクラむアントの䞡方でJavaScriptで実装されたす)
  4. りェブクラむアント

各プロゞェクトの構造は、Java プロゞェクト (たたは .NET プロゞェクトのどちらか近い方) の構造に䌌おいたす。 名前空間があり、各名前空間は別のフォルダヌにありたす。 フォルダヌ内にはファむルず名前空間クラスがありたす。 Web クラむアント プロゞェクトには玄 1000 個のファむルがありたす。

構造的に、Web クラむアントは次のサブシステムに倧別されたす。

  • マネヌゞド クラむアント アプリケヌション むンタヌフェむス
    • 䞀般的なアプリケヌション むンタヌフェむス (システム メニュヌ、パネル)
    • 管理フォヌムのむンタヌフェむス。特に、玄 30 個のコントロヌル (ボタン、テキスト、数倀、日付/時刻などのさたざたなタむプの入力フィヌルド、衚、リスト、グラフなど) が含たれたす。

  • 開発者がクラむアントで利甚できるオブゞェクト モデル (マネヌゞド むンタヌフェむス オブゞェクト モデル、デヌタ レむアりト蚭定、条件付きスタむルなど、合蚈 400 皮類以䞊)
  • 内蔵 1C 蚀語のむンタプリタ
  • ブラりザ拡匵機胜 (JavaScript でサポヌトされおいない機胜に䜿甚されたす)
    • 暗号化の操䜜
    • ファむルの操䜜
    • シン クラむアントず Web クラむアントの䞡方で䜿甚できる倖郚コンポヌネントのテクノロゞ

開発機胜

䞊蚘のすべおを JavaScript で実装するのは簡単ではありたせん。 おそらく 1C Web クラむアントは、JavaScript で曞かれた最倧のクラむアント偎アプリケヌションの 450.000 ぀であり、その行数は玄 XNUMX 行です。 私たちは、Web クラむアント コヌドでオブゞェクト指向のアプロヌチを積極的に䜿甚しおおり、これにより、このような倧芏暡なプロゞェクトでの䜜業が簡玠化されたす。

クラむアント コヌドのサむズを最小限に抑えるために、最初は独自の難読化ツヌルを䜿甚し、プラットフォヌム バヌゞョン 8.3.6 (2014 幎 XNUMX 月) からは、 Google Closure コンパむラ。 䜿甚の効果を数字で瀺したす – 難読化埌の Web クラむアント フレヌムワヌクのサむズ:

  • 独自の難読化ツヌル – 1556 kb
  • Google クロヌゞャ コンパむラ – 1073 kb

Google Closure Compiler を䜿甚するず、独自の難読化ツヌルず比范しお Web クラむアントのパフォヌマンスが 30% 向䞊したした。 さらに、アプリケヌションによっお消費されるメモリ量が 15  25% 枛少したした (ブラりザによっお異なりたす)。

Google Closure Compiler はオブゞェクト指向コヌドず非垞にうたく連携するため、Web クラむアントの効率が可胜な限り高くなりたす。 Closure Compiler は、次のような良いこずをしおくれたす。

  • プロゞェクトのビルド段階での静的型チェック (コヌドが JSDoc アノテヌションでカバヌされおいるこずを確認したす)。 その結果、静的型付けが行われ、C++ での型付けに非垞に近いレベルになりたす。 これは、プロゞェクトのコンパむル段階でかなりの割合の゚ラヌを怜出するのに圹立ちたす。
  • 難読化によるコヌドサむズの削枛
  • たずえば、次のような実行コヌドのさたざたな最適化。
    • むンラむン関数の眮換。 JavaScript での関数の呌び出しはかなり負荷の高い操䜜であり、頻繁に䜿甚される小さなメ゜ッドをむンラむンで眮換するこずで、コヌドが倧幅に高速化されたす。
    • コンパむル時に定数をカりントしたす。 匏が定数に䟝存しおいる堎合、定数の実際の倀が代入されたす。

Webクラむアント開発環境ずしおWebStormを䜿甚しおいたす。

コヌド分​​析には以䞋を䜿甚したす ゜ナヌキュヌブ、静的コヌド アナラむザヌを統合したす。 アナラむザヌを䜿甚しおJavaScript゜ヌスコヌドの品質䜎䞋を監芖し、その防止に努めたす。

1C Web クラむアントに぀いお

私たちはどのような問題を解決したしたか?

プロゞェクトの実斜䞭に、解決しなければならない興味深い問題が数倚く発生したした。

サヌバヌずのデヌタ亀換およびりィンドり間でのデヌタ亀換

゜ヌス コヌドの難読化によりシステムの動䜜が劚げられる堎合がありたす。 Web クラむアントの実行可胜コヌドの倖郚にあるコヌドは、難読化により、実行可胜コヌドが予期するものずは異なる関数名やパラメヌタヌ名を持぀堎合がありたす。 私たちの倖郚コヌドは次のずおりです。

  • デヌタ構造の圢匏でサヌバヌから取埗されるコヌド
  • 別のアプリケヌションりィンドりのコヌド

サヌバヌず察話する際の難読化を避けるために、 @expose タグを䜿甚したす。

/**
 * @constructor
 * @extends {Base.SrvObject}
 */
Srv.Core.GenericException = function ()
{
    /**
     * @type {string}
     * @expose
     */
    this.descr;

    /**
     * @type {Srv.Core.GenericException}
     * @expose
     */
    this.inner;

    /**
     * @type {string}
     * @expose
     */
    this.clsid;

    /**
     * @type {boolean}
     * @expose
     */
    this.encoded;
}

たた、他のりィンドりず察話する際の難読化を避けるために、いわゆる゚クスポヌトされたむンタヌフェむス (すべおのメ゜ッドが゚クスポヌトされるむンタヌフェむス) を䜿甚したす。

/**
 * ЭкспПртОруеЌый ОМтерфейс кПМтрПла DropDownWindow
 *
 * @interface
 * @struct
 */
WebUI.IDropDownWindowExp = function(){}

/**
 * ПереЌещает выЎелеМОе Ма 1 впереЎ ОлО МазаЎ
 *
 * @param {boolean} isForward
 * @param {boolean} checkOnly
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.moveMarker = function (isForward, checkOnly){}

/**
 * ПереЌещает выЎелеМОе в МачалП ОлО кПМец
 *
 * @param {boolean} isFirst
 * @param {boolean} checkOnly
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.moveMarkerTo = function (isFirst, checkOnly){}

/**
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.selectValue = function (){}

仮想 DOM が䞻流になる前に䜿甚しおいたした)

耇雑な Web UI を扱うすべおの開発者ず同様に、私たちも DOM が動的なナヌザヌ むンタヌフェむスの操䜜にはあたり適しおいないこずにすぐに気づきたした。 ほがすぐに、UI での䜜業を最適化するために Virtual DOM の類䌌物が実装されたした。 むベント凊理䞭、すべおの DOM 倉曎はメモリに保存され、すべおの操䜜が完了した堎合にのみ、蓄積された倉曎が DOM ツリヌに適甚されたす。

Webクラむアントの最適化

Web クラむアントの動䜜を高速化するために、ブラりザの暙準機胜 (CSS など) を最倧限に掻甚するように努めおいたす。 したがっお、フォヌム コマンド パネル (アプリケヌションのほがすべおのフォヌムに配眮されおいたす) は、CSS に基づく動的レむアりトを䜿甚しおブラりザ ツヌルのみを䜿甚しおレンダリングされたす。

1C Web クラむアントに぀いお

テスト

機胜およびパフォヌマンスのテストには、独自のツヌル (Java および C++ で曞かれた) ず、その䞊に構築された䞀連のテストを䜿甚したす。 Selenium .

私たちのツヌルは汎甚性があり、ほがすべおのりィンドり プログラムをテストできるため、シン クラむアントず Web クラむアントの䞡方のテストに適しおいたす。 このツヌルは、1C アプリケヌション ゜リュヌションを起動したナヌザヌのアクションをスクリプト ファむルに蚘録したす。 同時に、画面の䜜業領域暙準の画像が蚘録されたす。 Web クラむアントの新しいバヌゞョンを監芖する堎合、スクリプトはナヌザヌの参加なしで再生されたす。 どの段階でもスクリヌンショットが基準のものず䞀臎しない堎合、テストは䞍合栌ずみなされ、その埌、品質専門家が調査を実斜しお、これが゚ラヌなのか、それずもシステムの動䜜の蚈画された倉曎なのかを刀断したす。 蚈画された動䜜の堎合、暙準は自動的に新しいものに眮き換えられたす。

このツヌルは、アプリケヌションのパフォヌマンスも最倧 25 ミリ秒の粟床で枬定したす。 堎合によっおは、スクリプトの䞀郚をルヌプしお (たずえば、泚文入力を数回繰り返すなど)、時間の経過に䌎う実行時間の䜎䞋を分析したす。 すべおの枬定結果は分析のためにログに蚘録されたす。

1C Web クラむアントに぀いお
圓瀟のテストツヌルずテスト察象のアプリケヌション

私たちのツヌルず Selenium は盞互に補完したす。 たずえば、いずれかの画面䞊のボタンの䜍眮が倉曎された堎合、Selenium はこれを远跡しない可胜性がありたすが、ツヌルはそれを認識したす。 スクリヌンショットず暙準のスクリヌンショットをピクセルごずに比范したす。 このツヌルは、キヌボヌドたたはマりスからの入力の凊理に関する問題を远跡するこずもできたす。これは、たさにそれが再珟されるためです。

䞡方のツヌル (私たちのツヌルず Selenium) のテストでは、アプリケヌション ゜リュヌションの兞型的な䜜業シナリオが実行されたす。 テストは、1C:Enterprise プラットフォヌムの毎日のビルド埌に自動的に開始されたす。 スクリプトが (以前のビルドず比范しお) 遅い堎合は、速床䜎䞋の原因を調査しお解決したす。 私たちの基準は単玔です。新しいビルドは以前のビルドよりも遅く動䜜しないはずです。

開発者はさたざたなツヌルを䜿甚しお速床䜎䞋むンシデントを調査したす。 䞻に䜿甚される Dynatrace AJAX ゚ディション 補䜜䌚瀟 ダむナトレヌス。 以前のビルドず新しいビルドで問題のある操䜜の実行ログが蚘録され、ログが分析されたす。 同時に、単䞀操䜜の実行時間 (ミリ秒単䜍) は決定的な芁玠ではない可胜性がありたす。ガベヌゞ コレクションなどのサヌビス プロセスはブラりザヌで定期的に起動され、関数の実行時間ず重なっお画像が歪む可胜性がありたす。 この堎合、より関連性の高いパラメヌタは、実行された JavaScript 呜什の数、DOM 䞊のアトミック操䜜の数などです。 新しいバヌゞョンで同じスクリプト内の呜什/操䜜の数が増加した堎合、これはほずんどの堎合、修正が必芁なパフォヌマンスの䜎䞋を意味したす。

たた、パフォヌマンス䜎䞋の理由の XNUMX ぀は、Google Closure Compiler が䜕らかの理由で関数のむンラむン眮換を実行できなかった可胜性がありたす (たずえば、関数が再垰的たたは仮想であるため)。 この堎合、゜ヌスコヌドを曞き盎すこずで状況を修正しようずしたす。

ブラりザ拡匵機胜

アプリケヌション ゜リュヌションに JavaScript では利甚できない機胜が必芁な堎合は、ブラりザ拡匵機胜を䜿甚したす。

私たちの拡匵機胜は 3 ぀の郚分で構成されおいたす。 最初の郚分はいわゆるブラりザ拡匵機胜 (通垞は JavaScript で曞かれた Chrome および Firefox の拡匵機胜) で、1 番目の郚分 (必芁な機胜を実装するバむナリ拡匵機胜) ず察話したす。 Windows、Linux、MacOS 甚の 1 ぀のバヌゞョンのバむナリ拡匵機胜を䜜成しおいるこずに泚意しおください。 バむナリ拡匵は XNUMXC:Enterprise プラットフォヌムの䞀郚ずしお提䟛され、XNUMXC アプリケヌション サヌバヌ䞊にありたす。 Web クラむアントから初めお呌び出されたずきに、クラむアント コンピュヌタヌにダりンロヌドされ、ブラりザヌにむンストヌルされたす。

Safari で実行する堎合、拡匵機胜は NPAPI を䜿甚し、Internet Explorer で実行する堎合は、ActiveX テクノロゞを䜿甚したす。 マむクロ゜フト゚ッゞ はただ拡匵機胜をサポヌトしおいないため、その Web クラむアントは制限付きで動䜜したす。

さらなる発展

Web クラむアント開発チヌムのタスクの XNUMX ぀は、機胜のさらなる開発です。 Web クラむアントの機胜はシン クラむアントの機胜ず同䞀である必芁があり、すべおの新しい機胜はシン クラむアントず Web クラむアントの䞡方に同時に実装されたす。

その他のタスクには、アヌキテクチャの開発、リファクタリング、パフォヌマンスず信頌性の向䞊が含たれたす。 たずえば、方向性の XNUMX ぀は、非同期䜜業モデルぞのさらなる移行です。 珟圚、Web クラむアントの機胜の䞀郚は、サヌバヌずの察話の同期モデルに基づいお構築されおいたす。 非同期モデルは珟圚、ブラりザヌ (ブラりザヌに限らず) での関連性が高たっおおり、そのため、同期呌び出しを非同期呌び出しに眮き換えるこず (およびそれに応じおコヌドをリファクタリングするこず) によっお、Web クラむアントを倉曎する必芁がありたす。 非同期モデルぞの段階的な移行は、リリヌスされた゜リュヌションずその段階的な適応をサポヌトする必芁性によっお説明されたす。

出所 habr.com

コメントを远加したす