Имя: Пароль:
1C
 
Попытка. Транзакции. В данной транзакции происходили ошибки
,
0 Wefast
 
12.07.24
09:22
Сервис интеграции. Стоит галка "В транзакции".

Приходит сообщение

Создаю документ, заполняю чем то

Сначала записываю документ в режиме обмена.

Потом создаю доп справочники, делаю записи в регистры. Заполняю этими значениями документ и пытаюсь провести. Если не проводится - пытаюсь записать.

Написал так:

Процедура СозданиеОбъекта
	
	//Обрабатываю сообщение, записываю документ
	------
	
	
	//////
	СоздатьСвязанныеДанные(ОбъектИБ, ДанныеСообщения, ТекстОшибки);
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ТекстСообщения = ТекстОшибки + ". ID сообщения:" + ИДСообщения + "  от : " + КодОтправителя;
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения);
	КонецЕсли;
	
КонецПроцедуры

Процедура СоздатьСвязанныеДанные(ОбъектИБ, ДанныеСообщения, ТекстОшибки)
	// Что то заполняю еще
	----
	//
	
	Попытка			
		ОбъектИБ.ОбменДанными.Загрузка = Ложь;
		ОбъектИБ.Записать(РежимЗаписиДокумента.Проведение);
	Исключение
		ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", Символы.ПС) + "Не удалось провести документ: "+ ОбъектИБ + " По причине: "+ ОписаниеОшибки();			
		ОбъектИБ.ОбменДанными.Загрузка = Истина;
		ОбъектИБ.Записать();			
	КонецПопытки;
	
КонецПроцедуры


Т.е. как я хотел? Чтобы при возникновение ошибки - я сам формировал текст ошибки, сам ее записывал куда нужно и дальше что то выполнялось.

А он при попытке записи в исключение, пишет, что не удалось провести документ т.к. в данной транзакции происходили ошибки.
1 Wefast
 
12.07.24
09:23
(0) И мое сообщение которое я сам сформировал не пишется в журнал т.к. вся транзакция из-за ошибки откатывается(если я все правильно понял)
2 Wefast
 
12.07.24
09:26
Да и обе эти процедуры так же в попытку завернуты, чтобы просто писалась ошибка, но сообщение считалось пройденным, а не зависало в шине.
3 Valdis2007
 
12.07.24
10:34
скорее всего ниже по стэку, в событиях запис,и еще какието ошибки происходят
4 Wefast
 
12.07.24
11:47
(3) так до проведения я документ уже записывал.

После первой записи и до проведения происходит заполнение одного реквизита
5 Wefast
 
12.07.24
11:54
Убираю проведение, оставляю только запись в попытке - все проходит.
6 rozer76
 
12.07.24
12:22
в поломанной транзакции нельзя обращаться к БД - куча инфо как работать с транзакциями правильно а в Исключение опять делать ОбъектИБ.Записать() вообще не вариант
7 lEvGl
 
гуру
12.07.24
15:41
в общем случае такая ошибка когда одна транзакция находится в другой и в ней возникает исключение, вложенность может быть многоуровневой, отследите ВСЕ транзакции в этом случае, явные НачатьТранзакцию и неявные вроде записи/проведения/галочки и т д
Убираю проведение, оставляю только запись в попытке - все проходи

логично, в проведении возникает отказ/исключение
8 youalex
 
12.07.24
20:14
(7) "1С:Предприятие 8.1 не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня."
https://its.1c.ru/db/metod8dev/content/2334/hdoc

Но в 1С можно открывать множество транзакций последовательно, но  фактически это будет одна транзакция (и если хотя бы одна  из этого условного пула открытых не будет зафиксирована, то все открытые транзакции внутри (а точнее вместе с) исходной будут отменены)
9 Wefast
 
12.07.24
23:39
Таким образом если у меня само сообщение инициирует неявную транзакцию. Любые другие транзакции(в моем случае запись любого объекта) в случае отмены(ошибках при записи) приведут к сообщению "в этой транзакции уже были ошибки"?

А как же работает тогда условные расходная накладная и счет фактура. По сути 2 объекта записываются вложенно.

Или какой ни-будь документ Штатное расписание, там же помимо документа создаются еще позиции штатного расписания.
10 youalex
 
13.07.24
03:15
(9) не сообщение инициирует неявную транзакцию, а любая запись объекта в 1С это неявная транзакция (можешь проверить в модуле ПриЗаписи() например , ТранзакцияАктивна() будет Да, а ОтменитьТранзакцию() выдаст ошибку (если я правильно помню)
У тебя же скорее всего явная транзакция открывается, судя по "Стоит галка "В транзакции".". Стандартный сценарий - загружать данные в режиме загрузки (возможно в одной транзакции) , обрабатывать (проводить) - отдельно
11 2mugik
 
15.07.24
04:30
(0)Если хочешь в транзакции отмененной что-то запистаь просто так не получится. Надо извращаться - поищи на инфостарте.На мисте тоже пробегало, но найти сложнее будет
12 rozer76
 
15.07.24
10:06
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс