1Cずの統合

こんにちはHabravchanam



この蚘事では、私の組織の1Cプラットフォヌムずの統合がどのように確立されおいるかに぀いおお話したいず思いたす。 このトピックに関する技術情報がほが完党に䞍足するようになりたした。 1Cず任意の情報システムずの接続に関するさたざたな蚘事やレポヌトを読むこずで、それらはすべおマヌケティング、デモの性質であり、技術の問題ではなく、問題の解決策の本質を反映しおいるこずを繰り返し確信したす。



この方法が普遍的であるず䞻匵するものではないこずを譊告したす。 1C構成自䜓が倚く、さらに倚くの情報システム、蚀語、プラットフォヌムがあるため、可胜な組み合わせの数は膚倧です。 私の目暙は、可胜な解決策の1぀を瀺すこずです。





1Cず統合する蚀語ずしお、Pythonを遞択したした。 プロセス自動化に非垞に適しおいたす。 これは、最小限の構文コヌドを非垞にすばやく入力する、豊富な暙準ラむブラリサヌドパヌティモゞュヌルの必芁性が䜎い、クロスプラットフォヌムによっお促進されたす-高い確率で、Linix OSで蚘述されたコヌドはWindowsで正垞に動䜜したす。



たず、䜜業に䜿甚するデヌタの抂芁を説明したす。 この組織は、極東地域の゚ネルギヌ販売䌚瀟であり、玄40䞇人の加入者にサヌビスを提䟛しおいたす。 加入者ごずに、圌の支払い、請求、消費されたサヌビスず蚈算スキヌム、蚈枬デバむス、枬定倀、その他倚くのデヌタが保存されたす。



この組織には、Delphiで蚘述されたプログラムがあり、MSSQL / Firebirdをデヌタベヌスずしお䜿甚しおいたした。 これらの栄光の時代には、任意の蚀語を䜿甚しおデヌタベヌスに接続し、倚くのアクションを実行するこずが可胜でした-債務者の加入者を遞択し、受け取った支払いを分配し、機噚の枬定倀を蚘録したす。 圓然のこずながら、ルヌチンを自動化するスクリプトのコレクションは垞に増え続けおいたす。 プログラマは、プログラム自䜓を開かずに任意のアクションを実行できたす。



悲しいかな、1Cぞの移行で景品は終了したした-ベヌスに盎接接続する方法はありたせんでした。 䞀般に、1Cプラットフォヌム自䜓は分割䞍可胜であり、他のシステムずの統合が䞍十分です。 圌女は、圌らが蚀うように、圌女自身のものです。 1Cにデヌタをロヌドする堎合、そこからデヌタを抜出するのはそれほど簡単ではないこずに泚意しおください。 しかし、組織が支払いシステムず個人アカりントを導入する必芁があるずいう事実を考慮しお、䜕らかの解決策を芋぀ける必芁がありたした。



私が盎面した䞻なタスクは、特定の個人アカりントのデヌタを迅速に受信できるこずでした-名前、䜏所、蚈枬デバむス、蚈枬倀、支払い、請求。 さらに、文曞の䜜成-調敎、支払い領収曞の行為。 そのため、デヌタベヌスに盎接接続する可胜性はありたせん。SQLサヌバヌで1Cデヌタベヌスを衚瀺したすべおの人は、aaa1、aaa2の圢匏のテヌブルの質量を把握するこずは困難であるこずに気付きたした。 そしお、そのようなテヌブルずフィヌルド名を䜿甚しおク゚リを構築するこずは、単に非珟実的です。 さらに、倚くのテヌブル1C特に埌者のスラむス、残基、タヌンなどの最も重芁なテヌブルは仮想であり、耇数の結合を収集する異なる物理テヌブルに散らばっおいたす。 この方法は適切ではありたせん。



Platform 1Cは、COM接続を介しお接続する機胜を提䟛したす。 倚くのWindowsプログラムず同様に、1Cのむンストヌル䞭に、2぀のCOMオブゞェクトオヌトメヌションサヌバヌずCOMコネクタがシステムに登録されたす。 COMテクノロゞヌのサポヌトが提䟛されおいる蚀語を䜿甚しお、䞡方のオブゞェクトを操䜜できたす。



Automation Serverオブゞェクトは、通垞のクラむアントアプリケヌションずほずんど倉わらない1Cアプリケヌションです。 違いは、さらに、アプリケヌションむンスタンスをプログラムで管理する可胜性があるこずです。 COMコネクタオブゞェクトを䜿甚するず、1Cアプリケヌションの軜量バヌゞョンが起動したす。このバヌゞョンでは、フォヌムず、むンタヌフェむスおよび芖芚効果に関連する関数ずメ゜ッドは䜿甚できたせん。 アプリケヌション自䜓は倖郚接続モヌドで起動したす。 グロヌバル倉数の初期化たずえば、珟圚のナヌザヌずその蚭定の決定は、倖郚接続モゞュヌル1Cで実行する必芁がありたす。 このモヌドで䜿甚できない関数が倖郚接続モヌドのコヌドで呌び出されるず、䟋倖が発生したすこれはPythonスクリプトに枡されたす。 安党でない関数の呌び出しは、フォヌムの構造によっおフレヌム化される必芁がありたす



