Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Мое почтение сведующим! Любезные, пробую реализовать следующую логику: в цикле создаются и сохраняются документы. В зависимости от заданных пользователем параметров для документов может вызываться проведение, при этом возможно два варианта поведения - при возникновении исключения откатить транзакцию, т.е. создание документа вообще, или просто оставить документ записанным, но непроведенным. Структура логики такова: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. однако при вызове процедуры с условием продолжения обработки в случае ошибки проведения документа при возникновении ошибки проведения цикл обработки продолжается, но транзакции отменены, документы на записаны. Вот пытаюсь понять, какова логика платформы. Пресветлый старец Фалоим Московскый. тимтэг:некоммерческое товарищество "Напиджак", издательство "Московский Пустомолец" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 12:31 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Делайте 2 раза НачатьТранзакцию. А то вы отменяете основную транзакцию а не вложенную. И одну строчку поправлю Док.ЗаписатьДокумент(?( РежимПроводитьДокументы,РежимЗаписиДокумента.Проведение,РежимЗаписиДокумента.Запись)); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 14:33 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Программист 1сДелайте 2 раза НачатьТранзакцию. А то вы отменяете основную транзакцию а не вложенную. И одну строчку поправлю Док.ЗаписатьДокумент(?( РежимПроводитьДокументы,РежимЗаписиДокумента.Проведение,РежимЗаписиДокумента.Запись)); С каких это пор 1С поддерживает вложенные транзакции? Это вообще не будет работать. Откатиться внутренняя, автоматом откатиться и внешняя. Надо алгоритм переосмыслить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 14:57 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 15:02 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
DmitriyZПрограммист 1сДелайте 2 раза НачатьТранзакцию. А то вы отменяете основную транзакцию а не вложенную. И одну строчку поправлю Док.ЗаписатьДокумент(?( РежимПроводитьДокументы,РежимЗаписиДокумента.Проведение,РежимЗаписиДокумента.Запись)); С каких это пор 1С поддерживает вложенные транзакции? Это вообще не будет работать. Откатиться внутренняя, автоматом откатиться и внешняя. Надо алгоритм переосмыслить.Забавно. Проверил - действительно ругается. А я то полагал что раз 1с поддерживает несколько раз начатьтранзакцию() - отмена тоже нормально выполняется... Тогда получается надо сначала в транзакции получить весь список не записываемых или не проведнных документов, а потом уже создавать вторую транзакцию и в ней записывать то что можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 15:43 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Программист 1с, на ИТС есть статья на эту тему. И я еще во времена 7.7 напарывался примерно с такой же задачей :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 15:47 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
DmitriyZПрограммист 1с, на ИТС есть статья на эту тему. И я еще во времена 7.7 напарывался примерно с такой же задачей :)Ну вот ткнули мордой - что еще в 77 не знаю . Спасибо - мелочь но очень забавная. И что им мешает сделать нормальные транзакции??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 19:53 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Программист 1сДелайте 2 раза НачатьТранзакцию. А то вы отменяете основную транзакцию а не вложенную. как так - внешнюю? Вообще, по коду я рассчитываю на то, что исключение будет поглощено, а транзакция - прокатит, а не откатится :) Тут, экспериментально подтверждаю, DmitriyZ прав. Хотя для меня не очевидно, что исключение = транзакция. Явной вложенности я не вижу, всё-таки в моем представлении пришельца с далёких платформ транзакция не равна попытке. И в буквальном прочтении кода ничто не мешает прокатить транзакцию в случае поглощенного исключения. Но факт - не прокатит. Неудобно, увы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 23:32 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
Самое неприятное, что всё происходит тихой сапой. В блок обработки исключения код не проходит, он спокойно доходит до Зафиксировать, но в фиксации на самом деле откатывается. И ни ошибок, ничего, только молчаливый приговор в логе - отменена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2011, 23:39 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
МистерШоуЯвной вложенности я не вижу, всё-таки в моем представлении пришельца с далёких платформ транзакция не равна попытке. И в буквальном прочтении кода ничто не мешает прокатить транзакцию в случае поглощенного исключения. В 1С при использовании конструкции Попытка-Исключение также вызывается неявная транзакция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 00:32 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
shurikvzМистерШоуЯвной вложенности я не вижу, всё-таки в моем представлении пришельца с далёких платформ транзакция не равна попытке. И в буквальном прочтении кода ничто не мешает прокатить транзакцию в случае поглощенного исключения. В 1С при использовании конструкции Попытка-Исключение также вызывается неявная транзакция. Пока могу констатировать по трассировке MS SQL - при вызове НачатьТранзакцию по-честному имею BEGIN TRAN, записываю док, потом пытаюсь провести, "проглатываю" исключение, но когда дохожу до Зафиксировать - получаю в трассе явный ROLLBACK. Зэц ол фолкс. Грустно. И исключения не возникает, и зафиксировать вызывает, и транзакция отменена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 02:04 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
МистерШоу, На ИТС есть статья на эту тему. Проще почитать, чем в трассировщик сразу лезть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 10:13 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
DmitriyZМистерШоу, На ИТС есть статья на эту тему. Проще почитать, чем в трассировщик сразу лезть :) У меня диск ИТС вот только-только появился. Я вижу её неоднократное упоминание в сети, но найти там же не смог, хотя я не слишком упорствовал. Сейчас буду искать на диске. Библиотека статей, кстати, на дисках ИТС накопительным образом сохраняется? Т.е. она должна быть на каждом диске ИТС от момента её публикации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 10:21 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
МистерШоу, что касается тех. документации, то, вроде, да. Может мигрировать из раздела в раздел, но остается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 10:32 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
В итоге, какую-то спецальную статью не нашел, кроме руководства разработчика. Смысл таков, что если причина исключения не связана с базой данных, продолжение транзакции и исполнения кода далее возможно. Но если исключитение было вызвано ошибкой базы данных, тогда фиксируется признак возникновения ошибки в этой транзакции и продолжение транзакции или ее фиксация становятся невозможны. Всё, что может сделать в этом случае разработчик - отменить транзакцию. Ах, да - он может осуществить попытку выполнения транзакции еще раз. В приведенном примере приведено именно такое элегантное обходное решение - впилить в цикл и записывать, записывать до кровавых пузырей из хрипящего горла! :) Но не поспоришь - воркэраунд. Таки придётся делать - при установленном режиме проведения без отката записи при отказе проведения крутить тран заново с попыткой только записи без проведения. Хотя в моём случае, мне, верхогляду, кажется, что именно прогрмаммный отказ проведения по итогу логической проверки не есть отказ БД..., и можно было бы катить и дальше, ну там, к сэйв точке откатиться. хотя всё это уже сложнее, а система должна и на собственной файловой реализации работать... Итого, повторяя самого себя: я многое готов принять и простить, всё-таки система сложная и вполне вероятно, что такое транзакционное поведение выстрадано и оптимально, но вот такое поведение, когда по логике кода происходит вход в штатную процедуру ЗафиксироватьТранзакцию, и её выполнение завершается откатом без какого-либо исключения, уведомления и проч, лишь скупой отпиской в системный журнал - такое поведение даже с натяжкой не могу признать фичей. Моё ничтожное мнение - баг. И я даже наберусь наглости отправить своё чириканье в саппорт 1С :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 17:09 |
|
||
|
Транзакия, исключение, запись документа.
|
|||
|---|---|---|---|
|
#18+
МистерШоу, статья, которая вам возможно поможет на диске ИТС называется "вложенность транзакций" (проще найти через поиск в разделе технологическая поддержка -> методическая поддержка 1С 8). В вашем же конкретном случае, как уже заметили ранее, гораздо проще поменять алгоритм участка кода. Это дело 10 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2011, 18:44 |
|
||
|
|

start [/forum/topic.php?fid=28&msg=37555103&tid=1520818]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 398ms |

| 0 / 0 |
