Ошибка "В данной транзакции уже происходили ошибки" возникает после так называемой невосстановимой ошибки в транзакции 1С. Обычно это откат вложенной транзакции, в том числе не явной, например отказ от записи справочника, записи или проведения документа внутри другой транзакции. После того, как вложенная транзакция откатилась, во внешней транзакции может выполняться код 1С, который не обращается к базе данных. А попытка обратиться к базе данных (запрос, запись, удаление) приведет к появлению ошибки "В данной транзакции уже происходили ошибки". Исходную транзакцию бывает нелегко найти. Подробнее про ошибку https://its.1c.ru/db/metod8dev#content:2313:hdoc
Подробнее про bash и настройку ТЖ //infostart.ru/public/825405/
Для моделирования ошибки выполним процедуру ОсновнаяТранзакция().
&НаСервере
Процедура ВложеннаяТранзакция()
//может быть явной или неявной
//например: запись справочника, документа
НачатьТранзакцию();
ОтменитьТранзакцию();
КонецПроцедуры
&НаСервере
Процедура ОсновнаяТранзакция()
НачатьТранзакцию(); //строка 14
ВложеннаяТранзакция();
Счетчик = 0;
Счетчек = Счетчик + 1;
Запрос = Новый Запрос("Выбрать 1");
Запрос.Выполнить(); //строка 22
ЗафиксироватьТранзакцию();
КонецПроцедуры
Чтобы найти источник ошибки, можно открыть технологический журнал в notepad++, найти событие EXCP с содержанием «В данной транзакции уже происходили ошибки» и затем искать предшествующие ему события SDBL с тем же SessionID, в котором транзакция началась. Ниже пример журнала.
... много строк ...
47:24.154020-0,SDBL,6,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Trans=xxxxx,Func=BeginTransaction,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 14 : НачатьТранзакцию();'
... много строк ...
47:24.154066-0,EXCP,7,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Exception=xxxxx,Descr=В данной транзакции уже происходили ошибки!,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 22 : Запрос.Выполнить();'
... много строк ...
47:24.154068-0,QERR,6,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Descr=xxxxx,Query=xxxxx,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 22 : Запрос.Выполнить();'
Скрипт, который рядом с сообщением об ошибке выводит событие начала транзакции.
egrep '^[0-9][0-9]:[0-9][0-9].{8,20}(,EXCP,.*транзакции уже происходили ошибки|,SDBL,.*,Func=BeginTransaction,)' -R -h --include "*.log" \
| gawk '{
SessionID=$0 \
;sub("^.*SessionID=","",SessionID) \
;sub(",.*$","",SessionID) \
;if (match($0,"^.{12,20}SDBL")){Event[SessionID]=$0}
;if (match($0,"^.{12,20}EXCP")){print Event[SessionID]"\n"$0"\n"} \
}'
Бонус - скрипт для обезличивания технологического журнала. Заменяет переменные на "хххххх".
sed -i -E 's/=[^,]+,/=xxxxx,/g' $(find . -name '*.log')
Благодарю Виктора Богачева за предоставленные методические материалы и поддержку.