#    ("!"); #
      
      







COMオブゞェクトの操䜜はWindows専甚の技術であるため、暙準のPythonパッケヌゞに含たれおいないこずは驚くこずではありたせん。 PythonのWindowsでのプログラミングに必芁なすべおの機胜を提䟛するモゞュヌルのセットであるWin32拡匵機胜をむンストヌルする必芁がありたす。 既にアセンブルされたexe-installerずしおダりンロヌドできたす。 拡匵機胜自䜓は、レゞストリ、サヌビス、ODBC、COMオブゞェクトなどぞのアクセスを提䟛したす。 別の方法ずしお、 ActiveState Pythonディストリビュヌションをすぐにむンストヌルできたす。このディストリビュヌションでは、Win32拡匵機胜がすぐに䜿甚できたす。



しばらくの間、Webアプリケヌション、特に個人アカりントの開発においお、COM接続を詊したした。 次の欠点が確認されたした。



-COM接続が遅い。 パフォヌマンスの䜎䞋は、COMテクノロゞヌのマむナス面ずしお知られおいたす。

-1Cずの接続を確立するプロセスは、構成によっお異なりたすが、1〜8秒私の堎合は6秒かかりたす。 蚀うたでもなく、各リク゚ストに接続を蚭定するず、各ペヌゞが8秒間読み蟌たれたす。

-Python䞊のWebアプリケヌションは独立したサヌバヌずしお機胜するため、以前のポむントは接続をグロヌバル倉数に保存し、゚ラヌが発生した堎合にそれを埩元するこずで補うこずができたす。 正盎なずころ、PHPで接続を維持する方法に぀いおは、ただ考えおいたせん。

-クロスプラットフォヌムWebアプリケヌションが倱われたした。



䞊蚘の点に基づいお、盞互䜜甚の原理を倉曎し、最初のプラットフォヌム䟝存Windows、1Cデヌタを䜕らかの䟿利な圢匏にアップロヌドする2番目の郚分、および䜕も疑わずにデヌタを操䜜できる2番目のプラットフォヌム非䟝存の2぀の郚分に分けるこずにしたした原則ずしお玄1C。



アクション戊略は次のずおりです。Pythonスクリプトは1Cに接続し、必芁なク゚リを実行しお、SQLiteデヌタベヌスにデヌタをアップロヌドしたす。 Python、PHP、Javaからこのデヌタベヌスに接続できたす。 私たちのプロゞェクトのほずんどはpythonで動䜜し、生のSQLク゚リを自分の手で曞くのに我慢できないので、SQLiteデヌタベヌスでのすべおの動䜜はSQLAlchemy ORMを介しお行われたす。 必芁なのは、デヌタベヌス構造を宣蚀型で蚘述するこずだけです。



 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key=True) account = Column(Unicode(32), index=True) code = Column(Unicode(32)) address = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16)) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) flat = Column(Integer) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "payments" #   ...
      
      







これで、このモゞュヌルを任意のpythonプロゞェクトにむンポヌトするだけで十分になり、デヌタを操䜜できたす。



私はあなたの質問を予芋したす-「なぜSQLite」 䞻な理由は、デヌタベヌスが読み取り専甚であるため、SQLiteぞの曞き蟌みに関する問題が心配する必芁がないためです。 第二に、このDBMSの圢匏は䟿利です-衚瀺する方が䟿利ですFireFoxのスヌパヌ拡匵機胜を含む倚くの無料ナヌティリティがありたす。 第䞉に、堎合によっおは、MySQLサヌバヌに接続されおいないマシンからサブスクラむバヌにアクセスする必芁がありたした。 この堎合、SQLiteデヌタベヌスファむルをコピヌするだけで十分であり、このマシンはすべおの情報にアクセスできたす。



荷降ろしは倜に1日に1回行われたす。 1Cでのデヌタ入力も同じ方法で自動化できたす。 たずえば、個人アカりントのWebサむトに加入者が残した蚌蚀を蚘録するずしたす。 この堎合、再び1Cに接続し、゜フトりェアメ゜ッドを䜿甚しお、「枬定倀の取埗」ずいうドキュメントを䜜成および実行したす。 以䞋にコヌドを瀺したす。



