![]() |
|
Транзакция | ☑ | ||
---|---|---|---|---|
0
neomarat
23.12.14
✎
14:32
|
Вот такая задача: Есть документ, который при проведении (Обработка проведения) меняет данные в других документах и проводит их. Как сделать, чтобы если на каком-то документе не получилось провести - все изменения откатились?
Почему так - не спрашивайте - функционал сделан до меня и много - все переписывать нет смысла, надо хоть как-то защитить механизм от рассогласованности. Ваши предложения? |
|||
1
Бубка Гоп
23.12.14
✎
14:33
|
Транзакция ? :D
|
|||
2
ДенисЧ
23.12.14
✎
14:34
|
||||
3
piter3
23.12.14
✎
14:34
|
да
|
|||
4
Локи-13
23.12.14
✎
14:35
|
ничего делать не нужно.
|
|||
5
elCust
23.12.14
✎
14:36
|
У ОбработкиПроведения есть параметр Отказ. Если его поставить в ложь в главном документе, то все сделанные изменения в процедуре ОбработкаПроведения будут отменены.
|
|||
6
elCust
23.12.14
✎
14:37
|
(5) В Истину соответственно - поправка
|
|||
7
Бубка Гоп
23.12.14
✎
14:40
|
(5)
т.е. если в обработке проведения один док проводит другие, то при Отказе он сам распроведет все что успел провести? |
|||
8
ejikbeznojek
23.12.14
✎
14:42
|
НачатьТранзакцию();
Попытка ТекДок=Документы.ПоступлениеВЗонуХранения.НайтиПоНомеру("SNL-00008").ПолучитьОбъект(); ТекДок.Дата=ТекДок.Дата+1; ТекДок.Записать(РежимЗаписиДокумента.Проведение); жж=1+ТекДок; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
9
neomarat
23.12.14
✎
14:43
|
А вот и нет - если транзакция на документе откатится, то проведенные из него документы не откатываются. Проверено.
|
|||
10
ejikbeznojek
23.12.14
✎
14:45
|
(9) у меня если я убираю косячную строку жж=1+ТекДок; то период меняется, а если строка есть, то не меняется)))
Только что написал это чтобы посмотреть что будет. |
|||
11
break
23.12.14
✎
14:45
|
(9) у меня откатываются
|
|||
12
Бубка Гоп
23.12.14
✎
14:46
|
тут видимо у каждого своя платформа 1с с блэкджеком и шлюхами
|
|||
13
neomarat
23.12.14
✎
14:46
|
(8) это тоже не сработает, потому что есть уже по сути в обработке проведения транзакция, и она не отрабатывает отказ во вложенных транзакциях(в тех доках которые успели провестись до косячного)
|
|||
14
neomarat
23.12.14
✎
14:47
|
(11) странно...
|
|||
15
ejikbeznojek
23.12.14
✎
14:48
|
ну таки попробуй вдруг получится)
потому что стоя в отладке на косячной строке Документы.ПоступлениеВЗонуХранения.НайтиПоНомеру("SNL-00008").ПолучитьОбъект().дата у меня показывает изменённую дату. А потом когда ухожу в исключение возвращается (14) |
|||
16
ejikbeznojek
23.12.14
✎
14:50
|
единственно что это если и взлетит, подъедать ресурсов нормально будет если документов много
|
|||
17
Бубка Гоп
23.12.14
✎
14:50
|
(9) тогда напрашивается лишь один вариант.
в конце проведения исходного дока проверят свойство Проведен в подчиненных и если в каком то ложь - распроводить все в обратной последовательности |
|||
18
neomarat
23.12.14
✎
14:51
|
попробовал - в том то и дело. Не откатывается - может баг конечно в платформе...
|
|||
19
neomarat
23.12.14
✎
14:51
|
(17) не - там такой алгоритм, что хрен уследишь как было до этого
|
|||
20
ejikbeznojek
23.12.14
✎
14:54
|
Если есть человеческий журнал изменений, можно читать из него за период с начала операции по неудачное окончания. Из него делать все изменения в обратную сторону.
Но это конечно тот ещё изврат))) |
|||
21
ИС-2
naïve
23.12.14
✎
14:55
|
(11) откатываются. ОдинЭс не поддерживает вложенные транзакции
|
|||
22
ИС-2
naïve
23.12.14
✎
14:55
|
(18) точно в обработке проведения?
|
|||
23
ИС-2
naïve
23.12.14
✎
14:55
|
может просто код вызывается
|
|||
24
break
23.12.14
✎
14:56
|
(18) попробуй при отмене транзакции прочитать недопроведенные документы из базы( например через Прочитать())
|
|||
25
Fragster
гуру
23.12.14
✎
14:59
|
если именно в обработке проведения, то прав (4)
|
|||
26
13_Mult
23.12.14
✎
15:02
|
(4) +1 ибо неявная транзакция
|
|||
27
ejikbeznojek
23.12.14
✎
15:04
|
(25) +1 Проверил, так и есть)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |