التكامل السريع مع 1C: المؤسسة

في هذه المقالة سأتحدث عن أبسط طريقة ، في رأيي ، لدمج تطبيقات الطرف الثالث مع تكوينات 1C. ستكون المقالة ذات أهمية خاصة للمطورين الذين يكتبون على .Net Core و PHP و Python .

هناك العديد من الطرق للتكامل مع 1C ، وهناك مقالة ممتازة من 1C نفسها مكرسة لذلك. على وجه الخصوص ، سوف تتعلم منها أن 1C تدعم آليات خدمات الويب ، مما يعني أنه يمكننا تنفيذ خدمتنا على جانب 1C ، ونتيجة لذلك ، مكتبة ORM الخاصة بنا على جانب تطبيق العميل. ستتم مناقشة إحدى هذه المكتبات لاحقًا.

وصف التقنية بشكل عام


على جانب 1C


كل شيء يبدأ بحقيقة إضافة ملحق "Brom" إلى تهيئة 1C ، إضافة خدمة ويب جديدة. الامتداد متاح مجانًا ومرخص (MIT). لا يرتبط الملحق نفسه بنموذج بيانات محدد ، وبالتالي يمكن تثبيته على أي تكوين مع دعم لوضع التوافق 8.3.10 أو أعلى.

بمجرد تثبيت الامتداد ، يجب عليك تكوين حقوق المستخدمين الذين سيحصلون على إمكانية الوصول إلى أساليب خدمة الويب ، وكذلك نشر التكوين على خادم الويب بحيث يمكن الوصول إلى الخدمة المضافة عبر بروتوكول http (s). على الجانب 1C ، ليس هناك ما هو مطلوب.

على جانب العميل


من جانب العميل ، يتم توصيل حزمة Brom ، على سبيل المثال ، بالنسبة إلى .Net Core ، يمكن القيام بذلك باستخدام الأمر:

Install-Package Brom -Version 1.0.1-beta08 

أو لبيثون:

 pip install brome 

بعد تثبيت الحزمة ، يكفي إنشاء كائن عميل يتم من خلاله التفاعل مع التكوين 1C البعيد. فيما يلي سوف أعطي الكود في C # ، لكن في PHP و Python يكون مشابهًا. وهكذا ، يمكنك إنشاء عميل بأمر واحد:

 dynamic  = new (@"  = http://mydomain.com/publication_name;  = 1c_user_name;  = 1c_user_pass "); 

في المنشئ ، يكفي الإشارة إلى عنوان تكوين 1C المنشور ، وبيانات المستخدم الذي أصدرنا له حقوق الوصول إلى الامتداد. بمجرد إنشاء العميل ، يمكننا المتابعة إلى الأكثر إثارة للاهتمام.

نداء من الإجراءات والوظائف 1C


من خلال عميل البروم الذي تم إنشاؤه ، يمكننا استدعاء الإجراءات والوظائف المحددة في 1C. في هذه الحالة ، يجب أن تكون الطرق التي تم استدعاؤها من جانب الخادم وأن يتم تضمينها إما في السياق العام أو في الوحدات النمطية للخادم (الوحدات النمطية العامة أو وحدات الإدارة). على سبيل المثال ، هذه هي الطريقة التي يبدو بها استدعاء دالة السياق العام "Number Prescription":

 string  = .(2547, " = fr_FR"); 

المعلمة الثانية هي سلسلة تنسيق تشير إلى الترجمة (الفرنسية). يتم نقل المعلمات في شكل طبيعي ولا تتطلب أي تحويل أو تعبئة إضافية.

وهذا ما ستبدو عليه الدعوة إلى وظيفة Find By Code بوحدة مدير الدليل:

 var  = ...(840); 

هنا أطلقنا على الوظيفة من خلال دليل مدير الوحدة النمطية "العملات". ستكون نتيجة الاستدعاء كائنًا من النوع "DirectoryReference". الآن يمكن تمرير الرابط الناتج للكائن كمعلمة لوظيفة أخرى:

 var  = ..(, DateTime.Today); 