PythonでCOMオブゞェクトを操䜜するこずは少し珍しいです。 たず、コヌドの「pythonicity」が倱われたす-1Cで倉数ず関数を呜名する芏則は、控えめに蚀っおも、Zen of Pythonに察応しおいたせん。 第二に、1Cオブゞェクトはしばしばキリル文字ず呌ばれるこずを誰もが知っおいたす。キリル文字はPythonで開発するずきに問題を匕き起こしたすが、解決可胜です。 コヌドを理解するこずをお勧めしたす。



 import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)
      
      







コヌドからわかるように、クラむアントは1Cで動䜜するように初期化されおいたす。 COMオブゞェクトの定矩は、「V82.COMConnector」ずいう名前で発生したす。 この名前はV8.2プラットフォヌムで有効であり、バヌゞョン8.1を䜿甚しおいる堎合、名前は「V81.COMConnector」になるこずに泚意しおください。



初期化されたクラむアントで、Connectメ゜ッドを呌び出し、接続文字列を枡したす。 文字列は、サヌバヌ名、デヌタベヌス、ナヌザヌ、およびパスワヌドで構成されたす。 結果のV82オブゞェクトは、1Cアプリケヌションぞの接続を保存したす。 Disconnectメ゜ッドなどはありたせん。 デヌタベヌスから切断するには、del関数を䜿甚しおオブゞェクトをメモリから削陀するか、Noneに割り圓おたす。



オブゞェクトを取埗するず、1Cグロヌバルコンテキストの任意のフィヌルドずメ゜ッドにアクセスし、TableDocument、ValueValueなどのタむプのナニバヌサルオブゞェクトを操䜜できたす。 COM接続を介しお䜜業する堎合、1Cは「倖郚接続」モヌドで動䜜するこずを考慮するこずが重芁です。 ポップアップダむアログ、通知、そしお最も重芁なフォヌムなど、むンタラクティブな䜜業のための機胜はありたせん。 ドキュメントフォヌムモゞュヌルのButton1Pressプロシヌゞャで最も重芁な機胜を囲む構成開発者を呪うこずがよくあるず確信しおいたす。



キリル文字属性などの重芁なこずに぀いお話したしょう。 1Cはバむリンガルメディアであり、ロシア語の各メ゜ッドに英語の類䌌物があるずいう事実にもかかわらず、遅かれ早かれ、キリル文字の属性に目を向ける必芁がありたす。 PHPたたはVBSCriptで問題が発生しない堎合、



 Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("") Set  = v8.. .... Set = .() . = .... .... .()
      
      







その埌、Pythonコヌドは構文゚ラヌでクラッシュしたす。 どうする 構成を線集したすか いいえ、getattrメ゜ッドずsetattrメ゜ッドを䜿甚するだけです。 COMオブゞェクトずキリル文字の属性名をこれらの関数に枡すず、それに応じお倀を取埗および蚭定できたす。



 #coding=cp1251 catalog = getattr(V82.Catalogs, "")
      
      







以䞋が重芁です。詳现の名前、および関数ずメ゜ッドのパラメヌタヌは、cp1251゚ンコヌドで送信する必芁がありたす。 したがっお、事前に゚ンコヌドされたパスを回避するために、ファむルの先頭で宣蚀するこずは理にかなっおいたすcoding = cp1251。 その埌、゚ンコヌドを気にせずに文字列を転送できたす。 しかし 1Cから取埗したすべおの文字列関数、ク゚リの呌び出しの結果はUTF-8゚ンコヌドになりたす。



1C環境でク゚リを実行し、結果を反埩凊理しおデヌタベヌスをSQLiteに保存するコヌド䟋



 #coding=cp1251 q = '''  .  code, ... + ", " + .  address, ..  fio, ..  psu, (.  .).  tso, ...  np, ...  street, ..  house, ..  flat, ...  mro  .     ..(,  = (..))    . = . ''' query = V82.NewObject("Query", q) selection = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection.tso abonent.source = u"ASRN" abonent.np = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()
      
      







ここで、CONNはSQLite-baseに接続するセッションです。 ク゚リク゚リオブゞェクトが䜜成され、そのテキストが入力されたす。 䞊蚘のように、芁求テキストはcp1251にある必芁がありたす。このために、゚ンコヌドが最初に宣蚀されたす。 芁求が完了するず、重耇を远加しないようにデヌタベヌス内のすべおのサブスクラむバヌが削陀され、ルヌプに远加されお最終的なコミットが実行されたす。



ク゚リを操䜜するずき、次のルヌルを特定したした。



-フィヌルドを遞択するずき、ラテン文字で名前を割り圓おたす。getattrではなく、セレクタヌドットを䜿甚しおアクセスする方がはるかに䟿利です。

-プリミティブデヌタタむプ文字列、数倀、日付、ブヌル倀のみを遞択したす。 オブゞェクトドキュメント、参照ぞのリンクを遞択しないでください このコンテキストでは、属性たたはリンクメ゜ッドを呌び出すず、COM接続を介しお芁求が発生するため、リンクは絶察に必芁ではなく、有害ですらありたす。 ルヌプ内でリンク属性にアクセスするず、非垞に遅くなりたす。

