Имя: Пароль:
1C
1С v8
Как проверить что вложенная транзакция отменена
, , ,
0 Вафель
 
26.02.19
10:41
есть код

&НаСервереБезКонтекста
Процедура Команда1НаСервере()
    
    НачатьТранзакцию();
    
    НачатьТранзакцию();
    ОтменитьТранзакцию();
    
    Сообщить(ТранзакцияАктивна());
    // как избежать ошибки "В данной транзакции ..."
    Сообщить(Строка(Справочники.Валюты.НайтиПоКоду("643")));
    
КонецПроцедуры


Собственно как избежать ошибки?
PS. Это сокращенный пересказ кода из типовой
1 sqr4
 
26.02.19
10:46
а 1с поддерживает вложенные транзацкии?
2 sqr4
 
26.02.19
10:47
3 Василий Алибабаевич
 
26.02.19
10:47
(0) "1С:Предприятие 8.1 не поддерживает вложенных транзакций."
ЦЫ https://its.1c.ru/db/metod8dev/content/2334/hdoc
4 Василий Алибабаевич
 
26.02.19
10:48
5 FIXXXL
 
26.02.19
10:50
6 Вафель
 
26.02.19
10:52
ну не поддерживает, но ошибка то возникает.
Цель то обойти ошибку
7 Вафель
 
26.02.19
10:54
вернхняя транзакция - это неявная типовая.
Зачем 1с внутри еще одну открывает - это большой вопрос
8 TormozIT
 
гуру
26.02.19
10:59
К сожалению в платформе не предусмотрено способа ответить на поставленный (0) вопрос. Но такое пожелание 1С зарегистрировало.
9 aleks_default
 
26.02.19
12:08
использовать Вызватьисключение?
10 Вафель
 
26.02.19
12:11
(9) для чего?
11 aleks_default
 
26.02.19
12:12
Речь именно о транзакици в транзакции или о попытке в транзакции?
12 Вафель
 
26.02.19
12:14
в типовой именно отмена
13 Cyberhawk
 
26.02.19
12:19
(12) Отменяют всех родителей вверх (в цикле)?
14 Вафель
 
26.02.19
12:33
(13) какие циклы?
15 Cyberhawk
 
26.02.19
13:12
(14) Ребятки из 1С иногда пишут так: пока транзакцияактивна() отменитьтранзакцию() конеццикла;
16 Вафель
 
26.02.19
13:18
Добавление отмен в цикле помогает.
Буду думать как к типовой прикрутить

&НаСервереБезКонтекста
Процедура Команда1НаСервере()
    
    НачатьТранзакцию();
    
    НачатьТранзакцию();
    ОтменитьТранзакцию();
    
    Пока ТранзакцияАктивна() Цикл
        ОтменитьТранзакцию();
    КонецЦикла;    
    
    Если ТранзакцияАктивна() Тогда
    // как избежать ошибки "В данной транзакции ..."
        Сообщить(Строка(Справочники.Валюты.НайтиПоКоду("643")));
    КонецЕсли;
    
КонецПроцедуры
17 Cyberhawk
 
26.02.19
13:26
Так если ошибка была невосстановимая, то твое "найтипокоду" внутри транзакции выдаст ошибку "В данной транзакции уже происходили ошибки", т.к. это будет обращение к БД
18 sqr4
 
26.02.19
13:30
(17) мне кажется найти по коду это так для примера было
19 Cyberhawk
 
26.02.19
13:37
Запускай в фоновом задании запись в ЖР тех сообщений, что для своего формирования обращаются к БД
20 Cyberhawk
 
26.02.19
13:37
Тогда не будешь зависеть от невосстановимой ошибки, воникшей до конца текущей транзакции
21 Вафель
 
26.02.19
15:12
эхх, для неявных транзакций нельзя сделать ОтменитьТранзакцию(), поэтому пример (16) не применим
22 Вафель
 
26.02.19
15:13
(19) как переписать типовую чтоб все работало - понятно.
Хотелось бы сбоку костыль соорудить
23 aleks_default
 
26.02.19
15:58
А что в неявной ТранзакцияАктивна() не работает?
24 Вафель
 
26.02.19
15:59
(23) это работает
25 aleks_default
 
26.02.19
15:59
Вообще составителю СП за ткаое краткое описание метода ТранзакцияАктивна надо морду набить
26 Вафель
 
26.02.19
16:02
(25) а чего там не хватает?
27 aleks_default
 
26.02.19
16:04
Описания поведения во вложенной транзакции
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший