Вновь транзакции

1. Intercititude 21.10.20 16:50 Сейчас в теме
Добрый день всем !
8.2 ОФ

Есть примерно такой код:

 НачатьТранзакцию();

Если Количеств > 0 Тогда
  Для Каждого Стр Из Массив Цикл
Документ= Заказ.ПолучитьОбъект();
   .....
      Попытка 
           Документ.Записать();
        Исключение
           ОтменитьТранзакцию();
           Сообщить("Ошибка...");
           возврат;
         КонецПопытки
   ..........
 Попытка 
           Документ.Записать();
        Исключение
           ОтменитьТранзакцию();
           Сообщить("Ошибка...");
           возврат;
         КонецПопытки
   ..........
 Попытка 
           Документ.Записать();
        Исключение
           ОтменитьТранзакцию();
           Сообщить("Ошибка...");
           возврат;
         КонецПопытки
 конеццикла
конецесли

Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
Конецесли
Показать


В итоге ловлю ошибку в случайном месте: " В данной транзакии уже происходили ошибки". Что не так ?
рекоммендации с ИТС не увенчались успехом.

Забавно, что если отладчиком проходить по коду, то ошибки никакой не возникает!!!

UPD(обьяснение):
Пользователь в обработке выбирает список документов "Заказ покупателя".
У каждого заказа:
1) выбирает тип цен
2) выбирает договор
3) Меняет цены в самом заказе
4) Устанавливает время доставки.
После этого жмёт "Утвердить".

Собственно после этого идёт мой код с записью
Если эти пункты отличаются от заказа, то документ записывается по моим условиям!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
24. dakork 33 21.10.20 18:25 Сейчас в теме
(20)А договоры новые создаются? И записать лучше документ только в конце один раз, когда пройдешь все условия. Добавь переменную ПерезаписатьДокумент (Булево) и её меняй при необходимости. Если ПерезаписатьДокумент = Истина, тогда и запиши только уже в конце. Проблема ещё может быть в том, что при записи документа, запускаются ещё типовые механизмы, которые пытаются поменять записи в регистрах. Проверяй в отладчике на Отказ. В общем надо пройтись отладчиком. Что-то в системе не нравится в твоем документе (Может есть незаполненые поля, а может ещё что-то)
Intercititude; +1 Ответить
28. Intercititude 22.10.20 12:51 Сейчас в теме +0.21 $m
Решил проблему записью объекта один раз после прохождения всех проверок.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Vitaly1C8 21.10.20 17:34 Сейчас в теме
(1) не очень понятна логика кода: если есть цикл и внутри него попытка, то надо делать Продолжить в исключении а не Возврат ... ?!
5. Intercititude 21.10.20 17:45 Сейчас в теме
(2) Где есть возврат то там конструкции :
Если 
   Попытка 
           Документ.Записать();
        Исключение
           ОтменитьТранзакцию();
           Сообщить("Ошибка...");
           возврат;
         КонецПопытки

Иначе

Конецесли
Показать

Да и продолжить не решит проблему думаю.
23. Intercititude 21.10.20 18:17 Сейчас в теме
(2) Ну и скорее всего логика такова, что если не записался документ, то мы полностью отменяем все записи, а не делаем продолжить.
27. Vitaly1C8 22.10.20 10:45 Сейчас в теме
(1) Предлагаю сделать следующее: заводим переменную АктивныхТранзакций = 0 когда делаем НачатьТранзакцию() увеличиваем переменную на 1 и сообщаем; когда ОтменитьТранзакцию() уменьшаем на 1 и сообщаем;
Получим лог - начала и отмен транзакций, и узнаем значение переменной на момент возникновения ошибки ...
Если на момент ошибки АктивныхТранзакций = 0 значит проблема не в нашем коде а где-то "выше";
А вот если на момент ошибки АктивныхТранзакций <> 0 значит точно у нас в коде
3. dakork 33 21.10.20 17:41 Сейчас в теме
В отмененной транзакции повторная попытка. Например, при первом заходе в цикле вы попытались записать документ, но произошло исключение и вы отменили транзакцию, а затем при последующем заходе в цикл вы пытаетесь заново записать документ в уже отмененной транзакции. Если вы хотите продолжить цикл, вам надо начать новую транзакцию.
7. Intercititude 21.10.20 17:46 Сейчас в теме
(3) То есть в начале цикла установить НачатьТранзакцию() ?
9. Isonic 235 21.10.20 17:47 Сейчас в теме
(7)просто получить объект , а запись его сделайте в попытку и все .
11. Intercititude 21.10.20 17:52 Сейчас в теме
(9) Убрал вообще транзакции. Но при записи всё-равно ловлю ошибку "В данной транзакции уже происходили ошибки".

Видимо дело в попытке ?
10. dakork 33 21.10.20 17:51 Сейчас в теме
(7)Зависит от задачи. Если вы принципиально хотите продолжить записывать следующие документы, несмотря на то, что предыдущий документ не был записан, то начинать транзакцию нужно сразу после отмены.
Попытка
Документ.Записать();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка...");
НачатьТранзакцию();
ПРодолжить;
КонецПопытки.

