(12) В общем, посмотрел в ночи.
Картина при записи существующего документа такая:
1. Событие 1С ПриЗаписи() Обрабатывается вне транзакции.
2. После завершения ПриЗаписи(). Платформа считывает какие-то данные, видимо необходимые ей для записи. В разных базах - разные наборы данных. В моей тестовой, в которой документ состоит из Одного реквизита шапки и 2-х в МнЧ, был один вызов:
Код |
---|
exec _1sp__1SJOURN_ByIDDOC ' D ' |
Однако в боевой базе какие-то горы запросов к _1SCONST и хранимые процедуры, читающие данные справочников.
3. Дальше идет установка режима неявной транзакции:
Код |
---|
set implicit_transactions on |
4. Блокировка _1SJOURN:
Код |
---|
exec _1sp__1SJOURN_TLockX |
.
4.1.
Тут открывается транзакция.
5. UPDATE-ит _1SJOURN на случай изменения состояния документа или изменения общих реквизитов документов:
6. Добавляются новые строки в таблицу DT:
Код |
---|
exec sp_executesql N'Ins ert in to DT111 values( @P1,@P2,@P3,@P4)',N'@P1 varchar(9),@P2 smallint,@P3 varchar(9),@P4 numeric(10,0)',' D ',2,' 1 ',3 |
.
Здесь уже известен номер добавляемой строки (это параметр @P2, равный 2), т.е. платформа уже сама расчитала номер строки.
7. Снова перечитываются данные документа из журнала:
Код |
---|
exec _1sp__1SJOURN_ByIDDOC ' D ' |
8. Завершается транзакция:
9. И, собственно, все.
Обращаю внимание, что в процессе записи ни разу не было запроса к DT на получение последнего номера номера строки (столбец LINENO_), значит (вероятнее всего) это было сделано при открытии документа.
Возвращаясь к нашим баранам можно сделать вывод, что что-то и где-то до начала SQL-транзакции "ломает" номер добавляемой строки.