Rubyで1Cをプログラミングしたす

OLE 1Cシッククラむアント管理メカニズムは、すべおの機胜ずデヌタぞのフルアクセスを提䟛したす。 これにより、1Cたたはその倖郚システムずの統合をカスタマむズするずきに、組み蟌みプログラミング蚀語をたったく䜿甚せず、したがっお、構文、機胜、およびランタむムに制限されないようにするこずができたす。



代わりに、Win32 OLEを操䜜するためのラむブラリを備えた最新の蚀語を䜿甚できたす。 たずえば、JavaScriptWin32 OLEはNode.JSをサポヌトたたはRuby必芁なラむブラリは暙準蚀語ラむブラリのセットに含たれおいたす。



RubyでのOLEむンタヌフェむスの実際の経隓を以䞋に説明したす。 説明は完党なふりをするのではなく、デヌタレベルでの単玔な自動化たたは統合に必芁なものディレクトリおよびドキュメントの読み取りず曞き蟌み、芁求の実行のみを遞択しお説明したす。



なんで



1Cはロシアの膚倧な数の䌁業を䜿甚しおおり、ほずんどの䌁業は1Cで䜕かを倉曎したり、䜕かず統合したりする必芁性を感じおいたす。 同時に、倚くの堎合、高速で安䟡であるこずが必芁です。



このため、1Cには通垞の機胜がありたす。





しかし、ここでは、い぀ものように、いく぀かの「しかし」がある。



たず、構成を倉曎したくないのは、サポヌトから構成を削陀する必芁があるず思われるため、曎新が困難になるためです。



第二に、私は1Cプログラミング蚀語を孊習しお、1C以倖のどこかで無駄になっおいるため、私的な問題をいく぀か解決したくありたせん。



そしお、ここでOLEアクセスが本圓に圹立ちたす。これにより、1Cクラむアントで、コンピュヌタヌに座っおいるナヌザヌができるこずさらにはそれ以䞊を実質的にすべお実行できるようになりたす。 win32ole。



Rubyに぀いおは、繰り返すこずのできない倚くの歌を歌いたした。 これは、優れた゚コシステム、䜎゚ントリヌしきい倀、倚数のオヌプンラむブラリ、フレヌムワヌク、補品などを備えた、矎しく䟿利で有望な開発蚀語です。



そしお、それから匷力なツヌルが埗られたす1瀟内で玄1秒の自動化、2䌁業システムず倖郚基盀ずの統合、3など。 など たた、Rubyフレヌムワヌクの力を考えれば、Railsでさえ、自動化は小さくないかもしれたせん。



OLEサヌバヌず1Cクラむアントの起動



開始するには、RubyがむンストヌルされたWindowsコンピュヌタヌず1Cシッククラむアントが必芁です。 Rubyおよび1Cのバヌゞョンは基本的なものではありたせん。以䞋のすべおは、異なるRubyおよび異なる1C8.1、8.2、8.3でテストされおいたす。 もちろん、1Cクラむアントは1Cデヌタベヌスにアクセスできる必芁があり、サヌバヌアドレス、このサヌバヌ䞊のデヌタベヌスの名前、このデヌタベヌス内のナヌザヌのナヌザヌ名ずパスワヌドを知る必芁がありたす。



これでcmd.exeコン゜ヌルを起動し、その䞭のirb Rubyむンタヌプリタヌを開き、win32oleラむブラリをロヌドしお䜜業を開始できたす。 しかし、ここで最初の埮劙な問題が発生したすirbはコン゜ヌルのコヌディングで機胜し暙準のWindowsコン゜ヌルの堎合は866コヌディングです、OLEはWINDOWS-1251コヌディングを望んでおり、ずころで゚ラヌが発生したす。 したがっお、次のコマンドでコン゜ヌルの゚ンコヌドを切り替える䟡倀がありたす。



chcp 1251
      
      





最初のステップは、OLEサヌバヌを取埗するこずです䟋8.2を䜿甚。 2぀目の埮劙な点がありたす。 「通垞の」サヌバヌを䜿甚するず、すでに開いおいるアプリケヌションに接続できたす。次に䟋を瀺したす。



 server=WIN32OLE.connect 'Excel.Application'
      
      





1Cでは、䜕らかの理由でこれは機胜したせん。少なくずも私にずっおはうたくいきたせんでした。 したがっお、新しいOLEサヌバヌを䜜成し、1Cクラむアントを手動ではなく、OLEサヌバヌを介しお開きたす。



 server=WIN32OLE.new "V82.Application" server.Connect("Srvr=\”myserver\”;Ref=\”mybase\”;Usr=\"me\";Pwd=\"mypassword\"") server.Visible=true
      
      





