GitHubで1C構成を公開する

この記事では、1C構成ストレージ以外のバージョン管理システムで公開するために1C構成を準備する方法を示します。 この操作には、.NetフレームワークとC#が含まれます。これにより、1Cプロジェクトをフォルダーに正確に配布できます。



4年前の古いBSP更新(1.0.7.5から1.1.3.1)に基づいて構成を公開する例は、 https://github.com/elisy/sslにあります 。 同様に、他のバージョン管理システムに構成を公開することも理論的には可能です。 しかし、修正された多数のファイルをSVNで公開した経験は失敗しました。TortoiseSVNを介してログを表示しているときにSVNクライアントがクラッシュしました。



ステージ1:1C 8.3構成をXMLファイルにアップロードする



バージョン8.3以降、1CはXMLファイルの形式で構成をアップロードできます。



これは、[構成]-[構成をファイルにアップロードする]で行います。ディレクトリを指定して[OK]をクリックする必要があります。 構成は、xml、txt、htmlファイルのセットにアップロードされます。



コマンドラインを使用して、アップロードディレクトリの/ DumpConfigToFilesパラメーターを使用してファイルをアップロードできます。アップロードディレクトリは、構成がダウンロードされるディレクトリです。



これにより、公開のための構成の準備が完了する可能性がありますが、1つの問題があります。 すべての構成ファイルは同じディレクトリにあります。 たとえば、UT 11.0.7ファイルの場合、サイズは約430 MBで約10,000(万)です。 これらのファイルをディレクトリに配置すると、各フォルダが同じタイプのファイルを処理する方が便利です。



特別に作成されたプログラムは、ファイルをディレクトリに分解するのに役立ちます。 この場合、C#で。



ステップ2:XMLファイルをフォルダーに配布する



ファイルをディレクトリに配置することの本質は次のとおりです。ドット区切り文字で分解されたファイルの名前に基づいて、同じ拡張子を持つフルパスが取得されます。 したがって、ポイントの最初の単語はオブジェクトタイプディレクトリを定義し、次の単語はタイプ内のオブジェクト名ディレクトリを定義します。 など-ポイントの後のすべての単語-新しいディレクトリ。



例外があります:フォーム、レイアウト、ヘルプ。 それらに、xmlはさらに、親ディレクトリからフォーム/レイアウトまたはヘルプの定義を含むディレクトリに転送されます。 サブシステムは、サブシステム内に従属サブシステムの定義があるという点で異なります。 「構成」で始まるファイルはルートに配置されます。



相対パスを取得するためのコードは次のとおりです。



private string GetRelativePath(string id) { var nameParts = Path.GetFileNameWithoutExtension(id).Split('.'); string newPath = id; if (String.Compare(nameParts[0], "Configuration", true) == 0) //Configuration.ManagedApplicationModule.txt newPath = id; else if (nameParts.Length == 2) //AccumulationRegister..xml newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[1] + Path.GetExtension(id)); else if (nameParts.Length == 4 && String.Compare(nameParts[0], "CommonPicture", true) == 0 && String.Compare(nameParts[2], "Picture", true) == 0 && String.Compare(nameParts[3], "Picture", true) == 0) { //CommonPicture.BCG.Picture.Picture.png newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[3] + Path.GetExtension(id)); } else if (nameParts.Length == 4 && String.Compare(nameParts[0], "CommonForm", true) == 0 && String.Compare(nameParts[2], "form", true) == 0 && String.Compare(nameParts[3], "module", true) == 0) { //CommonForm.Offline.Form.Module.txt newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[3] + Path.GetExtension(id)); } else if (nameParts.Length == 4 && String.Compare(nameParts[2], "form", true) == 0) { //AccumulationRegister..Form..xml newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[3] + Path.GetExtension(id)); } else if (nameParts.Length == 6 && String.Compare(nameParts[4], "form", true) == 0 && String.Compare(nameParts[5], "module", true) == 0) { //Catalog..Form..Form.Module.txt newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[5] + Path.GetExtension(id)); } else if (nameParts.Length == 4 && String.Compare(nameParts[2], "template", true) == 0) { //Catalog..Template..xml newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[3] + Path.GetExtension(id)); } else if (String.Compare(nameParts[nameParts.Length - 1], "help", true) == 0) { //AccumulationRegister..Help.xml //SettingsStorage..Form..Help.xml //Subsystem..Subsystem..Help.xml List<string> pathParts = new List<string>(); pathParts.AddRange(nameParts.Take(nameParts.Length)); pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id)); newPath = Path.Combine(pathParts.ToArray()); } else if (nameParts.Length > 3 && String.Compare(nameParts[nameParts.Length - 2], "Subsystem", true) == 0) { //Subsystem..Subsystem..xml List<string> pathParts = new List<string>(); pathParts.AddRange(nameParts.Take(nameParts.Length)); pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id)); newPath = Path.Combine(pathParts.ToArray()); } else if (nameParts.Length > 2) { List<string> pathParts = new List<string>(); pathParts.AddRange(nameParts.Take(nameParts.Length - 1)); pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id)); newPath = Path.Combine(pathParts.ToArray()); } return newPath; }
      
      







ファイルのコピーには、コピー先のディレクトリの存在の確認(ディレクトリが存在しない場合は作成されます)および最終ファイルの存在の確認(ファイルが存在する場合はコピー前に削除されます)が伴います。



 string fullPath = Path.Combine(destinationDirectory, file.Path); if (File.Exists(fullPath)) File.Delete(fullPath); string fullPathDirectory = Path.GetDirectoryName(fullPath); if (!Directory.Exists(fullPathDirectory)) Directory.CreateDirectory(fullPathDirectory); File.Copy(Path.Combine(sourceDirectory, file.Id), fullPath);
      
      







ステップ3:GitHubで公開する



GitHubに登録した後、リポジトリを作成する必要があります。 この場合、リポジトリはsslと呼ばれます。



ローカルディレクトリをGitHub Webサイトと同期するには、github.com WebサイトからWindowsクライアントをダウンロードする必要があります。 アプリケーションをインストールすると、GitHub.exeファイルが起動します。



設定(およびアプリケーションの左上)を使用して、ローカルディレクトリをリポジトリに関連付ける必要があります。 その後、実行中のGitHub.exeクライアントは、ディレクトリの変更を自動的に追跡し始めます。 追加または変更されたファイルを出力します。



サーバーへの変更の送信または変更されたファイルの受信は、Syncコマンド(アプリケーションの右上にあるボタン)を介して実行されます。



結論



cfファイルからアンロードされた構成の公開の歴史には例があります。 ただし、内部1C形式のファイルの表示には明確さがありません。 XML形式はより魅力的で、そのアンロードは1C 8.3でのみ登場しました。



GitHubで構成を公開した経験により、1Cのツール群に別の強力なツールが追加されました。 1C構成のストレージと比較したGitHubの利点は明らかです。分岐、組み込みのバグトラッカー、コードの修正と議論、ブラウザーでのコードの修正、レポートとグラフ、オープンAPI。



明らかな魅力にもかかわらず、作業の実践のみが方法論の実行可能性を証明することができます。 批判にもかかわらず、ストレージ1Cは何年も機能します。 他のバージョン管理システムへの移行を困難にしているのは、推測だけです。 おそらく、バージョンでは、この形式の仕様のためにXMLファイルの変更を追跡するのは不便かもしれません( レイアウトを参照 )。



All Articles