
A manchete saiu cativante, mas fervendo. Devo dizer imediatamente que falaremos sobre 1C. Caros apelidos 1C, você não sabe trabalhar com transações e não entende o que são exceções. Cheguei a essa conclusão examinando uma grande quantidade de código 1C, nascido nos confins da empresa doméstica. Em configurações típicas, isso é muito bom, mas a quantidade terrível de código personalizado é gravada de maneira incompetente em termos de trabalho com o banco de dados. Você já viu o erro "Erros já ocorreram nesta transação"? Nesse caso, o título do artigo se aplica a você. Vamos analisar por baixo, finalmente, o que são transações e como lidar com elas corretamente ao trabalhar com 1C.
Por que você precisa tocar o alarme
Para começar, vamos descobrir o que constitui o erro "Já ocorreram erros nesta transação". De fato, isso é extremamente simples: você está tentando trabalhar com um banco de dados dentro de uma transação já cancelada (cancelada). Por exemplo, o método Cancelar Transação foi chamado em algum lugar e você está tentando confirmá-lo.
Por que isso é ruim? Porque esse erro não informa nada sobre onde o problema realmente aconteceu. Quando uma captura de tela com esse texto chega ao suporte do usuário, e especialmente para o código do servidor com o qual as pessoas não interagem interativamente, isso ... eu queria escrever um "erro crítico", mas achei que era uma palavra da moda que ninguém presta atenção ... Isso é um idiota. Este é um erro de programação. Esta não é uma falha acidental. Este é um batente que precisa ser refeito imediatamente. Como quando os processos do servidor em segundo plano se levantam à noite e a empresa começa a perder dinheiro rapidamente, “já ocorreram erros nesta transação” é a última coisa que você deseja ver nos logs de diagnóstico.
Existe, é claro, a possibilidade de que o registro tecnológico do servidor (incluído na produção, certo?) De alguma forma ajude a diagnosticar o problema, mas, no momento, não consigo adivinhar de imediato como encontrar a verdadeira razão do erro indicado. Mas o verdadeiro motivo é esse: o programador Vasya conseguiu uma exceção na transação e decidiu que uma vez - não karabas "pense, erro, vamos seguir em frente."
O que são transações no 1C
É embaraçoso escrever sobre verdades elementares, mas, aparentemente, um pouco precisará. As transações em 1C são iguais às transações em um DBMS. Essas não são algumas transações especiais “1C”, são transações no DBMS. De acordo com a idéia geral das transações, elas podem ser executadas na sua totalidade ou não. Todas as alterações nas tabelas do banco de dados feitas em uma transação podem ser desfeitas imediatamente, como se não houvesse nada.
Em seguida, você precisa entender que o 1C não suporta transações aninhadas. Na verdade, eles não são suportados não "em 1C", mas não são suportados. Pelo menos, aqueles DBMS com os quais 1C é capaz de trabalhar. As transações aninhadas, por exemplo, não estão presentes no MS SQL e no Postgres. Cada chamada "aninhada" para Iniciar Transação simplesmente aumenta o contador de transações, e cada chamada para "Confirmar Transação" diminui esse contador. Esse comportamento é descrito em muitos livros e artigos, mas as conclusões desse comportamento, aparentemente, não são bem compreendidas. Estritamente falando, no SQL existe o chamado SAVEPOINT, mas 1C não os utiliza, e a coisa é bem específica.
A seguir, especialmente para os Guerreiros da Verdadeira Fé, que acreditam que o código deve ser escrito apenas em inglês, nos spoilers será dado um análogo do código na sintaxe inglesa 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" — . .