لماذا لا 1C؟



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

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

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

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


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

الكائنات: الدلائل ، المستندات ، إلخ.


كيف يتم ترتيب الأطر / المنصات ORM عادة؟ في لغة التطوير الخاصة بإطار عمل ORM ، يتم دعم فئات الكائنات بشكل أو بآخر. لكل من هذه الفئات ، يمكن للمطور تحديد تعيينه إلى بعض الجداول. كقاعدة عامة ، تتوافق فئة واحدة مع جدول واحد ، والمفتاح الوحيد الذي ، بدوره ، يتوافق مع معرف كائن من هذه الفئة. هنا ، بطبيعة الحال ، السؤال الذي يطرح نفسه هو ما يجب فعله مع الجداول التي تحتوي على عدة مفاتيح. يتم إنشاء فصول مقابلة لهم أيضًا ، لأن معظم ORM تدعم مجالات عديدة من نفس الفئة مثل المعرفات. في بعض الأحيان ، بالطبع ، مع مثل هذا التعيين ، نحصل على بعض التجريدات الكاملة مثل GoodsNaStore ، ولكن في معظم الحالات يتم التعامل مع البيانات في نفس النموذج (OOP).

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

  • لا يتحكم المطور في العرض على الجداول ، وبشكل عام يتم إخفاءه عن ذلك (على الرغم من أنه لا يوجد شيء خاص به)
  • لا توجد مناظرات واحد إلى كثير ، كثير إلى كثير ؛ يتم تنفيذ وظيفتها بواسطة ما يسمى الأجزاء المجدولة - مجموعات الكائنات الداخلية التي تم تجميعها بالفعل في الكائن الرئيسي.

استرجاع غير فعال لبيانات الكائن


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

  • أو أكثر من اللازم - إذا كنت بحاجة إلى الحصول على حقل واحد فقط (الدعائم)
  • أو القليل جدًا - إذا كنت في الحلقة تحتاج إلى الوصول إلى كائنات أخرى حسب المرجع ، فسنواجه مشكلة N + 1 الكلاسيكية (طلب واحد للحصول على كائنات N وطلب واحد لكل رابط).

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

مثال رمز
 (, ,  = ) 

	////////////////////////////////////////////////////////////////////////////
	//    
	
	 =  ;
	(, );
	
	////////////////////////////////////////////////////////////////////////////
	//   
	
	 =  ;
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	0(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	(, , );
	.(, , ., );
	


 (, , )
	 = "";
	
	  .(, ) 
		 "";
	; 
	
	 =
	"
	|	(.)  ,
	|	&  ,
	|	.  ,
	|	.  ,
	|	.  ,
	|	
	|		 .  (10, 14)
	|			 .
	|		 (..)
	|	  ,
	|	.  ,
	|	
	|		 ..  ((..), (..))
	|			 .
	|		 (..)
	|	  ,
	|	0  ,
	|	.  ,
	|	.  
	|
	|	..  
	|
	|	. = &
	|	 . <> 0
	|	 & <> (..)
	|	 &
	|	 &
	|
	| 
	|
	|
	|	(.),
	|	&,
	|	.,
	|	.,
	|	.,
	|	
	|		 .  (10, 14)
	|			 .
	|		 (..)
	|	,
	|	.,
	|	
	|		 ..  ((..), (..))
	|			 .
	|		 (..)
	|	,
	|	.,
	|	.,
	|	.
	|
	|	..  
	|
	|	. = &
	|	 . <> 0
	|	 & = (..)
	|	 &
	|	 &
	|
	| 
	|
	|
	|	(.),
	|	&,
	|	.,
	|	.,
	|	.,
	|	
	|		 .  (10, 14)
	|			 .
	|		 (..)
	|	,
	|	.,
	|	
	|		 ..  ((..), (..))
	|			 .
	|		 (..)
	|	,
	|	0,
	|	.,
	|	.
	|
	|	..  
	|
	|	. = &
	|	 . = 0
	|	 &
	|	 &
	|
	| 
	|
	|
	|	(.),
	|	&,
	|	.,
	|	.,
	|	.,
	|	
	|		 .  (10, 14)
	|			 .
	|		 (..)
	|	,
	|	.,
	|	
	|		 ..  ((..), (..))
	|			 .
	|		 (..)
	|	,
	|	0,
	|	.,
	|	.
	|
	|	..  
	|
	|	. = &
	|	 . = 0
	|	 &
	|	 &";
	
	.(, );
	 ;
	



/ :


1 , :

  • ( )
  • ( )
  • / ( , )

- . — , — , () ( )

— ERP- 1 . , SQL ( ), , — , . 1 , , , . — . ( 1 ).

1 :

  • ( ) — ( )
  • , , ( ) — ( )

SQL, , 1 ( ) SQL.


, 1 : , . , MS SQL, Oracle. , , — ( / ) () .

( ), SQL : 1 , , / , / , ( ).


1 , , . , , 0, - . SQL , 1 . ? , , :

( SQL per-statement trigger on before) :

//       ,
	//         .
	 =  ;
	.("", ..);
	. = ...;
	. =
	"
	|	.       ,
	|	.  ,
	|	.      ,
	|	.    ,
	|	.        ,
	|	.             ,
	|	.             ,
	|	.        ,
	|	
	|		 . = (.)
	|			 . + .
	|		 -. - .
	|	                     ,
	|	
	|		 . = (.)
	|			 .
	|		 -.
	|	                     ,
	|	
	|		 . = (.)
	|			 -.
	|		 .
	|	                     ,
	|	
	|		 . = (.)
	|			 -.
	|		 .
	|	                     
	| 
	|
	|	.  
	|
	|	. = &";
	.();


(on after) + :

 = ..;
		
		 =  ;
		 = ..() = ..;
		.("", );
		.("", ..);
		. = .;
		
		//          
		//     .
		
		. =
		"
		|	.            ,
		|	.                ,
		|	.              ,
		|	.                  ,
		|	.                       ,
		|	.                       ,
		|	.                  ,
		|	(.)   ,
		|	(.)  ,
		|	(.)  
		| 
		|
		|	(
		|		.             ,
		|		.        ,
		|		.            ,
		|		.          ,
		|		.              ,
		|		.                   ,
		|		.                   ,
		|		.              ,
		|		.   ,
		|		.  ,
		|		.     
		|	
		|		  
		|	
		|	 
		|	
		|	
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		
		|			 . = (.)
		|				 -.
		|			 .
		|		,
		|		
		|			 . = (.)
		|				 .
		|			 -.
		|		,
		|		
		|			 . = (.)
		|				 .
		|			 -.
		|		
		|	
		|		.  
		|	
		|		. = &)  
		|
		| 
		|	.,
		|	.,
		|	.,
		|	.,
		|	.,
		|	.,
		|	.,
		|	.
		|
		|
		|	((.) > 0
		|		 (.) > 0
		|		 (.) > 0)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|
		|	.              ,
		|	.            ,
		|	.                ,
		|	.                     ,
		|	.                     ,
		|	.                     ,
		|	(.)  
		| 
		|
		|	(
		|		.     ,
		|		.    ,
		|		.  ,
		|		.      ,
		|		.           ,
		|		.           ,
		|		.           ,
		|		-.  
		|	
		|		  
		|
		|	. <> (..)
		|    ..
		|	
		|	 
		|	
		|	
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		.,
		|		
		|			 . = (.)
		|				 . + .
		|			 -. - .
		|		
		|	
		|		.  
		|	
		|		. = &)  
		|
		|	. <> (..)
		|    ..
		|
		| 
		|	.,
		|	.,
		|	.,
		|	.,
		|	.,
		|	.,
		|	.
		|
		|
		|	(.) > 0
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		| ";
		
		 = .();
		 = [0].();
		.();
		//       .
		//            .
		.("", . > 0);
		
		 = [1].();
		.();
		.("", . > 0);


( ) , 0.

 (,"") 

		.((""));

		 =  + 
		"
		|
		|	.       ,
		|	..   ,
		|	.     ,
		|	.    	   ,
		|	.              ,
		|	.              ,
		|	(.)  
		|
		| 
		|(
		|	.        ,
		|	.      ,
		|	.     	  ,
		|	.               ,
		|	.               ,
		|	-. - .  
		|
		|	..(
		|			,
		|			(, , , , ) 
		|				(
		|					.,
		|					.,
		|					.,
		|					.,
		|					.
		|				
		|					  ))  
		| 
		|
		|
		|	.     ,
		|	.   ,
		|	.	   ,
		|	.            ,
		|	.            ,
		|	.  
		|
		|	..(
		|			,
		|			(, , , , ) 
		|				(
		|					.,
		|					.,
		|					.,
		|					.,
		|					.
		|				
		|					  ))  
		|)  
		|
		| 
		|	.,
		|	.,
		|	.,
		|	.,
		|	.
		|
		|
		|	(.) < 0	
		|;
		|///////////////////////////////////////////////////////////////////
		|";
	;


PS: , , .

( ), 1 ( ). 1 , .


SQL . , :

     =  ;
    . = 
        "
		|	.  ,
		|	.  ,
		|	.  
		|
		|	.  
		|		  ..(.,  = .)  
		|		 . = .
		|		 . = & "
		;
     = .();

2 : “ ” “ ”. - IN () ( 1, ), , , , , , — . SQL JOIN — LATERAL JOIN APPLY, 1 . , , , , . / . , .

, , , 1 , . 1 , , , . , (OLTP) , ( ), (, , , ).


1 SQL, SQL. , , SQL, 1 , .


( ). :

  • IDE , , , , ..
  • , , .

, , 1 (C, ), ( ). , 1 . - , , .


1 — SQL- 1 , . . , (MS SQL, Oracle), 1 PostgreSQL, « , ». , , PostgreSQL Join Predicate Push Down ( ). 1 , .

1 — ( , ). . , :

, - , ( , ). , .

1 « », . « » . . - , . (). :


    .,
    .

    ..  
          ..(,
                               (
                                    
                                    ..
                                     = &))  
         . = .

    . = & 
    (. < . 
        .  NULL)

, , 1 , « » , , PostgreSQL, ( IN / EXISTS PostgreSQL ). , , , ( ).

SQL


, SQL 1 , , , . , - , CTE, 1 , . , , , , 1 , SQL- 1 SQL 92. , , ( ), ORM, , , 1 .


, . , SQL, 1 ( DML), . , , ORM ( ) .


SQL ( CI ACID). ( ). , , , - , . , , , .

. , , . , , «» . (MVCC) Oracle PostgreSQL -, , .

, . , , , , ( , ), , . ? , ( ). , «» , :

  • , . , , , , , SQL ( ), 1, .
  • , , «» , FOR UPDATE ( ).

, , , ( ), , ( ).

1. ? . . ( ). . , . , - . — .

, «» 1 . , , / , , , .


ERP , , , . 1 . 1 Access, .

:


. - , , ( , ), . — ( -, ) , . ( ), — .

1? , , — . , , , — , , .. ( , ). :
f() <- someData(); //       myForm
DIALOG myForm OBJECTS a INPUT DO // ,   - 
     IF isSomething(a) DO //          -  
         DIALOG otherForm OBJECTS b = a DO { // ,         b
             g(b) <- someInput(b); //    b
             APPLY//    
         }

. myForm otherForm, ( , ) .

, , 1 , , . / . :

  • ( ). & 1 . , ( ), .
  • «» ( Java EE) . , .
  • ( , , windows ) , . ( )


, , . , 1 , . , (, ), ( ). - - , . . , , , , 1 () , , :

  • ( )
  • ,


, , , 1 - .

? , , , ? , - , , . 1 - . :

, . , , .

, - .

1 . , , - , . - :

&
 ()
        =  ("", );
       ();


&
 (, ) 
       ();



&
 ()
        =  ("", );
        =  ("", , );
       (, " ?", .);



&
 (, ) 
        = ?( = ., 
             "  ...", 
             " !");
         <>   . <>  
             (., );
       ;


WYSIWYG:


/ WYSIWYG. , , , 1 , WYSIWYG , 1 .

1 . :

  • : (, ), ( ) ..
  • : , .

, , , ( ). 1 — , . , , , :

  • , / / . , ( 50), , , , 1C , ( ) — . , :
    
    			.  ,
    			.  ,
    			.  
    		
    			.  
    				  ..(&, )  
    				 . = ."
    

    ( ) .
  • — . 1 , , - , . , , , , — . .

    1? . ( , ) . , , ( , , ). « ». , . , ( ), , , .

    , 1 , , , ( -WYSIWYG). , , . , , .

/


, , , . , / 1 , .

, , , :

  • &
  • :


    • (, )
    • ( , )

. « » , .

, ( ) — 1 (, , ).

, , 1 , . , , , , , , .


1, , 1 , - . , , 1 , . :



: ? , , , , , 1, , .

  • /

    ORM. , ( ), , 1 , (), . , , 1 .
  • /

    , . , / C#, C++. . , , — . — - ( ), ( ) . , ( ORM, ORM) .
  • /

    ( ) , . 1 - , (, ) (, ) . 1 , . , . , , ( ). , ( ).

    , , , , . - .

    1 , . , ( , ).
  • / / (BI)

    - : OLTP OLAP. - -: . OLAP — , «» , . OLTP , OLAP . , , OLTP - , , / , , -, ( ), -, - , . , , , ( OLAP), , .

    OLAP , SQL - , . .

    1 . () :

    • ( )
    • ( , ) BI
    • , , , ,
    • ,

    - , 1. (, ) . , , — .


1 - . , . , , , ( , , ), , ( ) , .

: OLAP , , ( , — _Fld16719 _Document5759).

1 , , 1.


, . 1, , 1 - SQL, SQL , 1 .

, , «, , if'» . , 1, , , :

  • , ( , ORM, )
  • :

     (, , ) 
    	
    	  =  
    		 = .();
    	;
    	
    	(                             										, );
    	( 										, , );
    	( 										, , );
    	( 										, , );
    	(     										, , );
    	(  										, , );
    	(												, , );
    	.(					, );
    	GTIN(                                                                           , );
    	.(				, , ); 
    	.(	, );
    	.(						, , );
    	.(				, , );
    	.(						, , );
    	.(				, , );
    	.(						    , , );
    	.(						, , );
    	.(						, , );
    	.(								, , );
    	.(							, , );
    	.(					, , );
    	(                              										, ); 
    	(                          										, , );
    	(            										, , );
    	(                          										, , );
    	(                        										, , );
    	(                       										, );
    	(                        										, );
    	(                            										, , );
    	(              										, );
    	(                                    										, );
    	.(					, , );
    	.(						, , );
    	.(
    		, , );
    	.(					, , );
    	.(								, , );
    	.(						, , );
    	.(				, , );
    	.(				, , );
    	.(							, , );
    	(                     										, );
    	.(				, );
    	.(		, , );
    	.(				, , );
    	.(		, , );
    	(  										, , );
    	(                           										, , );
    	.(								, , );
    	.(							, );
    	.(								, , );
    	.(								, , );
    	.(							, , );
    	.(						, , );
    	(              										, , );
    	.(                       	, , );
    	.(                   	, );
    	.(                             	, , );
    	(                       										, , );
    	(											, , );
    	(                 										, , );
    	(                   										, );
    	.(                 	, );
    	.(                   	, );
    	.(                  	, );
    	(                              										, );
    	(            										, );
    	.(                                      	, );
    	(                                     										, );
    	(                                      										, );
    	(                 										, );
    	(										, );
    	.(	                     	, );
    	.(              	, );
    	.(            	, );
    	.(                  	, );
    	(                         										, );
    	.(                   	, , );
    	(       										, );
    	.(       	, );
    	(              										, );
    	.(               	, , );
    	.(             	, , );
    	(           										, , );
    	(           										, , );
    	(                       										, , );
    	(            										, , );
    	( 										, , );
    	(       										, , );
    	(               																, );
    	(                     											, );
    	(															, );
    	.(                 	, , );
    	.(                          , );
    	.(                           , );
    	.(                                       , );
    	.(                  , );
    	.(                 , );
    	.(							, );
    	.(			, );
    	(, );	
    	.(, );
    	.(                  	, , );
    	.(                            , , );
    	(                                                                     , , );
    	.(                  , );
    	(                                                       , );
    	(                                                        , );
    	(                                                 , );
    	(                                               , , );
    	
    
    

  • ( ):

    	 (, ) 
    
    	  .("") 
    		
    		;
    		
    	;
    	
    	. =  (.);
    	. =  (.);
    
    
    

20 Foxpro ( IF TYPE(«tableA.fldB») = «C») , . , 2019 .

P.S.: 1 , .


1 . — (). , , ( , , 1 ). 1 , , . , , :

  • , .
  • , , , . , «» «» «» , :
     .
     .  
      .  
     . = .
    

  • , .
  • , , .
  • , .
  • .


, ( ). : « — ».

( , ..). . , , . IDE () - , , , , .

, , 1 . , -, , , , .


- . ( ) , , , , ( ), - , . .

1 . , -, , , . , ( ), 1 . , 1 :

, . -, , . -, , , , .

, .

-, — :

  • , , , 1 ( -)
  • , , N+1, , . 1 , (, ), , 1 .
  • , , , 1
  • , ,

, , , 1 . — . :

  • , ( , )
  • , - ( )

, 1 « SAP» — , : « , best practice, ». , , ( «--»). - . — . , , , :

  • ( , / )
  • ( : , , )
  • . , ( , ), .


, low-code / no-code , . , / . — . / , . , / , , , . « , » , .

(--- vs ). , :

  • — gitflow ( )
  • / — / IDE
  • — , , , « , » , ,
  • — , , ..
  • — IDE ( , , ..). .
  • — , / , , :



:

  • . .
  • . , , , .

. , . , «», «» . , , «» , «» , ? , , .

1. , 1 EDT, « ». language-based, 1 , , XML. . XML , :

  • ( , ). ( ) 1336 .
  • id, , , , .

/ — . ---, 1, . , , , .


, Microsoft 1, . , 1 , :

  • IDE — IDEA, Eclipse, Microsoft Visual Studio / VSCode . IDEA , .
  • — git , subversion mercurial . 1 git, , .
  • — / , PostgreSQL, . , , 1 - SQL-92 , .

    PostgreSQL, ( , 1 ), . .
  • — , , . 1 - ( ) BI. 1 , .
  • — 1 . , , , , ( -). language-based (, , SAP SQL, ), . 1 , . : « , , ». 1 - . , , , / — , , , callback' — .
  • / — Jenkins TeamCity, Java — Maven, Gradle, JavaScript — npm, Python — pip .. community, , , IDE . 1 -, , , , , , .
  • UI . , , Linux, MacOS ( Java ), , « » .

, 1 , Eclipse. , , , ( ERP) . , , Eclipse stub , (chameleon ), language injection .., IDEA ( Eclipse , , EDT ).

, EDT 1 IDE. , « ». , , Eclipse IDEA, 1 IDE.


1 . : 1: 8. 22 600 . (!). ? , : 1: 8 . 100 — 360 000. 1: 8.3 . — 86 400. , , (!) . , , , . , 22 600 . .

1 , , — 1 , ( ) — . , IT, : « / 1». , , : , — 1. — . , , , ( ) . :

  • 1 , , , , - , ( ). : « 20 1 , ?». - , , ( ).
  • , / 1 ( , , ..). , 1, - , , «1 », 1.

, IT- . , , . 1 , 1 . , , , , .


, , , 1 :

  • ORM
  • SQL:



  • control flow


  • WYSIWYG

, goto. . , «» . , , . — . , , — .

, , — , . , , . , , lsFusion , , , . .

, 1 , , (, , ) . , . , . , : , . IT , ( ) Oracle, SAP Microsoft .

, 1 - . , . , — , , , « ». 1 , - ( «») — , , . lsFusion, , .Net+MSSQL Python+PostgreSQL . , , , . — ( , .Net) ? - : — , . IT. - ? , , , , , .

Axapta SAP. , ( 1 ), , , , , , . , , . , , , , , , , ( Axapta SAP , 1).

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


All Articles