Или вообще не пишите НачатьТранзакцию() нигде
12. Intercititude 21.10.20 17:55 Сейчас в теме
(10) в (11) ответил.

Плюс в конце мне необходимо условие

Мол, если документы не записались, то возврат, а если записалось без ошибок, то записать в регистр что документ записаны.
Как это реализовывать?
13. Isonic 235 21.10.20 17:57 Сейчас в теме
(12)почему возврат, а не продолжить ?
15. Intercititude 21.10.20 17:58 Сейчас в теме
(13) Ну продолжить, не суть. Это я так выразился просто. Пусть будет не возврат, а отмена - сообщить ( "не записались документы !")
17. Isonic 235 21.10.20 18:02 Сейчас в теме
(15) смотря как пишешь в регистр . Если целиком все то Сделать флаг «отказ», если ошибка то истина . После цикла не записывать если истина . Если внутри цикла то если итерация дошла до конца то запиши .
dakork; Intercititude; +2 Ответить
22. Intercititude 21.10.20 18:08 Сейчас в теме
(17) В целом это разберусь думаю. Мне от главной ошибки не уйти: ошибки в транзакции.
4. Isonic 235 21.10.20 17:42 Сейчас в теме
Внутри транзакции нет смысла делать «получитьобьект». Получитьобьект - уже транзакция
Intercititude; +1 Ответить
6. Intercititude 21.10.20 17:46 Сейчас в теме
(4) Хотите сказать я могу в транзакции просто написать Ссылка.Записать() и запишет ? нет же..
8. Isonic 235 21.10.20 17:47 Сейчас в теме
(6) не используйте «начатьтранзакцию»
Intercititude; +1 Ответить
14. dakork 33 21.10.20 17:57 Сейчас в теме
Мне кажется, ты пытаешься записать один и тот же объект. Скорее всего надо Стр.Заказ.ПолучитьОбъект() в цикле. Что содержит Массив?
16. Intercititude 21.10.20 17:59 Сейчас в теме
(14) Да, так и есть. Объект получается один раз на входе в цикл. А далее он по входу в условия записывается.
Переделал на получении объекта в каждом условии. ошибка не ушла (

Массив содержит список ссылок на документы "заказ покупателя"
18. Isonic 235 21.10.20 18:03 Сейчас в теме
И ещё почему записать несколько раз ? Одного раза хватит
21. Intercititude 21.10.20 18:07 Сейчас в теме
(18) в (20) описал.
Если кратко, то разные условия если отличаются данные, то меняем их.
19. dakork 33 21.10.20 18:04 Сейчас в теме
Если в многоточии есть запись ещё объектов, то там могут быть ошибки при записи. В любом случае у вас идёт попытка записи после провала попытки.
20. Intercititude 21.10.20 18:06 Сейчас в теме
(19) Нет, запись только как в теме указана происходит, если попадаем в условие какое-либо.
В первом случае например перезаписываем цену в документе
Во втором случае комментарии
В третьем Тип цен
В четвертом Договор

И все эти записи зависят от условия, необходимо ли менять эти данные в документе.
24. dakork 33 21.10.20 18:25 Сейчас в теме
(20)А договоры новые создаются? И записать лучше документ только в конце один раз, когда пройдешь все условия. Добавь переменную ПерезаписатьДокумент (Булево) и её меняй при необходимости. Если ПерезаписатьДокумент = Истина, тогда и запиши только уже в конце. Проблема ещё может быть в том, что при записи документа, запускаются ещё типовые механизмы, которые пытаются поменять записи в регистрах. Проверяй в отладчике на Отказ. В общем надо пройтись отладчиком. Что-то в системе не нравится в твоем документе (Может есть незаполненые поля, а может ещё что-то)
Intercititude; +1 Ответить
25. Intercititude 21.10.20 18:28 Сейчас в теме
(24) Нет, договоры только подставляются, либо пустаяссылка вставляется.
К сожалению, если идти отладчиком, то на ошибки вообще не попадает :)
Видимо, я нахожусь в транзакции ,из-за этого.

По поводу переменной ПерезаписатьДокумент- уже подумывал, но решил, что может здесь помогут )
26. Intercititude 21.10.20 18:32 Сейчас в теме
(24) А поводо этого
И записать лучше документ только в конце один раз, когда пройдешь все условия. Добавь переменную ПерезаписатьДокумент (Булево) и её меняй при необходимости. Если ПерезаписатьДокумент = Истина, тогда и запиши только уже в конце


В конце цикла обхода массива имеете ввиду и при этом оставить "возвраты" и " транзакции" ?
28. Intercititude 22.10.20 12:51 Сейчас в теме +0.21 $m
Решил проблему записью объекта один раз после прохождения всех проверок.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот