Имя: Пароль:
1C
 
ЗафиксироватьТранзакцию() если в транзакции произошло исключение
Ø
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 прав.