منصة "1C: Enterprise" - ما الذي تحت الغطاء؟

يا هبر!
في هذه المقالة ، سنبدأ قصة حول كيفية عملها في الداخل 1C: منصة Enterprise 8 وما هي التقنيات المستخدمة في تطويره.

منصة "1C: Enterprise" - ما الذي تحت الغطاء؟

لماذا نعتقد أنه مثير للاهتمام؟ أولاً ، نظرًا لأن النظام الأساسي 1C: Enterprise 8 عبارة عن تطبيق كبير (أكثر من 10 ملايين سطر من التعليمات البرمجية) مكتوب بلغة C ++ (عميل ، خادم ، إلخ) ، JavaScript (عميل ويب) ، ومؤخراً ، و جافا. تعتبر المشروعات الكبيرة مثيرة للاهتمام ، حتى لو كان ذلك بسبب حجمها فقط ، لأن المشكلات غير المرئية في قاعدة التعليمات البرمجية الصغيرة ، في مثل هذه المشاريع ، ترتفع إلى ارتفاعها الكامل. ثانيًا ، 1C: Enterprise عبارة عن منتج "محاصر" مكرر ، وهناك عدد قليل جدًا من المقالات حول مثل هذه التطورات في Habré. ومن المثير للاهتمام دائمًا معرفة كيفية عيشهم في فرق وشركات أخرى.

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

  • كتلة الخادم
  • عميل "رفيع" قادر على الاتصال بالخادم عبر http والبروتوكول الثنائي الخاص به
  • العميل للعمل في بنية من مستويين مع قاعدة بيانات موجودة على القرص الثابت أو مجلد الشبكة
  • العميل على شبكة الإنترنت
  • أدوات إدارة خادم التطبيق
  • بيئة التطوير (المعروفة باسم Configurator)
  • بيئة التنفيذ لأنظمة iOS و Android و Windows Phone (منصة الهاتف المحمول 1C)

كل هذه الأجزاء ، باستثناء عميل الويب ، مكتوبة بلغة C ++. بالإضافة إلى ذلك ، هناك ما تم الإعلان عنه مؤخرًا مُكوِّن الجيل الجديد، مكتوب بلغة جافا.

التطبيقات الأصلية

يستخدم C ++ 03 لتطوير التطبيقات الأصلية. تحت Windows ، يتم استخدام Microsoft Visual C ++ 12 (ملف تعريف متوافق مع Windows XP) كمترجم ، وتحت Linux و Android - gcc 4.8 ، لنظام iOS - clang 5.0. المكتبة القياسية المستخدمة هي نفسها لجميع أنظمة التشغيل والمجمعين - STLPort. يقلل هذا الحل من احتمال حدوث أخطاء خاصة بتنفيذ المحكمة الخاصة بلبنان. نحن نخطط حاليًا للتبديل إلى تطبيق STL المقدم مع CLang ، حيث تم إهمال STLPort وغير متوافق مع وضع دعم C ++ 11 الممكّن من دول مجلس التعاون الخليجي.
قاعدة رمز الخادم شائعة بنسبة 99 ٪ ، والعميل - 95 ٪. علاوة على ذلك ، حتى منصة الهاتف المحمول تستخدم نفس كود C ++ مثل الرمز "الكبير" ، على الرغم من أن نسبة التوحيد أقل إلى حد ما هناك.
مثل معظم مستخدمي C ++ ، لا ندعي استخدام اللغة ومكتباتها بنسبة 100٪. لذلك ، نحن لا نستخدم Boost عمليًا ، ومن إمكانيات اللغة - صب النوع الديناميكي. عند القيام بذلك ، نستخدم بنشاط:

  • STL (على وجه التحديد السلاسل والحاويات والخوارزميات)
  • الميراث المتعدد ، بما في ذلك. متعددة التنفيذ الميراث
  • قوالب
  • استثناءات
  • المؤشرات الذكية (التنفيذ المحلي)

من خلال استخدام الوراثة المتعددة للواجهات (فئات مجردة تمامًا) ، يصبح نموذج المكون ممكنًا ، والذي سيتم مناقشته أدناه.

مكونات