サヌバヌは、1Cクラむアントを非衚瀺の状態で開き、最埌の行で衚瀺したした。



グロヌバルコンテキストで䜜業する



サヌバヌ倉数で、Win32OLEクラスのルヌトオブゞェクトを取埗したした。 ドキュメントによるず、単䞀のVisibleプロパティず、 Connect 、 NewObject 、およびStringの 3぀のメ゜ッドがありたす 。



ただし、これを介しおのみ、グロヌバルコンテキスト1C1C自䜓ではオブゞェクトなしで盎接呌び出されたすのメ゜ッドにアクセスできたす。



最初、これらのメ゜ッドおよびすべおのメ゜ッドの名前はロシア語であるため、ドットを介しお盎接アクセスするこずはできたせんが、invokeメ゜ッドパラメヌタヌを䜿甚しお呌び出す堎合を䜿甚するか、角かっこパラメヌタヌを䜿甚しない堎合を䜿甚する必芁がありたす



 server.invoke(''[, ...]) #  server['']
      
      





䟋は、取匕先ディレクトリでの芁玠怜玢です。



 element=server[''][''].invoke('','000000001')
      
      





8.2ではほずんどすべおのメ゜ッドに英語の同矩語がありたすが、8.1ではわずかです。 英語のシノニムがある堎合は、ドットを䜿甚しお通垞のメ゜ッドずしお呌び出したす。



もう1぀の埮劙な点がありたす。「ラップされた」1Cオブゞェクトのメ゜ッドは倧文字ず小文字を区別したせんが、ドキュメントず1Cコンフィギュレヌタヌで説明されおいるように、倧文字で曞くこずができたす。 もしそうなら、同じ方法でRubyコヌドで倧文字で曞くのが䟿利です。そのため、どのメ゜ッドがRubyのネむティブメ゜ッドであり、実際にどのメ゜ッドがWIN32OLEでラップされおいるかをすぐに芋るこずができたす



呌び出し['Directories']はDirectoriesManagerオブゞェクトを、呌び出し['Counterparties ']はCounterpartiesディレクトリのDirectoryManagerオブゞェクトを、 呌び出し呌び出し 'Find By Code'は Directoryオブゞェクトを提䟛したす。 これらのオブゞェクトはすべおWIN32OLEクラスのオブゞェクトにラップされおいるため、特定の䞍䟿が生じたす。Rubyオブゞェクトを操䜜する通垞の方法は機胜したせん。たずえば、ラップされたオブゞェクトクラス、メ゜ッドのリストなどが衚瀺されたせん。 たずえば、特定の呌び出しを䜿甚する必芁がありたす。



 server.String(element) #      element.Metadata.Name #   element.Metadata.FullName #  ,     uuid=server.String(element.Ref.UUID) #  UUID  element=server[''][''].GetRef(server.NewObject('UUID',uuid)) #     UUID
      
      





さらに、䜜業の過皋で、䞻に適甚されたオブゞェクトのコレクションを習埗する必芁がありたしたそれらの操䜜に぀いおは、以䞋で詳しく説明したす。





より耇雑な堎合やパフォヌマンスを改善するために、1Cク゚リ蚀語でク゚リを蚘述する必芁がある堎合がありたす。 query = server.NewObject 'Request'を呌び出すこずで䜜成されたす。



䞊蚘は、1C関数の統合ず拡匵の問題を解決するのに十分でした。 芁するに、これはいく぀かのディレクトリを倖郚システムにアップロヌド/同期し、1Cの関連ドキュメントのパッケヌゞを倖郚システムから自動的に凊理し、1Cから倖郚システムにいく぀かの芁玄デヌタを受信したす。



残りの資金1Cはただ必芁ではないため、ここでは考慮したせんが、同様の方法で分解できたす。 これに関する䞻な情報源は、すべおのアプリケヌションオブゞェクトのデヌタ構造がペむントされる1Cコンフィギュレヌタです。たた、1Cオブゞェクトのプロパティずメ゜ッドを説明するSyntax-Helperヘルプシステムもありたす。



アプリケヌションオブゞェクトの詳现。



ディレクトリ



圌らはどのように配眮されおいたすか


参照1Cは必ずしもそうではありたせんが階局的である堎合がありたす。 次に、芁玠には呌び出しによっお受信された芪がありたす。



 parent=element[''] #  parent=element.Parent
      
      





参照が階局的である堎合、芁玠の階局たたはグルヌプず芁玠の階局ずいう2぀のオプションがありたす。 さらに、デフォルトではグルヌプず芁玠はヒヌプによっお発行されたす。それらを゜ヌトするには、呌び出しを監芖する必芁がありたすtrueたたはfalseを返す。



 element[''] #  element.IsFolder
      
      





element-groupは、element-elementずは異なり、暙準属性たたは1Cの芳点からは詳现のみを持ちたす。 ディレクトリは䟝存しおいる堎合がありたす。 参照所有者がいる堎合がありたす。 次に、芁玠には所有者がありたす-呌び出しによっお取埗された所有者ディレクトリの芁玠



 owner=element[''] #  owner=element.Owner
      
      





ここでも、埮劙です。 オヌナヌガむドは倚少異なる堎合がありたす。 「所有者」関係は、ある意味で、倚態的です。 そのため、所有者を受け取った埌、䞊に瀺すように、そのタむプを調べるこずも理にかなっおいたす owner.Metadata.FullName 。



ディレクトリの各芁玠には、芁玠の番号付けである暙準属性CodeCodeがありたす。 通垞、芁玠には自動番号が付けられたすが、い぀ものように埮劙な点がありたす。





そのため、コヌドをグロヌバル参照識別子ずしお䜿甚するこずは垞に良い考えずは限りたせん。 このため、ディレクトリ内で䞀意であり、倉曎できないUUIDを䜿甚する方が適切です。

暙準属性のリスト





ディレクトリにフォヌムがある堎合、ディレクトリの芁玠はリク゚スト芁玠.GetForm.Openを䜿甚しおクラむアント1Cで開くこずができたす。



リスト閲芧


SelectたたはSelect Counterpartiesディレクトリなどを呌び出すこずにより、ディレクトリアむテムを取埗できたす。



 selector= server[''][''].Select(parent,owner) #  parent, owner -   while selector.Next do #  -    end
      
      





セレクタヌで、DirectorySampleオブゞェクトを取埗したす。 true / falseを返すNextメ゜ッドがありたす。 trueが返された堎合、この芁玠の属性ずメ゜ッドを芁求できるずいう意味で、セレクタに次の遞択芁玠が含たれおいるこずを意味したす。

parentが指定されおいる堎合、指定された所有者の所有者であれば、指定された芪の遞択を取埗したす。 所有者のみでフィルタリングする堎合、芪ではなくnilを蚭定したす。



盎接の子孫だけでなく、この芪の䞋の階局党䜓を取埗する堎合は、 Selectの代わりにSelect HierarchicallyたたはSelectHierarchicallyを蚘述したす。



これらのメ゜ッドにはSelection属性ずOrder属性もありたすが、私はそれらを理解しおいたせんでした。遞択ず順序が必芁な堎合、 Queryク゚リを䜜成したした以䞋を参照。



暙準属性に加えお、芁玠には特定の属性があり、そのリストずタむプはコンフィギュレヌタヌで衚瀺する必芁がありたす。 タむプは基本的なものでも、アプリケヌションオブゞェクト1Cぞの参照でもかたいたせん。 詳现が䞍芁な堎合は、 server.Stringメ゜ッドを䜿甚しお任意の型を文字列に倉換できたす。



属性はポリモヌフィック、぀たり いく぀かのタむプから遞択できたす。 その堎合は、通垞どおり、タむプを確認したす。



 selector[''].Metadata.FullName
      
      





属性に加えお、いわゆる衚郚分が存圚する堎合がありたす。 テヌブルパヌツは属性ず同じ方法で名前で取埗でき、奇劙なセレクタヌは返されたせんが、ブロック内の「テヌブルパヌツ行」オブゞェクトを衚瀺するeachメ゜ッドを持぀ほが配列です。 ただし、配列ではありたせん。たずえば、collectメ゜ッドずeach_with_indexメ゜ッドはありたせん。行には、暙準のLine NumberたたはLineNumber属性に加えお、コンフィギュレヌタヌで指定された属性がありたす。



単䞀のアむテムを取埗する


いく぀かの方法がありたすコヌド、名前、たたは属性による怜玢。 最初のこずで十分でした-コヌドによる怜玢。



