Добрый день всем !
8.2 ОФ

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

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

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

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

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

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

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

Собственно после этого идёт мой код с записью
Если эти пункты отличаются от заказа, то документ записывается по моим условиям!
---
А договоры новые создаются? И записать лучше документ только в конце один раз, когда пройдешь все условия. Добавь переменную ПерезаписатьДокумент (Булево) и её меняй при необходимости. Если ПерезаписатьДокумент = Истина, тогда и запиши только уже в конце. Проблема ещё может быть в том, что при записи документа, запускаются ещё типовые механизмы, которые пытаются поменять записи в регистрах. Проверяй в отладчике на Отказ. В общем надо пройтись отладчиком. Что-то в системе не нравится в твоем документе (Может есть незаполненые поля, а может ещё что-то)
---
Решил проблему записью объекта один раз после прохождения всех проверок.
---
не очень понятна логика кода: если есть цикл и внутри него попытка, то надо делать Продолжить в исключении а не Возврат ... ?!
---
Где есть возврат то там конструкции :

```1c
    Если
    Попытка
    Документ.Записать();
    Исключение
    ОтменитьТранзакцию();
    Сообщить("Ошибка...");
    возврат;
    КонецПопытки

    Иначе

    Конецесли
```

Да и продолжить не решит проблему думаю.
---
Ну и скорее всего логика такова, что если не записался документ, то мы полностью отменяем все записи, а не делаем продолжить.
---
Предлагаю сделать следующее: заводим переменную АктивныхТранзакций = 0 когда делаем НачатьТранзакцию() увеличиваем переменную на 1 и сообщаем; когда ОтменитьТранзакцию() уменьшаем на 1 и сообщаем;
Получим лог - начала и отмен транзакций, и узнаем значение переменной на момент возникновения ошибки ...
Если на момент ошибки АктивныхТранзакций = 0 значит проблема не в нашем коде а где-то "выше";
А вот если на момент ошибки АктивныхТранзакций <> 0 значит точно у нас в коде
---
В отмененной транзакции повторная попытка. Например, при первом заходе в цикле вы попытались записать документ, но произошло исключение и вы отменили транзакцию, а затем при последующем заходе в цикл вы пытаетесь заново записать документ в уже отмененной транзакции. Если вы хотите продолжить цикл, вам надо начать новую транзакцию.
---
То есть в начале цикла установить НачатьТранзакцию() ?
---
просто получить объект , а запись его сделайте в попытку и все .
---
Убрал вообще транзакции. Но при записи всё-равно ловлю ошибку "В данной транзакции уже происходили ошибки".

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

Или вообще не пишите НачатьТранзакцию() нигде
---
в (11) ответил.

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

Мол, если документы не записались, то возврат, а если записалось без ошибок, то записать в регистр что документ записаны.
Как это реализовывать?
---
почему возврат, а не продолжить ?
---
Ну продолжить, не суть. Это я так выразился просто. Пусть будет не возврат, а отмена - сообщить ( "не записались документы !")
---
смотря как пишешь в регистр . Если целиком все то Сделать флаг «отказ», если ошибка то истина . После цикла не записывать если истина . Если внутри цикла то если итерация дошла до конца то запиши .
---
В целом это разберусь думаю. Мне от главной ошибки не уйти: ошибки в транзакции.
---
Внутри транзакции нет смысла делать «получитьобьект». Получитьобьект - уже транзакция
---
Хотите сказать я могу в транзакции просто написать Ссылка.Записать() и запишет ? нет же..
---
не используйте «начатьтранзакцию»
---
Мне кажется, ты пытаешься записать один и тот же объект. Скорее всего надо Стр.Заказ.ПолучитьОбъект() в цикле. Что содержит Массив?
---
Да, так и есть. Объект получается один раз на входе в цикл. А далее он по входу в условия записывается.
Переделал на получении объекта в каждом условии. ошибка не ушла (

Массив содержит список ссылок на документы "заказ покупателя"
---
И ещё почему записать несколько раз ? Одного раза хватит
---
в (20) описал.
Если кратко, то разные условия если отличаются данные, то меняем их.
---
Если в многоточии есть запись ещё объектов, то там могут быть ошибки при записи. В любом случае у вас идёт попытка записи после провала попытки.
---
Нет, запись только как в теме указана происходит, если попадаем в условие какое-либо.
В первом случае например перезаписываем цену в документе
Во втором случае комментарии
В третьем Тип цен
В четвертом Договор

И все эти записи зависят от условия, необходимо ли менять эти данные в документе.
---
А договоры новые создаются? И записать лучше документ только в конце один раз, когда пройдешь все условия. Добавь переменную ПерезаписатьДокумент (Булево) и её меняй при необходимости. Если ПерезаписатьДокумент = Истина, тогда и запиши только уже в конце. Проблема ещё может быть в том, что при записи документа, запускаются ещё типовые механизмы, которые пытаются поменять записи в регистрах. Проверяй в отладчике на Отказ. В общем надо пройтись отладчиком. Что-то в системе не нравится в твоем документе (Может есть незаполненые поля, а может ещё что-то)
---
Нет, договоры только подставляются, либо пустаяссылка вставляется.
К сожалению, если идти отладчиком, то на ошибки вообще не попадает :)
Видимо, я нахожусь в транзакции ,из-за этого.

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

В конце цикла обхода массива имеете ввиду и при этом оставить "возвраты" и " транзакции" ?
---
Решил проблему записью объекта один раз после прохождения всех проверок.