لضمان النموذجية ، يتم تقسيم جميع الوظائف إلى مكونات عبارة عن مكتبات ديناميكية (* .dll ضمن Windows ، * .so - في نظام Linux). يوجد أكثر من مائة ونصف في المجموع ، وسنقدم أوصافًا لبعض منها:

الخلفية
يحتوي على "محرك" البيانات الوصفية للنظام الأساسي

com.acct
العناصر التي يستخدمها مطورو التطبيقات لبناء المحاسبة (مخططات الحسابات وسجلات المحاسبة)

BSL
محرك تنفيذ اللغة المضمنة

السلاح النووي
تنفيذ الخاصة لمخصص الذاكرة

dbeng8
محرك قاعدة الملفات. محرك قاعدة بيانات خادم ملفات بسيط يستند إلى ISAM ويتضمن أيضًا معالج SQL بسيطًا

com.wbase
يحتوي على فئات أساسية ووظائف لتنفيذ واجهة مستخدم Windows - فئات النوافذ ، والوصول إلى GDI ، وما إلى ذلك.

يعد التقسيم إلى عدة مكونات مفيدًا بعدة طرق:

  • يعزز الفصل التصميم الأفضل ، ولا سيما عزل الكود بشكل أفضل
  • من مجموعة المكونات ، يمكنك تجميع خيارات تسليم مختلفة بمرونة:
    • على سبيل المثال ، سيحتوي تثبيت العميل الرقيق على wbase ولكن بدون خلفية
    • وعلى خادم wbase ، على العكس من ذلك ، لن يحدث ذلك
    • كلاهما سيحتوي بالطبع على الأسلحة النووية و bsl

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

SCOM

للتحلل على مستوى أدنى ، يتم استخدام نظام SCOM - مكتبة مماثلة في أيديولوجية ATL. بالنسبة لأولئك الذين لم يعملوا مع ATL ، قم بإدراج الميزات والميزات الرئيسية بإيجاز.
لفئة SCOM مصممة خصيصًا:

  • يوفر طرق المصنع التي تسمح لك بإنشاء فئة من مكون آخر مع معرفة اسمه فقط (دون الكشف عن التنفيذ)
  • يوفر بنية تحتية لمؤشر ذكي يتم احتسابه كمرجع. لا يحتاج عمر فئة SCOM إلى مراقبته يدويًا
  • يسمح لك بمعرفة ما إذا كان الكائن يطبق واجهة معينة ويلقي المؤشر تلقائيًا على الكائن إلى المؤشر إلى الواجهة
  • قم بإنشاء كائن خدمة متاح دائمًا عبر طريقة get_service ، إلخ.

على سبيل المثال ، يمكنك تحديد فئة لقراءة JSON (على سبيل المثال ، JSONStreamReader) في مكون json.dll.
يمكن إنشاء الفئات والمثيلات من مكونات أخرى ، تحتاج إلى التسجيل في جهاز SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

سيصف هذا الماكرو فئة المسجل الثابتة الخاصة التي سيتم استدعاء المُنشئ الخاص بها عند تحميل المكون في الذاكرة.
بعد ذلك ، يمكنك إنشاء مثيل له في مكون آخر:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

لدعم الخدمات ، تقدم SCOM بنية تحتية إضافية ومعقدة إلى حد ما. من الأمور المركزية فيها مفهوم عملية SCOM ، والتي تعمل كحاوية لتشغيل الخدمات (أي ، تعمل كمحدد موقع خدمة) ، وتحتوي أيضًا على ارتباط بالموارد القابلة للترجمة. عملية SCOM مرتبطة بمؤشر نظام التشغيل. بفضل هذا ، داخل التطبيق ، يمكنك تلقي خدمات مثل هذه:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

علاوة على ذلك ، من خلال تبديل العمليات المنطقية (SCOM) المرفقة بمؤشر ترابط ، يمكنك الحصول على تطبيقات مستقلة عمليًا من وجهة نظر مساحة المعلومات وتشغيلها ضمن نفس الموضوع. هذه هي الطريقة التي يعمل بها العميل الرقيق الخاص بنا مع قاعدة الملفات - توجد داخل عملية نظام تشغيل واحد عمليتان من عمليات SCOM ، واحدة متصلة بالعميل ، والثانية بالخادم. يتيح لك هذا الأسلوب توحيد كتابة التعليمات البرمجية التي ستعمل على قاعدة ملفات محلية وإصدار خادم عميل "حقيقي". ثمن هذا التوحيد هو النفقات العامة ، ولكن الممارسة تبين أنها تستحق ذلك.

