
Die Überschrift kam eingängig, aber kochend heraus. Ich muss sofort sagen, dass wir über 1C sprechen werden. Sehr geehrte 1C-Spitznamen, Sie wissen nicht, wie Sie mit Transaktionen arbeiten sollen, und verstehen nicht, welche Ausnahmen es gibt. Zu diesem Schluss kam ich, indem ich mir eine große Menge von 1C-Code ansah, der in der Wildnis des inländischen Unternehmens geboren wurde. In typischen Konfigurationen ist dies ziemlich gut, aber die schreckliche Menge an benutzerdefiniertem Code ist in Bezug auf die Arbeit mit der Datenbank inkompetent geschrieben. Haben Sie jemals den Fehler "Bei dieser Transaktion sind bereits Fehler aufgetreten" gesehen? Wenn ja, dann gilt der Titel des Artikels für Sie. Schauen wir uns zum Schluss an, was Transaktionen sind und wie sie bei der Arbeit mit 1C richtig gehandhabt werden.
Warum müssen Sie den Alarm auslösen?
Lassen Sie uns zunächst herausfinden, was den Fehler "Bei dieser Transaktion sind bereits Fehler aufgetreten" darstellt. Dies ist in der Tat eine äußerst einfache Sache: Sie versuchen, mit einer Datenbank innerhalb einer bereits abgepumpten (abgebrochenen) Transaktion zu arbeiten. Beispielsweise wurde die Methode "Transaktion abbrechen" irgendwo aufgerufen, und Sie versuchen, sie festzuschreiben.
Warum ist das so schlimm? Weil dieser Fehler nichts darüber aussagt, wo das Problem tatsächlich aufgetreten ist. Wenn ein Screenshot mit einem solchen Text vom Benutzer unterstützt wird, und insbesondere für Servercode, mit dem Benutzer nicht interaktiv interagieren, wollte ich ... einen "kritischen Fehler" schreiben, dachte aber, es sei ein Schlagwort, auf das niemand achtet ... Das ist ein Arsch. Dies ist ein Programmierfehler. Dies ist kein versehentlicher Fehler. Dies ist ein Pfosten, der sofort erneuert werden muss. Denn wenn Ihre Hintergrundserverprozesse nachts hochfahren und das Unternehmen schnell Geld verliert, ist „Fehler sind bereits bei dieser Transaktion aufgetreten“ das Letzte, was Sie in den Diagnoseprotokollen sehen möchten.
Es besteht natürlich die Möglichkeit, dass das technologische Protokoll des Servers (es ist in der Produktion enthalten, oder?) Irgendwie zur Diagnose des Problems beiträgt, aber jetzt kann ich nicht sofort erraten, wie der wahre Grund für den angegebenen Fehler darin gefunden werden kann. Aber der wahre Grund ist einer - der Programmierer Vasya hat eine Ausnahme innerhalb der Transaktion bekommen und das entschieden einmal - nicht Karabas "Denk nach, Fehler, lass uns weitermachen."
Was sind Transaktionen in 1C?
Es ist peinlich, über elementare Wahrheiten zu schreiben, aber anscheinend muss ein bisschen. Transaktionen in 1C sind dieselben wie Transaktionen in einem DBMS. Dies sind keine speziellen "1C" -Transaktionen, sondern Transaktionen im DBMS. Nach der allgemeinen Vorstellung von Transaktionen können sie entweder vollständig oder gar nicht ausgeführt werden. Alle Änderungen an den Datenbanktabellen, die innerhalb einer Transaktion vorgenommen wurden, können sofort rückgängig gemacht werden, als ob nichts vorhanden wäre.
Als nächstes müssen Sie verstehen, dass 1C keine verschachtelten Transaktionen unterstützt. Tatsächlich werden sie nicht "in 1C" unterstützt, aber überhaupt nicht. Zumindest die DBMS, mit denen 1C arbeiten kann. Verschachtelte Transaktionen sind beispielsweise in MS SQL und Postgres nicht vorhanden. Jeder "verschachtelte" Aufruf zum Starten der Transaktion erhöht einfach den Transaktionszähler, und jeder Aufruf zum "Festschreiben der Transaktion" verringert diesen Zähler. Dieses Verhalten wird in vielen Büchern und Artikeln beschrieben, aber die Schlussfolgerungen aus diesem Verhalten sind anscheinend nicht gut verstanden. Genau genommen gibt es in SQL eine sogenannte SAVEPOINT, aber 1C verwendet sie nicht, und die Sache ist ziemlich spezifisch.
Im Folgenden wird insbesondere für Warriors of True Faith, die der Meinung sind, dass der Code nur in Englisch geschrieben werden sollte, unter den Spoilern ein Analogon des Codes in der englischen Syntax 1C gegeben.
()
();
= .();
. = " ";
.();
;
();
, ? . , . ? , . — . — 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" — . .