
Le titre est sorti accrocheur, mais bouillonnant. Je dois dire tout de suite que nous parlerons de 1C. Chers surnoms 1C, vous ne savez pas comment travailler avec les transactions et ne comprenez pas quelles sont les exceptions. Je suis arrivé à cette conclusion en examinant une grande quantité de code 1C, né dans la nature de l'entreprise nationale. Dans les configurations typiques, c'est assez bon, mais la quantité épouvantable de code personnalisé est écrite de maniÚre incompétente en termes de travail avec la base de données. Avez-vous déjà vu l'erreur "Des erreurs se sont déjà produites dans cette transaction"? Si oui, le titre de l'article s'applique à vous. Regardons sous la coupe, enfin, quelles sont les transactions et comment les gérer correctement lorsque vous travaillez avec 1C.
Pourquoi vous devez faire sonner l'alarme
Pour commencer, dĂ©couvrons ce qui constitue l'erreur "Des erreurs se sont dĂ©jĂ produites dans cette transaction". En fait, c'est une chose extrĂȘmement simple: vous essayez de travailler avec une base de donnĂ©es dans une transaction dĂ©jĂ pompĂ©e (annulĂ©e). Par exemple, la mĂ©thode Cancel Transaction a Ă©tĂ© appelĂ©e quelque part et vous essayez de la valider.
Pourquoi est-ce mauvais? Parce que cette erreur ne vous indique pas oĂč le problĂšme s'est rĂ©ellement produit. Lorsqu'une capture d'Ă©cran avec un tel texte est prise en charge par l'utilisateur, et en particulier pour le code serveur avec lequel les gens n'interagissent pas de maniĂšre interactive, ceci ... Je voulais Ă©crire une "erreur critique", mais je pensais que c'Ă©tait un mot Ă la mode auquel personne ne prĂȘtait attention ... Ceci est un Ăąne. Il s'agit d'une erreur de programmation. Ce n'est pas une panne accidentelle. Il s'agit d'un montant qui doit ĂȘtre refait immĂ©diatement. Parce que lorsque vos processus de serveur d'arriĂšre-plan se lĂšvent la nuit et que l'entreprise commence Ă perdre rapidement de l'argent, «les erreurs se sont dĂ©jĂ produites dans cette transaction» est la derniĂšre chose que vous souhaitez voir dans les journaux de diagnostic.
Il y a, bien sûr, la possibilité que le journal technologique du serveur (il est inclus dans la production, non?) Aide en quelque sorte à diagnostiquer le problÚme, mais maintenant je ne peux pas deviner immédiatement comment trouver la vraie raison de l'erreur indiquée. Mais la vraie raison en est une - le programmeur Vasya a obtenu une exception dans la transaction et a décidé que une fois - pas des karabas "pense, erreur, passons."
Quelles sont les transactions dans 1C
C'est embarrassant d'Ă©crire sur des vĂ©ritĂ©s Ă©lĂ©mentaires, mais, apparemment, un peu devra le faire. Les transactions dans 1C sont les mĂȘmes que les transactions dans un SGBD. Ce ne sont pas des transactions spĂ©ciales «1C», ce sont des transactions dans le SGBD. Selon l'idĂ©e gĂ©nĂ©rale des transactions, elles peuvent ĂȘtre exĂ©cutĂ©es dans leur intĂ©gralitĂ© ou pas du tout. Toutes les modifications apportĂ©es aux tables de base de donnĂ©es dans une transaction peuvent ĂȘtre annulĂ©es immĂ©diatement, comme s'il n'y avait rien.
Ensuite, vous devez comprendre que 1C ne prend pas en charge les transactions imbriquées. En fait, ils ne sont pas pris en charge pas "en 1C", mais ne sont pas pris en charge du tout. Au moins, les SGBD avec lesquels 1C est capable de travailler. Les transactions imbriquées, par exemple, ne sont pas présentes dans MS SQL et Postgres. Chaque appel «imbriqué» à Start Transaction augmente simplement le compteur de transactions et chaque appel à «Commit Transaction» diminue ce compteur. Ce comportement est décrit dans de nombreux livres et articles, mais les conclusions de ce comportement ne sont apparemment pas bien comprises. Strictement parlant, en SQL il y a un soi-disant SAVEPOINT, mais 1C ne les utilise pas, et la chose est assez spécifique.
Ci-aprĂšs, en particulier pour Warriors of True Faith, qui croient que le code doit ĂȘtre Ă©crit uniquement en anglais, sous les spoilers se verra attribuer un analogue du code dans la syntaxe anglaise 1C.
()
();
= .();
. = " ";
.();
;
();
, ? . , . ? , . â . â deadlock, , , , . : deadlock .
, . 1- . , , 3 . , , 1 :)
, . 1 , "" "". , , :). , . , IT- .
, , ( ), . " ". , , . , . , , , ELK- 1 ⊠(, , , :))
, , . , , ".()". ( ) , .
, .
, (, "()") . "" , , - -, . , : , , .

. 1 SonarQube . , 1, , âŠ
? 90% . , 1 . , 1, .
:
()
= ();
();
, . - , . â - . â ⊠, ? "" , . , . , , , " -âŠ"
"-" : . . , , , - , . .
:
()
= ();
();
();
// , .
â . , ( â ) , . -, , .
, 3- . â .
. , , , .
1-
1 , . , . , :
()
();
= .();
. = " ";
.();
.(" %1", );
;
;
;
();
, , ? , . . â , , " ", . , .
, 1- , , . , . "()" 1 , . 1 (, -), "" . , " ".
, , , - "" . , - . , , .
, , . . .
1
, 1 . :
3 , . â , .
. ( ) , . , , .
? : : , , .
? :
();
();
();
, â . - , "" . , :
();
();
// ?
;
();
, , ? ? , , . ? ? , . "" . - throw.
();
();
;
;
();
, ⊠, ? : .
();
();
();
;
;
();
, , . , , (). , ? , , ? , , . , , . - .
, , "-" . :
**UPD: , . , -.
();
();
();
()
();
;
;
;
, "" . "" ""? , : , , . , . . . , . . . "" . , , , "" .
-
, .
:
();
();
();
"" , .
:
()
()
. , . . , . . .
:
()
()
: â . ? , - ? .
:
()
.()
//
//
;
();
- deadlock
- "",
:
()
.()
.();
(" ");
;
;
();
. . , . .
, , , , , 1 . , , , Highload, , . ORM, GUI, -, Reporting, . , , â 1, â . , , , , , -, . 1 . 20 / -. , , . - 1 , , . - "()"....
â , . 1 - . , . " 1" â . .