Доброго дня, коллеги.

Требуется создать цепочку документов (документ2 и документ3) при записи документа1.
Решил использовать событие ПослеЗаписиНаСервере().
Судя по описанию обработчика, то транзация записи к этому моменту завершилась. Ок, мне подходит.

Делаю так:

```1c
    Процедура ПослеЗаписиНаСервере(Форма, ТекущийОбъект, ПараметрыЗаписи)

    Для Элемент Из Коллекция Цикл

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

    Результат1 = СозданиеДокумента2ВПопытке(Элемент );

    Результат2 = СозданиеДокумента3ВПопытке(Элемент );

    Если ЗначениеЗаполнено(Результат1) И ЗначениеЗаполнено(Результат2) Тогда
    ЗафиксироватьТранзакцию();
    Иначе
    ОтменитьТранзакцию();
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```

Т.о. нужно либо создать и провести оба документа, либо ничего не делать.
Но в случае, если имею ошибку при проведении документа2 или документа3, то какого-то лешего после записи документа1 получаю
В данной транзации уже происходили ошибки
и модифицированность формы документа1 (звёздочка на форме).
Что я делаю не так?

ЗЫ: Далее скорее всего формирование будет вынесено в фоновое задание, но всё равно интересно, что тут не так.
---
как-то так:

```1c
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
    НачатьТранзакцию();
    Попытка
    СоздатьДокумент2();
    СоздатьДокумент3();
    ЗафиксироватьТранзакцию();
    Исключение
    ОтменитьТранзакцию();
    КонецПопытки
    КонецЕсли;
```
---
Формировать строку представления данных заполнения заранее.
100% у тебя там неявное приведение ссылки к строке.
---
как-то так:

```1c
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
    НачатьТранзакцию();
    Попытка
    СоздатьДокумент2();
    СоздатьДокумент3();
    ЗафиксироватьТранзакцию();
    Исключение
    ОтменитьТранзакцию();
    КонецПопытки
    КонецЕсли;
```
---
Да. так тоже работает.
Но оказалось, что из-за глюка платформы или её отладки я раза с 10го только увидел, что ошибка была при обращении к Элементу Коллекции в моём примере в случае возникновении ошибки при проведении какого-либо документа.
Т.е. если документ2 не провёлся, то я пытался вывести сообщение пользователю, обращаясь к Элемент (у меня это данные заполнения).
И как только я обращаюсь к ссылке данных заполнения - приехали.
Данные для заполнения документа2(3) я получил вне транзации, а далее при ошибке проведения пытаюсь сообщить пользователю, что на основании данных заполнения документ не провёлся. Надеюсь, смог объяснить)
ЗЫ: даже когда я отладчиком пытаюсь глянуть данные заполнения, то получаю "Ошибка получения представления значения: В данной транзакции уже происходили ошибки!".
Т.е. если сделать так:

```1c
    Если ЗначениеЗаполнено(Результат1) И ЗначениеЗаполнено(Результат2) Тогда

    ЗафиксироватьТранзакцию();

    Иначе

    ОбщегоНазначения.СообщитьПользователю(СтрШаблон("%1", Элемент.СсылкаНаОснование));
    ОтменитьТранзакцию();

    КонецЕсли;
```
---
если документ2 не провёлся, то я пытался вывести сообщение пользователю, обращаясь к ЭлементИ в этот момент платформа неявно полезла в базу для получения чего-нибудь для формирования представления. А так как транзакция уже развалена, ты и получаешь эту ошибку. Ну и в отладчике то же самое.
---
В транзакции произошли ошибки, но явнор она ещё не отменена, я пытался вывести сообщение на основании каких данных заполнения не провёлся документ2.
И как же тогда быть?)
---
Формировать строку представления данных заполнения заранее.
100% у тебя там неявное приведение ссылки к строке.
---
Так есть. Действительно - твоя правда. Благодарю!
---
Иначе

       ОбщегоНазначения.СообщитьПользователю(СтрШаблон("%1", Элемент.СсылкаНаОснование));
      ОтменитьТранзакцию();

КонецЕсли;
Местами поменять пробовали?
---
Пробовал. В том то и прикол. Довольно неочевидно для меня было, что представление ссылки данных заполнения вызывает ошибку (
---
```1c
    Функция СозданиеДокумента2ВПопытке(ДанныеЗаполнения)

    ДокументОбъект = Документы.Документ2.СоздатьДокумент();
    ДокументОбъект.Заполнить(ДанныеЗаполнения);

    Попытка
    Если ДокументОбъект.ПроверитьЗаполнение() Тогда
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЕсли;
    Исключение
    СтрокаОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписьЖурналаРегистрации("...'",
    ОбщегоНазначения.КодОсновногоЯзыка()),
    УровеньЖурналаРегистрации.Ошибка,
    ,
    ,
    СтрокаОшибки);
    КонецПопытки;

    Возврат ДокументОбъект.Ссылка;

    КонецФункции
```
---
или еще как вариант,
выносите цепочку создания связанных документов в фоновое задание!
(и такой ошибки не будет)

если не прошло проведение документа его можно просто записать (непроведенным)
соответственно после обработки у вас будет список связанных документов
---
а как правильно запустить фоновое из обработки проведения? Ведь транзакция ещё активна, а в фоновом нужно проверять статус.
Вроде как можно блокировку попытаться поставить, поидее она должна будет ожидать фиксации транзакции документа основания.