استنادًا إلى نموذج مكون SCOM ، يتم تنفيذ كل من منطق الأعمال وجزء الواجهة من 1C: Enterprise.

واجهة المستخدم

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

على مدار سنوات تطوير 1C: Enterprise ، تغير مظهر عناصر التحكم ، ولكن حدث تغيير خطير في المبادئ مرة واحدة فقط ، في عام 2009 ، مع إصدار الإصدار 8.2 وظهور "النماذج المُدارة". بالإضافة إلى تغيير المظهر ، فقد تم تغيير مبدأ تخطيط النموذج بشكل أساسي - كان هناك رفض لتحديد موضع العناصر كل بكسل على حدة لصالح مخطط تدفق العناصر. بالإضافة إلى ذلك ، في النموذج الجديد ، لا تعمل عناصر التحكم مباشرة مع كائنات المجال ، ولكن مع DTOs الخاصة (كائنات نقل البيانات).
جعلت هذه التغييرات من الممكن إنشاء 1C: عميل ويب مؤسسي يكرر منطق التحكم C ++ في JavaScript. نحاول الحفاظ على التكافؤ الوظيفي بين العملاء النحيفين وعملاء الويب. عندما لا يكون ذلك ممكنًا ، على سبيل المثال ، بسبب القيود المتاحة من JavaScript API (على سبيل المثال ، القدرة على العمل مع الملفات محدودة للغاية) ، فإننا غالبًا ما ننفذ الوظيفة المطلوبة باستخدام ملحقات المستعرض المكتوبة بلغة C ++. ندعم حاليًا Internet Explorer و Microsoft Edge (Windows) و Google Chrome (Windows) و Firefox (Windows و Linux) و Safari (MacOS).

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

منصة "1C: Enterprise" - ما الذي تحت الغطاء؟
واجهة 1C على نظام التشغيل Linux

منصة "1C: Enterprise" - ما الذي تحت الغطاء؟
واجهة 1C على جهاز محمول

1C واجهة على منصات أخرى منصة "1C: Enterprise" - ما الذي تحت الغطاء؟
واجهة 1C على نظام التشغيل Windows

منصة "1C: Enterprise" - ما الذي تحت الغطاء؟
الواجهة 1C - عميل الويب

المصدر المفتوح

على الرغم من أننا لا نستخدم المكتبات القياسية لمطوري C ++ تحت Windows (MFC ، عناصر التحكم من WinAPI) ، فإننا لا نكتب جميع المكونات بأنفسنا. تم بالفعل ذكر المكتبة. كويدغيتسونستخدم أيضًا:

لا يزال من الممكن متابعة القائمة.
بالإضافة إلى ذلك ، نحن نستخدم نسخة معدلة بشكل كبير اختبار جوجل и جوجل موك عند تطوير اختبارات الوحدة.
تطلبت المكتبات تكييفها لتكون متوافقة مع نموذج تنظيم مكون SCOM.
إن انتشار 1C يجعل النظام الأساسي اختبار قوة ممتازًا للمكتبات المستخدمة فيه. تجد مجموعة متنوعة من المستخدمين والبرامج النصية أخطاءً بسرعة حتى في أكثر أجزاء الكود استخدامًا نادرًا. نصلحها في المنزل ونحاول إعادتها إلى مؤلفي المكتبات. تجربة التفاعل مختلفة جدا.
المطورين حليقة и com.libetpan تستجيب بسرعة لطلب السحب ، ولكن التصحيح ، على سبيل المثال ، في بينسل لم نتمكن من إعادتها أبدًا.

اختتام

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

كيف يتم تنفيذ منصة 1C للجوال؟
وصف الجهاز الداخلي لعميل الويب؟
أو ربما تكون مهتمًا بعملية اختيار الميزة للإصدارات الجديدة والتطوير والاختبار؟

اكتب في التعليقات!

المصدر: www.habr.com

إضافة تعليق