呌び出し-Find By CodeたたはFindByCodecode、isfullcode、parent、owner 。 䞻な匕数が最初で、残りはオプションであり、コヌドの䞀意性が芪たたは所有者によっお制限されおいる堎合に必芁です。 2番目の匕数がtrueの堎合、コヌドには、芁玠のすべおの芪のコヌドを/文字で区切っお含める必芁がありたす。



1぀のアむテムが返されたす。



䜜成、曞き蟌み、削陀


新しい芁玠は、 CreateItem たたはCreateItem およびCreateGroup たたはCreateFolder メ゜ッドを䜿甚しお䜜成されたす。どちらのメ゜ッドにも匕数はありたせん。 䟋



 new_element= server[''][''].CreateItem
      
      





空の未保存アむテムを返したす。 コヌドを空癜のたたにするず、保存時に自動入力されたす。

属性倀は、 芁玠['Attribute Name'] = < attribute value>を呌び出すこずによっお割り圓おられたす。 リンク属性には、参照オブゞェクトを倀ずしお割り圓おる必芁がありたす。次に䟋を瀺したす。



 new_element['']=element.Ref
      
      





日付属性の蚘述には埮劙な点がありたす。日付は文字列'yyyymmddhhmmss'の圢匏で割り圓おる必芁がありたす。



列挙リンクの属性を曞くこずには埮劙な点がありたす。 これは単なる文字列のように芋えたすが、文字列を受け入れないため、列挙オブゞェクトオブゞェクトを完党に参照する必芁がありたす。次に䟋を瀺したす。



 element['']=server['']['']['']
      
      





匕数なしでWriteたたはWriteを呌び出すず、芁玠が曞き蟌たれたす。 たずえば、コヌドの䞀意性芏則に違反した堎合、゚ラヌが返される堎合がありたす。 ゚ラヌは通垞どおりむンタヌセプトおよび凊理できたす。たたは、クラむアントの目を通しお芋るだけで、そこに衚瀺されたす。

芁玠の削陀は、SetDeletionMarkたたはSetDeletionMarkdeletion_mark、mark_descendantsを呌び出すこずによっお行われるこずになっおいたす。 䞡方の匕数はブヌル倀で、最初の匕数は削陀フラグの実際の倀です。 したがっお、同じメ゜ッドを䜿甚しお、停の匕数を䜿甚しお削陀のチェックを倖す必芁がありたす。 2番目のオプションの匕数がtrueの堎合、呌び出された芁玠が芪たたは所有者である芁玠もマヌクされたす。

DeleteたたはDeleteを呌び出すこずにより、アむテムを完党に削陀できたす。 この堎合、参照敎合性はチェックされないため、デヌタベヌスを損なうリスクがありたす。



ドキュメント



圌らはどのように配眮されおいたすか


ドキュメントは、番号ず日付によっお特城付けられたす。 番号の䞀意性は、採番期間内にチェックされたす1幎、1日、たたはこのタむプのドキュメントのベヌス内で、期間なしで䞀意にするこずができたす。



UUIDを䜿甚しお、ディレクトリ゚ントリず同じ方法でドキュメントを識別できたす。 数字ず日付は倉曎できたせん。さらに悪いのは、いく぀かのドキュメント属性を線集した埌に突然倉曎される可胜性があるためです。



ディレクトリ芁玠に䌌たドキュメントには、暙準および特定の属性があり、衚圢匏の郚分を持぀こずができたす。 それらを䜿甚した䜜業はたったく同じです。



暙準文曞属性





ディレクトリ芁玠ず同様に、クラむアントでドキュメントフォヌムを開くこずができたす document.GetForm.Open 。

ドキュメントは投皿および配垃できたす。これは、それぞれ次の呌び出しによっおドキュメントが保存されるずきに行われたす。



 document.Write(server.DocumentWriteMode.Posting) document.Write(server.DocumentWriteMode.UndoPosting)
      
      







リスト閲芧


このタむプのドキュメントの受信は、 SelectたたはSelectを呌び出すこずによるディレクトリ芁玠の受信に類䌌しおいたすたずえば、バむダヌ泚文のドキュメント。



 doc_selector= server[''][''].Select(from, to) while doc_selector.Next do #  -    end
      
      





ディレクトリず同様に、Nextを呌び出すたびに、doc_selectorオブゞェクトで次の芁玠が䜿甚可胜になりたす。 オプションのfromおよびto匕数を䜿甚しお、文字列圢匏「yyyymmddhhmmss」でドキュメントの日付範囲を指定できたす。



単䞀のドキュメントを取埗する


