![]() |
|
ЗафиксироватьТранзакцию() если в транзакции произошло исключение Ø |
☑ | ||
---|---|---|---|---|
0
Deryni
04.11.05
✎
15:21
|
Есть обработка, которая создает новые документы
При записи документа происходит исключение Попытка Док.Записать(); Исключение КонецПопытки; Обработка происходит в транзакции. Если возникает исключение, например "номер не уникальный", то транзакция не фиксируется. "Ошибка при выполнении метода ЗафиксироватьТранзакцию()" Как победить? |
|||
1
КонецЦикла
04.11.05
✎
15:25
|
Ну и где логика? Все документы записываются же у тебя в транзакции - а это есть нечто целостное... можно самому сообщать и не фиксировать
|
|||
2
Deryni
04.11.05
✎
15:26
|
Логика тут, что если документ не записался, то и хрен с ним, а вот остальные хотелось бы записать. Если бы я хотел остановится, то я в конструкции Исключение КонецПопытки написал бы соответствующий код.
|
|||
3
alxarz
04.11.05
✎
15:28
|
Перед записью документы проверяй сам номер на уникальность, если не уникален, пропускай Док.Записать().
|
|||
4
Deryni
04.11.05
✎
15:29
|
(3)
Такая мысль приходила мне в голову, но может есть другое решение? Я так понимаю, что есть один способ проверки на уникальность. Попробовать найти документ с таким номером? |
|||
5
КонецЦикла
04.11.05
✎
15:31
|
Так а если один пропустится - задача будет упешно выполнена? Иначе какой смысл транзакции кроме ускорения? Если что - используй нумератор
|
|||
6
Deryni
04.11.05
✎
15:34
|
Для данной задачи можно пропустить документы, которые не удалось записать. Т.е. мысле кроме как выполнять поиск по номеру никаких?
|
|||
7
alxarz
04.11.05
✎
15:35
|
(4) Чем тебя ЭТО решение не устраивает???
|
|||
8
Deryni
04.11.05
✎
15:36
|
Хотелось бы получить нечто более универсальное. Меня вообще интересует, как продолжить транзакцию, если в ней произошла ошибка при записи.
|
|||
9
alxarz
04.11.05
✎
15:37
|
Другая мысль:
... ЗафиксироватьТранзакцию(); Док.Записать(); НачатьТранзакцию(); ... |
|||
10
Deryni
04.11.05
✎
15:39
|
Не годится. Для данной задачи нужно, чтобы выполнение той же транзакции продолжалось. Хотя и такая мысль приходила мне в голову.
|
|||
11
alxarz
04.11.05
✎
15:43
|
(8) Универсальное в чем??
Транзакция подразумевает под собой то, что в данном участке программы ошибок не было... |
|||
12
alxarz
04.11.05
✎
15:45
|
(10) Объясни для чего у тебя используются транзакции.
|
|||
13
Deryni
04.11.05
✎
15:50
|
короче невозможно.
В данном случае есть обработка для иморта документов через ОЛЕ. Переписывать ее неохота. Происходит следующее. Импортируется договор, в договоре есть контрагент, у контрагента есть поле БазДоговор, которое ссылается на импортируемый договор. В результате договор начинает затаскиваться, он еще не записан. Затаскивается контрагент, у контрагента есть поле Договор, затаскивается еще раз договор (он ведь не записан), он записывается, рекурсивный алгоритм возвращается к тому же договору и пытается записать его еще раз. Возникает исключение. И вообще мне стало интересно, можно ли продолжить транзакцию, если чего-то не записалось. |
|||
14
alxarz
04.11.05
✎
15:58
|
(13) Я просил объяснить для чего используются транзакции, а не что происходит в обработке, которую неохота переписывать...
|
|||
15
Deryni
04.11.05
✎
16:06
|
А я спрашивал о принципиальной возможности продолжения выполнения программы с фиксицией транзакции при возникновении ошибки записи в конструкции Попытка КонецПопытки;
Я понимаю зачем нужны транзакции и что в принципе логично, чтобы транзакция не фиксировалась. Вот только не люблю сильно умные программы. Хотя щас попробую еще один вариант. |
|||
16
alxarz
04.11.05
✎
16:21
|
(15) Я спрашиваю не для чего нужны транзакции ВООБЩЕ, а для чего они именно ТЕБЕ в ТВОЕЙ задаче.
Попытка КонецПопытки - служит для программной ОБРАБОТКИ ошибки (без них программа останавливается), а не для исключения факта того, что ошибка произошла. |
|||
17
Deryni
04.11.05
✎
16:26
|
Я и не прошу, чтобы ошибка исключалась, я хочу, чтобы она игнорировалась. Т.е. не получилось записать документ, ну и хрен с ним, значит не сильно хотели, т.е. делать так, как если бы метод Записать вообще не использовался для данного документа. Вот.
А вообще я попробовал отдельную транзакцию на запись документа внутри общей транзакции на запись всех документов. Получилось. |
|||
18
Шурик71
04.11.05
✎
17:14
|
(17) Получиться не может. 1С не поддерживает вложенные транзакции. Несмотря на то, что это не сразу видно.
Выход один (схема): - Работать через список документов - Фиксировать транзакциию порциями - Использовать счетчик успешно записанных документов (с зафиксированной транзакцией) - В случае исключения - откатываться на начало транзакции путем ОтменитьТранзакцию(), вносить данный документ в список исключения и повторять последнюю транзакцию сначала. В случаях, если транзакция применяется для ускорения (ночное перепроведение и т.п.) - данный рецепт труднозаменим. |
|||
19
vrag
04.11.05
✎
20:10
|
Убей транзакцию и будет что хотел...
|
|||
20
pit
04.11.05
✎
22:31
|
(13) а придется переписывать....
. "Импортируется договор, в договоре есть контрагент, у контрагента есть поле БазДоговор, которое ссылается на импортируемый договор. В результате договор начинает затаскиваться, он еще не записан. Затаскивается контрагент, у контрагента есть поле Договор, затаскивается еще раз договор (он ведь не записан), он записывается, рекурсивный алгоритм возвращается к тому же договору и пытается записать его еще раз." . данный алгоритм слегка неверный.... у тебя есть циклические ссылки... их надо порвать, переделав алгоритм. |
|||
21
insider
05.11.05
✎
03:44
|
(0) привет, давно не виделись :)
По сабжу: я так понимаю речь о типовой укр. бухии, где нельзя записать договор с незаполненным контрагентом? А что если создать временного контрагента (т.е. он заведомо существует до начала транзакции), первоначально писать в договор его и записывать договор, затем создавать нужного контрагента, прописывать его в договор и напоследок заполнять основной договор у контрагента... хотя лучше алгоритм пересмотри, pit прав. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |