
KĂĽrzlich haben wir
einen Artikel veröffentlicht , der die Probleme einer der beliebtesten Technologien in der IT beschreibt, und zu unserer Überraschung hat er ein ziemlich lebhaftes Interesse geweckt (zumindest für einen technischen Artikel). Aus diesem Grund haben wir uns entschlossen, hier nicht aufzuhören, und heute werden wir eines der beliebtesten Produkte auf dem russischen Markt für die Entwicklung von Geschäftsanwendungen „besuchen“ - die 1C-Plattform.
Es ist so passiert, dass viele 1Cs den Hub nicht mögen, aber manchmal scheint es, dass nur wenige dieser Leute gut verstehen, wofür sie ihn nicht mögen. Mit diesem Artikel füllen wir diese Lücke und töten zwei Fliegen mit einer Klappe: Einerseits erklären wir Ihnen, wie alles in 1C von innen funktioniert, und andererseits, warum es nicht so funktioniert, wie es wünschenswert / wünschenswert wäre. Ich muss sagen, dass 1C mit vielen seiner Entscheidungen uns wirklich überraschen könnte, aber wir werden uns nicht selbst übertreffen.
Es gibt genug Artikel, die 1C auf Habré kritisieren (zum Beispiel
eins ,
zwei ,
drei ), aber meiner Meinung nach schenken sie entweder all den kleinen Dingen zu viel Aufmerksamkeit, wie das Menü falsch organisiert ist, oder sie sprechen über zu abstrakte Dinge, in denen 1C möglicherweise ist und nicht schuld. Im selben Artikel sowie im Artikel über SQL werden wir uns ausschließlich auf grundlegende (und durchaus greifbare) Probleme konzentrieren, die alle und jeden betreffen, der Lösungen in 1C entwickelt / verfeinert und entweder zu einer signifikanten Erhöhung der Eintrittsschwelle oder zu einer ernsthaften führen ein Rückgang der Produktivität oder erhebliche Arbeitskosten seitens des Entwicklers.
Also lass uns gehen. In 1C gibt es viele Probleme. Um die Navigation zu vereinfachen, beginnen wir mit einem Inhaltsverzeichnis (mit einer Liste all dieser Probleme):
Ich habe versucht, die Abschnitte in der Reihenfolge von grundlegenden Konzepten / Problemen zu komplexeren zu erstellen, obwohl sie zum größten Teil in keiner Weise miteinander verbunden sind. Wenn jemand zu faul ist, um den gesamten Artikel zu lesen, können Sie einfach die einzelnen Abschnitte seines Interesses aus dem Inhaltsverzeichnis lesen. Es gibt praktisch keine Querschnittshandlung.
Objekte: Verzeichnisse, Dokumente usw.
Wie sind ORM-Frameworks / -Plattformen normalerweise angeordnet? In der Entwicklungssprache des ORM-Frameworks werden Objektklassen in der einen oder anderen Form unterstützt. Für jede dieser Klassen kann der Entwickler die Zuordnung zu einer Tabelle angeben. In der Regel entspricht eine Klasse einer Tabelle, deren einziger Schlüssel wiederum der Kennung eines Objekts dieser Klasse entspricht. Hier stellt sich natürlich die Frage, was mit Tabellen mit mehreren Schlüsseln zu tun ist. Für sie werden auch entsprechende Klassen erstellt, da die meisten ORMs mehrere Felder derselben Klasse als Bezeichner unterstützen. Manchmal erhalten wir bei einer solchen Zuordnung natürlich ziemlich vollständige Abstraktionen wie CommodityWarehouse, aber in den meisten Fällen werden Daten im selben Paradigma (OOP) behandelt.
In 1C beschlossen sie, den anderen Weg zu gehen und beide Paradigmen gleichzeitig zu unterstützen. Sie haben gleichzeitig Objekte und Aufzeichnungen. Die Logik von Datensätzen wird von Registern und Abfragen verwendet (dazu in den folgenden Abschnitten). Die Logik von Objekten ähnelt jedoch einem regulären ORM mit eigenen Merkmalen:
- Der Entwickler kontrolliert die Anzeige in Tabellen nicht und ist im Allgemeinen davor verborgen (obwohl nichts Besonderes daran ist).
- Es gibt keine Eins-zu-Viele-, Viele-zu-Viele-Zuordnungen, ihre Funktion wird von den sogenannten tabellarischen Teilen ausgeführt - Sammlungen interner Objekte, die tatsächlich zum Hauptobjekt zusammengefasst werden.
Ineffizientes Abrufen von Objektdaten
Da das vorzeitige oder übermäßige Lesen von Daten vom Datenbankserver und das Übertragen auf den Anwendungsserver zu einem erheblichen Leistungsabfall führen kann, bieten ORM-Frameworks dem Entwickler normalerweise eine ganze Reihe von Tools zum Verwalten der empfangenen Daten. Aber nicht 1C. In 1C wird ein Objekt immer vollständig gelesen, auch mit tabellarischen Teilen, jedoch nicht mehr (ohne zugehörige Daten). Als Ergebnis werden die Daten gelesen:
- oder zu viel - wenn Sie nur ein Feld (Requisiten) benötigen
- oder zu wenig - wenn Sie in der Schleife auf andere Objekte als Referenz zugreifen mĂĽssen, erhalten wir das klassische N + 1-Problem (eine Anforderung zum Abrufen von N Objekten und eine Anforderung fĂĽr jeden Link).
Ein solches Elend des ORM-Mechanismus in 1C ist tatsächlich auf die Tatsache zurückzuführen, dass sie in 1C irgendwann einfach beschlossen haben, ORM aufzugeben und sich auf Bare SQL (dh Register und Abfragen) zu verlassen. Mit Blick auf die Zukunft kehren sie angesichts des Mangels an erweiterten SQL- und DML-Funktionen in 1C regelmäßig zu ORM zurück. Dies ist jedoch eher eine notwendige Notwendigkeit. Im Allgemeinen sieht ein typischer Code für typische Lösungen in 1C ungefähr so ​​aus:
Codebeispiel (, , = )
////////////////////////////////////////////////////////////////////////////
//
= ;
(, );
////////////////////////////////////////////////////////////////////////////
//
= ;
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
(, , );
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 , .
( ). :
, , 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? , , — . , , , — , , .. ( , ). :
. myForm otherForm, ( , ) .
, , 1 , , . / . :
- ( ). & 1 . , ( ), .
- «» ( Java EE) . , .
- ( , , windows ) , . ( )
, , . , 1 , . , (, ), ( ). - - , . . , , , , 1 () , , :
, , , 1 - .
? , , , ? , - , , . 1 - .
:
, . , , .
, - .
1 . , , - , . - :
&
()
= ("", );
();
&
(, )
();
&
()
= ("", );
= ("", , );
(, " ?", .);
&
(, )
= ?( = .,
" ...",
" !");
<> . <>
(., );
;
WYSIWYG:
/ WYSIWYG. , , , 1 , WYSIWYG , 1 .
1 . :
, , , ( ). 1 — , . , , , :
/
, , , . , / 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 . () :
- , 1. (, ) . , , — .
1 - . , . , , , ( , , ), , ( ) , .
: OLAP , , ( , — _Fld16719 _Document5759).
1 , , 1.
, . 1, , 1 - SQL, SQL
, 1 .
, , «, , if'» . , 1, , , :
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).