Имя: Пароль:
1C
1С v8
Транзакция
0 neomarat
 
23.12.14
14:32
Вот такая задача: Есть документ, который при проведении (Обработка проведения) меняет данные в других документах и проводит их. Как сделать, чтобы если на каком-то документе не получилось провести - все изменения откатились?
Почему так - не спрашивайте - функционал сделан до меня и много - все переписывать нет смысла, надо хоть как-то защитить механизм от рассогласованности.
Ваши предложения?
1 Бубка Гоп
 
23.12.14
14:33
Транзакция ? :D
2 ДенисЧ
 
23.12.14
14:34
http://gunsru.ru/images/pulemet/kpvt_3.jpg

Документ и так проводится в транзакции
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 Проверил, так и есть)