
最近,我们发表
了一篇文章,描述了IT中使用的最流行技术之一的问题,令人惊讶的是,它引起了人们的极大兴趣(至少对于技术文章而言)。 因此,我们决定不止于此,今天,我们将“探访”俄罗斯市场上用于开发业务应用程序的最受欢迎产品之一-1C平台。
碰巧的是,许多1C都不喜欢这个中心,但有时似乎这些人中很少有人了解得很好,他们对此并不满意。 在本文中,我们填补了这一空白,并用一块石头杀死了两只鸟:一方面,我们将从内部告诉您一切在1C中如何工作,另一方面,为什么它不按预期工作? 我必须说1C的许多决定确实会让我们感到惊讶,但是,我们将无法超越自己。
在哈布雷(Habré)上有足够多的文章批评1C(例如,
一 ,
二 ,
三 ),但我认为,他们要么对所有小事情都过于关注,例如菜单的组织不正确,要么谈论过于抽象的事情,其中可能会出现1C。而且不要怪。 在同一篇文章中以及在有关SQL的文章中,我们将仅关注基本(且十分明确)的问题,这些问题涉及每个人以及在1C中开发/完善解决方案的每个人,并导致进入门槛的显着提高或严重的降低。开发人员的生产力下降或大量人工成本。
所以走吧 1C中存在很多问题,因此,为了使导航更方便,我们从目录开始(列出所有这些问题):
我尝试按照从基本概念/问题到更复杂的概念/顺序的顺序构建这些部分,尽管实际上在大多数情况下它们之间并没有任何联系。 因此,如果某人懒于阅读整篇文章,则可以从目录中阅读他感兴趣的各个部分,实际上没有交叉图。
对象:目录,文档等
通常如何安排ORM框架/平台? 在ORM框架的开发语言中,以一种或另一种形式支持对象类。 对于这些类中的每一个,开发人员都可以指定其到某个表的映射。 通常,一个类对应一个表,该表的唯一键又对应于该类的对象标识符。 当然,这里的问题是如何处理具有多个键的表。 还为它们创建了相应的类,因为大多数ORM支持将同一类的多个字段作为标识符。 当然,有时候,通过这样的映射,我们会得到诸如GoodsNaStore之类的功能完善的抽象,但是在大多数情况下,数据是在相同的范式(OOP)中处理的。
在1C中,他们决定走另一条路,同时支持两种范例,同时拥有对象和记录。 记录的逻辑由寄存器和查询使用(在以下各节中有关于它们的用法),对象的逻辑类似于常规的ORM,但是具有自己的特征:
- 开发人员不控制表格上的显示,通常它是隐藏在表格上的(尽管没有什么特别的地方)
- 没有一对多,多对多映射;它们的功能由所谓的表格部分执行-表格中的内部对象集合实际上已经聚合到主对象中。
对象数据检索效率低下
由于从数据库服务器中不及时或过多地读取数据并将其传输到应用程序服务器会导致性能显着下降,因此ORM框架通常为开发人员提供了用于管理接收到的数据的整套工具。 但不是1C。 在1C中,始终完整读取对象,包括表格部分,但不读取任何内容(没有任何关联的数据)。 结果,读取了数据:
- 或太多-如果您只需要获取一个字段(道具)
- 还是太少了-如果在循环中您需要通过引用访问其他对象,则会遇到经典的N + 1问题(一个请求获取N个对象,每个链接一个请求)。
实际上,在1C中,ORM机制的这种可怜之处是因为,在1C中,他们只是简单地决定放弃ORM并依赖裸露的SQL(即寄存器和查询)。 没错,向前看,考虑到1C中缺少高级SQL和DML功能,它们会定期返回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 , .
( ). :
, , 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).