تحولنا هذه المرة إلى الوحدة العامة "العمل مع العملات" وإنقاذ طريقتها "الحصول على عملات الدورات".

تدعم المكتبة العمل مع أنواع البيانات المعقدة ، لذلك من الممكن استدعاء الأساليب التي تأخذ المدخلات أو الإرجاع: الروابط ، المصفوفات ، الهياكل ، جداول القيمة ، أشجار القيمة ، تعدادات النظام ، إلخ ... يتم تطبيق بعض الفئات بشكل خاص في مكتبة العميل لتبسيط العمل مع 1C.

يمكن تكوين نطاق الطرق البعيدة بمرونة عن طريق تحديدها في الإعدادات. لذلك ، على سبيل المثال ، إذا قمت بتحديد منطقة "الدلائل. *. البحث عن طريق الكود" ، عندها فقط ستكون طريقة "البحث عن طريق الكود" متاحة في جميع أدلة التكوين. وبالتالي ، يمكنك الإشارة بوضوح إلى الطرق التي يمكن لتطبيق متكامل استخدامها.

العمل مع الروابط


لا تسمح الإشارات إلى الكائنات بنقل المؤشر إلى كائن 1C فقط ، ولكن أيضًا لتلقي بيانات الكائن نفسه. العمل مع الروابط على جانب العميل بسيط كما هو الحال في 1C. على سبيل المثال:

 var  = ...("00-000018", new Date(2017, 1, 1)); var  = .; var  = .; var  = ..; foreach (var  in .) { Console.WriteLine((., .)); } 

هنا وجدنا رابطًا للوثيقة من خلال وحدة مدير البرنامج وحصلنا على قيم حقول الوثيقة وقسم جدولي "المنتجات". بعد أول وصول إلى حقل الكائن ، يتم تنزيل جميع بياناته من خادم 1C وتخزينها على العميل حتى يتم حذف الرابط من قبل جامع البيانات المهملة.