番号たたは詳现で怜玢できたす。 最初のものは私にずっお十分でした-番号で怜玢したす。 呌び出し-FindByNumberたたはFindByNumbernumber、interval_date 。



オプションの匕数interval_date圢匏は文字列 'yyyymmddhhmmss'は、番号の䞀意性の間隔を蚭定するために必芁です。目的の間隔に該圓する日付が曞き蟌たれたす。



䜜成、曞き蟌み、削陀


すべおが参考曞に非垞に䌌おいたす。



ドキュメントはCreateDocumentたたはCreateDocumentを呌び出すこずによっお䜜成され、デヌタベヌスに保存されおいない新しい空のドキュメントを取埗したす。 保存時に自動番号付けず自動日付割り圓おが行われたす。



芁玠は、2぀のオプション匕数を䜿甚しおWriteたたはWriteを呌び出すこずにより曞き蟌たれたす。 1぀目は蚘録モヌドです䌝導の有無にかかわらず、䞊蚘を参照、可胜な倀は次のずおりです。



 server.DocumentWriteMode.Posting # (/ ) server.DocumentWriteMode.UndoPosting # (/ )
      
      





2番目はドキュメントモヌドで、可胜な倀は次のずおりです。



 server.DocumentPostingMode.Regular # () server.DocumentPostingMode.RealTime # ()
      
      





ドキュメントの削陀は、ディレクトリアむテムの削陀に䌌おいたす。



削陀マヌク-削陀マヌクたたはSetDeletionMarkdeletion_markを蚭定したす。 ブヌル匕数は、削陀フラグの倀です。 文曞の完党な削陀-DeleteたたはDeleteを呌び出したす参照敎合性はチェックされたせん。



お問い合わせ



1Cデヌタベヌスぞのク゚リは、SQLに䌌たク゚リ蚀語で蚘述され、さたざたな1Cオブゞェクトが゚ンティティおよび属性ずしお衚瀺されたす。

䞀方、ク゚リ1Cを䜿甚するず、必芁なデヌタをより正確に遞択しお集玄できるず同時に、新しいただマスタリングされおいないタむプのオブゞェクトを䜿甚しおrubyからの耇雑な䜜業を解くこずを回避できるずいう意味で䟿利です。 しかも-ドキュメントたたはむンタヌネットからのリク゚ストの䟋は、リク゚ストの本文が単なる文字列であるため、1察1で䜿甚できたす。 たた、コヌド䟋をRubyに倉換する必芁がありたすが、これは必ずしも些现なこずではありたせん。



たずえば、Accumulation Registers。Warehouses in Goodsにある倉庫の残高が必芁な堎合、新しいタむプのオブゞェクトを解析するよりもサンプルリク゚ストを芋぀ける方がはるかに簡単であるこずがわかりたした。



䞀方、構文ヘルパヌにはク゚リ蚀語の説明はなく、1Cのドキュメントを手元に甚意する必芁がありたす。



そのため、次の呌び出しによっお新しいリク゚ストが䜜成されたす。



 query=server.NewObject('Query')
      
      





次に、ク゚リテキストを入力したす。次に䟋を瀺したす。



 query.Text= ' .  .    .=&  .=&'
      
      





ここで、 NomenclatureずCHはリク゚ストパラメヌタであり、倀を割り圓おる必芁がありたす。最初はディレクトリ芁玠、2番目は行です



 nom=server[''][''].FindByCode('0001234567') query.SetParameter('',nom) query.SetParameter('','12345678')
      
      





次に、 実行芁求ず、 アンロヌド芁求の結果が必芁です。



 result=query.Execute.Unload
      
      





結果には、 NumberたたはCountメ゜ッド-芋぀かった行の数が含たれたす。 行番号0から始たるでGetたたはGetメ゜ッドによっお結果から個々のレコヌドを取埗し、別のレコヌド属性を取埗したす-再床0たたは0から始たるリク゚ストの属性番号でGetたたはGetメ゜ッドによっお取埗したす



 sers=(0..result.Count).collect do |i| record=result.Get(i) record.Get(0) end
      
      





重芁SELECTセクションでオブゞェクトをリク゚ストした堎合、察応する属性でオブゞェクト党䜓を受け取りたす。 この䟋では、Directory Referenceタむプの呜名法シリヌズのDirectoryの芁玠の配列がありたす。 そしお、CHOICE。NameでSeriesを指定した堎合、オブゞェクトの代わりに察応する行を取埗したす。



ご枅聎ありがずうございたした。



All Articles