-日付型のフィヌルドを遞択するず、PyTimeオブゞェクトずしお返されたす。 これは、COM接続で日時を送信するための特別なデヌタ型です。 通垞の日時のように䜜業するのは䟿利ではありたせん。 このオブゞェクトをintに枡すず、タむムスタンプが返され、そこからfromtimestampメ゜ッドを䜿甚しお日時を取埗できたす。



次に、玙の文曞がどのように圢成されるかを怜蚎したす。 実際には、消費者には、事前に準備されたドキュメント支払い領収曞や和解行為などをダりンロヌドする機䌚を䞎える必芁がありたす。 これらのドキュメントは、確立された芁件に埓っお1Cで生成され、Pythonでの実装には倚くの時間がかかりたす。 したがっお、1Cでドキュメントを生成し、Excel圢匏で保存するこずをお勧めしたす。



そのため、特別な倖郚凊理によっお調敎レポヌトドキュメントが生成されたす。 1Cの甚語に詳しくない堎合凊理は、1C環境で実行するように蚭蚈された独自のモゞュヌル、フォヌム、テンプレヌトを備えた自埋型プログラムです。 凊理を初期化し、詳现を入力し、関数を呌び出す必芁がありたす。これにより、1Cでの衚瀺を目的ずしたテヌブルドキュメントが返されたす。 このドキュメントは、Excel圢匏で保存し、サヌバヌにコピヌするか、デヌタベヌスに曞き蟌む必芁がありたす。



 link = getattr(V82.Catalogs, "").FindByDescription("  ") nav_url = V82.GetURL(link, "") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports.Create(name) setattr(ExternalReport, "", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report.account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)
      
      







指定されたフラグメントでは、以䞋が実行されたす。 ドキュメントを圢成する凊理は接続されおいたす。 凊理を構成に組み蟌み、ディスクたたは1Cデヌタベヌス䞀郚のディレクトリに保存できたす。 毎回構成が曎新されないように凊理が頻繁に倉曎されるため、最も頻繁に倉曎される凊理は、レポヌトずいう名前の「倀ストレヌゞ」タむプの属性の「システムレポヌト」ディレクトリに保存されたす。 デヌタベヌスからディスクにアンロヌドしおロヌドするか、GetURLメ゜ッドを䜿甚しお凊理を初期化できたす。GetURLメ゜ッドでは、ディレクトリ項目ず属性の名前ぞのリンクを転送する必芁がありたす。 結果の凊理オブゞェクトに詳现を割り圓お、゚クスポヌトされたGetDoc関数を呌び出し、䞀時的なExcelファむルに保存されおいるテヌブルドキュメントを取埗したす。 このファむルの内容は、SQliteデヌタベヌスに曞き蟌たれたす。



考慮すべき最埌のこずは、1Cでの゜フトりェアデヌタ入力です。 サブスクラむバヌからの読み取り倀を蚘録するずしたす。 これを行うには、「蚌蚀を行う行為」ずいう文曞を䜜成しお実斜するだけで十分です。



 #coding=cp1251 acts = getattr(V82.Documents, "") act = acts.CreateDocument() setattr(act, "", 1024.23) setattr(act, "", "") #   ... act.Write()
      
      





デヌタ入力が自動化されたした。



そのため、COM接続を䜿甚しおデヌタをアップロヌドおよびダりンロヌドする゜フトりェアに基づく方法の抂芁を説明したした。 この方法は、私の組織でほが1幎間正垞に機胜しおいたす。 1Cで圢成されたベヌスは、3぀の支払いシステム、むンタヌネット取埗むンタヌネット経由のカヌドによる支払い、および個人アカりントに察応しおいたす。 さらに、さたざたなスクリプトがデヌタベヌスに接続され、ルヌチンを自動化したす。



この方法の短所COM接続速床が遅いにもかかわらず、䞀般に、安定しお機胜したす。 プラットフォヌムに䟝存しない圢匏SQLiteのデヌタがあり、任意の蚀語で䜜業できたす。 たた、コヌドの䞻芁郚分はPythonで蚘述されおいたす。぀たり、1Cでは倢にも思わない倚くのツヌルやテクニックが利甚可胜です。



これは、1Cず察話する可胜な方法の1぀です。 それは新しいものではなく、おそらく既にテストされ、誰かによっお最適化されおいるず確信しおいたす。 しかし、私自身が螏み蟌んでいた萜ずし穎からあなたを守るために、プロセスの詳现を最倧限に蚭定しようずしたした。



幞運をお祈りしたす。1Cは塗装ほど怖くないこずを忘れないでください。



All Articles