يمكن أيضًا الحصول على رابط للكائن من جانب العميل دون الوصول إلى الخادم. للقيام بذلك ، فقط معرفة المعرف الفريد للكائن:

 var  = ...(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7")); 

يمكنك أيضًا الحصول على روابط لعناصر المجموعة المحددة مسبقًا:

 var  = ...18_118; 


تحرير الكائنات


وجود رابط للكائن ، يمكننا تحرير بيانات الكائن. للقيام بذلك ، فقط قم بإنشاء سياق كائن:

 var  = .(); . = DateTime.Today; . = "00-000055"; ..(); var  = ..() . = ...("000000104"); . = 3; .(.); 

في هذا المثال ، أنشأنا سياق المستند من خلال رابط للمستند ، معبأ في بعض الحقول ، أضفنا سطرًا إلى القسم المجدول "المنتجات" وقمنا بتسجيل المستند في وضع النشر.

إذا كنت بحاجة إلى إنشاء كائن جديد ، فهذا ممكن أيضًا:

 //     var  = ...(); . = " "; .(); //     var  = ...(); . = .; . = " "; . = "T-00012321"; //    .(); //      var  = .; 

أنشأنا هنا مجموعة جديدة في دليل "Nomenclature" ، ثم أنشأنا عنصر دليل ووضعناه في المجموعة التي تم إنشاؤها.

تشكيل العينات


مثل أي ORM لائق ، يتيح لك عميل البروم إنشاء نماذج من مجموعات الكائنات 1C المختلفة. التحديد هو مجموعة من المراجع لكائنات المجموعة التي تلبي مجموعة من شروط الاختيار. لإنشاء تحديد ، ما عليك سوى إنشاء كائن "المحدد":

 var  = ...(""); var  = ...(); . (", , , ."). ("", false). ("", , .). (""). ("", .); foreach (var  in ) { Console.WriteLine(": {0}; : {1}, : {2}; : {3}", ., ., ., .. ); } //         var  = .(); 

في هذا المثال ، حصلنا على نموذج يحتوي على عناصر من دليل "Nomenclature" ، والتي تكون هرمية في مجموعة "Furniture". لقد أوضحنا أنه بالإضافة إلى الروابط نفسها ، من الضروري تحميل البيانات من بعض الحقول. نتيجة لذلك ، سيتم تحميل بيانات هذه الحقول بطلب واحد ، ولن يؤدي الوصول إليها إلى مكالمات خادم إضافية.

تنفيذ الاستعلام


في أغلب الأحيان ، تصبح البيانات المخزنة في مجموعة واحدة غير كافية ، ونحن بحاجة إلى الحصول على البيانات التي تم إنشاؤها بواسطة استعلام معقد. لتلبية الطلبات ، يتم توفير فئة "طلب" خاصة في مكتبة العميل. العمل مع الطلبات على جانب العميل يشبه إلى حد كبير العمل على جانب 1C:

 var  = .(@"  .  , .  , .    .    . = & "); .("", "-0001"); var  = .(); foreach (var  in ) { Console.WriteLine((., .)); } 

أنشأنا هنا استعلامًا بسيطًا باستخدام معلمة تحدد البيانات من دليل "Nomenclature". كمعلمة ، أصدرنا مقالة السلسلة للعنصر. في الحالة العامة ، يمكن أن تكون قيمة المعلمة أيضًا روابط وتعدادات للنظام وحتى المصفوفات. نتيجة للاستعلام ، عدنا "جدول القيم" ، يتم تنفيذ هذه الفئة من جانب العميل. في هذا المثال ، استنتجنا حقول صفوف الجدول باستخدام حلقة.

على الجانب 1C ، يتم تنفيذ جميع الطلبات من خلال أداة إنشاء الاستعلام ، بحيث لا يمكنك تحديد طلب جاهز فقط كنص ، ولكن أيضًا قالب طلب يحتوي على ترميز للباني:

 var = .(@"   5 .  , .  , .   { .*}  ..( {(&)}, { ().*, ().*} )   { .} {  .*, .*} "); //         .("..", ""); //      .("", 100, .); //       .("."); .("", .); var  = .(.); 

في هذا المثال ، حددنا طلبًا موحدًا ، يمكن تغيير إعداداته ديناميكيًا من جانب العميل حسب الضرورة. بسبب هذا ، يمكن الإشارة إلى الحقول والتحديدات والفرز في نص رمز البرنامج الرئيسي ، وليس داخل نص الطلب.

تقبل طريقة التشغيل المعلمة الاختيارية "نوع الزحف إلى النتائج". إذا حددت نوع الزحف "بالتجميع" أو "بالتجميع مع التسلسل الهرمي" ، فبدلاً من جدول القيم ، ستُرجع الطريقة شجرة القيم.

أيضًا ، بدلاً من طريقة التشغيل ، يمكنك استدعاء طريقة تشغيل الحزمة (لتنفيذ العديد من الطلبات مرة واحدة). في هذه الحالة ، سيتم إرجاع مجموعة من الجداول أو مجموعة من الأشجار ، اعتمادًا على نوع traversal.

تنفيذ مقتطف الشفرة


في بعض الحالات الغريبة ، قد تحتاج إلى تنفيذ جزء معين من التعليمات البرمجية مباشرة على الجانب 1C. للقيام بذلك ، يوفر عميل Brom طريقة "تشغيل". تأخذ الطريقة نص الإدخال الذي يحتوي على رمز قابل للتنفيذ ومعلمة اختيارية واحدة ، والتي ستكون متاحة في التعليمات البرمجية في متغير "المعلمة":

 var  = .(@"  = 0;        =  + ; ; ", new double[] { 45, 67, 12.56, 11.9 }); 

في هذا المثال ، قمنا بتنفيذ جزء من التعليمات البرمجية يجمع الأرقام في صفيف. تم تمرير الصفيف نفسه كمعلمة ووضعه في متغير "المعلمة". تم وضع نتيجة الحساب في المتغير "النتيجة". إذا تم تعبئة متغير بهذا الاسم في التعليمات البرمجية القابلة للتنفيذ ، فسيتم إرجاع قيمته في الوقت الذي ينتهي فيه التنفيذ كنتيجة لوظيفة "تشغيل".

تخضع القدرة على تنفيذ أجزاء التعليمات البرمجية لدور وصول منفصل في الملحق. يوصى بتمكين هذا الدور فقط لأغراض الاختبار ، وتأكد من تعطيله في مسودة العمل ، كما هو هذا هو الضعف واضح.

مزايا عيوب هذه التقنية


يجب أن تشمل مزايا المنهجية الموصوفة بالتأكيد:

  • عبر منصة . يعتمد كل التفاعل على بروتوكولي SOAP و HTTP ، ويتم تنفيذهما على جميع منصات التطوير الشائعة ؛
  • بساطة الكود . يشبه الكود الموجود على جانب تطبيق العميل الكود الموجود في جانب 1C ؛
  • آليات التسلسل المضمنة . لا نحتاج إلى حزم البيانات وتفريغها من أجل تبادلها مع 1C ؛
  • دعم للعمل مع الروابط . لدينا سهولة الوصول إلى الكائنات 1C عبر الروابط.
  • دعم أنواع البيانات الخاصة بـ 1C . يمكننا تبادل مع الجداول 1C والأشجار والهياكل وغيرها من الهياكل المعقدة.
  • الوصول إلى سياق التطبيق . لدينا إمكانية الوصول ليس فقط إلى بيانات قاعدة البيانات ، ولكن لدينا أيضًا القدرة على استدعاء الأساليب المحددة على جانب 1C ، وكذلك لدينا إمكانية الوصول إلى حالة الجلسة.

عيوب هذه التقنية متوفرة أيضًا:

  • انخفاض معدل البيانات . نظرًا لأن بروتوكول SOAP يستند إلى تسلسل XML ، فإن نقل كميات كبيرة من البيانات يتطلب وقتًا لتبادل الحركة الزائدة ، وكذلك لتعبئة البيانات وتفريغها. يبدو الاتصال عبر اتصال COM الأفضل في هذا السياق؛
  • عميل مناسب غير متوفر على جميع المنصات . إذا لم تكن مبرمجًا .Net Core أو PHP أو Python ، فسيتعين عليك تنفيذ عميل البروم بنفسك باستخدام آليات SOAP ، والتي عمومًا تستغرق وقتًا طويلاً ؛
  • حدود لغة الاستعلام 1C . نظرًا لأن كل العمل مع قاعدة البيانات يحدث من خلال آلية الاستعلام 1C ، فهناك بعض القيود. على سبيل المثال ، لا يمكنك تنفيذ ترقيم الصفحات الكلاسيكي للبيانات ، لأن في لغة الاستعلام 1C لا توجد آليات لترحيل الصفحات.

مقارنة مع OData


من المادة المذكورة أعلاه 1C ، يمكنك معرفة أنه في 1C: يتم الوصول إلى المؤسسة من البيانات باستخدام بروتوكول OData الموحد. لهذا السبب ، سيكون من الغباء عدم ذكره أيضًا.
فيما يلي مخطط مقارنة موجز:
البرومOData
الحصول على جمع البيانات مع اختيار معقدة وظروف الفرز++
إخراج الصفحة من مجموعات البيانات+
إضافة وتحرير البيانات++
دعم العمل مع الأنواع 1C: Enterprise (ارتباطات ، جداول ، أشجار ، إلخ)+
أداء الاستفسارات التعسفية+
استدعاء إجراءات الخادم ووظائفه+
تنفيذ كود الخادم التعسفي+
أدوات التصور الجاهزة / واجهات المستخدم+
JSON نقل البيانات+

يمكن ملاحظة أن هذه الأساليب لها مزاياها وعيوبها ، وفي الحالة العامة ، لا يمكن استبدالها.

استنتاج


آمل أن يساعدك هذا المقال المراجعة في المستقبل بسرعة وسهولة في إنشاء بوابات وحسابات شخصية وخدمات متكاملة بشكل وثيق مع أنظمة المحاسبة القائمة على 1C: Enterprise. يمكنك العثور على معلومات مفصلة حول مكونات البروم في الوثائق الرسمية ، وهنا مجرد لمحة موجزة عن الميزات الرئيسية.

Source: https://habr.com/ru/post/ar462453/


All Articles