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

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

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

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

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

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


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

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

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

Собственно после этого идёт мой код с записью
Если эти пункты отличаются от заказа, то документ записывается по моим условиям!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
24. dakork 32 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 32 21.10.20 17:41 Сейчас в теме
В отмененной транзакции повторная попытка. Например, при первом заходе в цикле вы попытались записать документ, но произошло исключение и вы отменили транзакцию, а затем при последующем заходе в цикл вы пытаетесь заново записать документ в уже отмененной транзакции. Если вы хотите продолжить цикл, вам надо начать новую транзакцию.
7. Intercititude 21.10.20 17:46 Сейчас в теме
(3) То есть в начале цикла установить НачатьТранзакцию() ?
9. Isonic 234 21.10.20 17:47 Сейчас в теме
(7)просто получить объект , а запись его сделайте в попытку и все .
11. Intercititude 21.10.20 17:52 Сейчас в теме
(9) Убрал вообще транзакции. Но при записи всё-равно ловлю ошибку "В данной транзакции уже происходили ошибки".

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

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

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

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

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

И все эти записи зависят от условия, необходимо ли менять эти данные в документе.
24. dakork 32 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
Решил проблему записью объекта один раз после прохождения всех проверок.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)