1с УПП, платформа 8.2.15.294
Клиент-сервер.
Есть документ внутренний заказ, при его проведении должен создаваться заказ поставщику.

```1c
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Если Статус <> Перечисления.т_СтатусыВнутреннихЗаказов.ОтправленПоставщику Тогда
    Если УргентноБул Тогда
    СоздатьЗаказПоставщику();
    ИначеЕсли ЗаказАвтоматом тогда
    СоздатьЗаказПоставщику();
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```

```1c
    Процедура создатьЗаказПоставщику()
    МассивЗаявок = Новый Массив;
    МассивЗаявок.Добавить(Ссылка);
    процедуры.АвтоматическоеФормированиеЗаказа(МассивЗаявок, ДокументОснование.Дата);
    КонецПроцедуры
```

АвтоматическоеФормированиеЗаказа - это процедура общего модуля(серверный, разрешен вызов сервера);

```1c
    Процедура АвтоматическоеФормированиеЗаказа(ДокСсылка_Массив, ДатаФормирования) Экспорт
    ЛогФайл = ИнициализироватьЛогФайл("Автоматическое создание заказа по цитовке");
    ДатаЗапуска = ДатаФормирования;
    НомерЗаписиСообщения=1;
    Для каждого строка Из ДокСсылка_Массив Цикл
    ЗаказНовый = СоздатьЗаказПоставщику(строка.Ссылка,ЛогФайл,НомерЗаписиСообщения);
    //Далее идет работа с регистрами и отправка на поставщика
    КонецЦикла;
    КонецПроцедуры
```

```1c
    функция СоздатьЗаказПоставщику(ВнутреннийЗаказ,ЛогФайл,НомерЗаписиСообщения)Экспорт

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

    КонецПопытки
    КонецЕсли;
    Если НЕ ДокОбъект.ЭтоНовый() Тогда
    Попытка
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    //Сообщить("Документ Заказ поставщику проведён");
    Исключение
    СтрокаПриращения = "Процедура "Формирование заказов поставщикам" не удалось провести заказ поставщику по аптеке: " + Строка(ВнутреннийЗаказ.Склад);
    НомерЗаписиСообщения = НомерЗаписиСообщения + 1;
    ДобавитьСтрокуВЛогФайл(ЛогФайл, СтрокаПриращения, НомерЗаписиСообщения);

    КонецПопытки;

    КонецЕсли;
    Возврат ДокОбъект;
    КонецФункции
```

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

попробуй перенести свои алгоритмы в
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
---
Процедура перед записью
Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.
Транзакция тоже присутствует, не вариант. + пробовал.
---
Добавил вознаграждение
---
так а проведение Внутреннего заказа завершается успешно? ведь создание заказа получается внутри транзакции проведения внутреннего заказа, если оно не успешно, то поидее все, что было внутри транзакции откатывается
---
Транзакций запущенных нет.
Проведение внутреннего заказа тоже отваливается.
---
так проведение - это и есть транзакция, неявная
---
чтобы отладить создание Заказа поставщику вынеси функционал на кнопку и нажимай руками после проведения внутреннего заказа
---
Сейчас попробую, отпишусь.
---
В случае если создавать заказ по кнопке, всё работает, при ошибке заказ остаётся в базе.
Спасибо)
Теперь то это надо как-то обойти(мне ж надо создавать при проведении), есть идеи?
---
Вариант конечно создать регистр, добавлять туда ссылки на внутренний заказ при проведении, после чего раз в 15 минут проверять наличие там записей, если есть то формировать заказы и удалять записи, но как-то не то.
---
если попадает в исключение при проведении, то там Заказ просто записывай, записаться-то то должно дать
---
проблема в том, что когда попадает в исключение ДокОбъект уже не существует.
Пробовал.
---
да ладно, быть не может
если вот здест падает:

```1c
    Если НЕ ДокОбъект.ЭтоНовый() Тогда
    Попытка
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    //Сообщить("Документ Заказ поставщику проведён");
    Исключение
    СтрокаПриращения = "Процедура "Формирование заказов поставщикам" не удалось провести заказ поставщику по аптеке: " + Строка(ВнутреннийЗаказ.Склад);
    НомерЗаписиСообщения = НомерЗаписиСообщения + 1;
    ДобавитьСтрокуВЛогФайл(ЛогФайл, СтрокаПриращения, НомерЗаписиСообщения);

    КонецПопытки;
```

то в этом исключении прописать ДокОбъект.Записать(РежимЗаписиДокумента.Запись)
если же именно при записи падает, тогда хуже, придумывай как постфактум обрабатывать, тут уж тебе виднее как лучше и правильнее сделать, я полного процесса не знаю
---
Тоже строил такие конструкции, например 1 документ управляет 3-6 доками и при проведении их создаёт по различным критериям(если нужно черкани в ПМ кину код, тут очень много будет выкладывать), а так же зависимые документы вместе с основным проводятся, помечается на удаление и т.д. Попытка сделать запись документов в Обработке проведения закончится неудачей, т.к. получится Транзакция в транзакции. Перенеси код в ПередЗаписью и если новый Объект сначала записывай его и всё заработает (ну в теории по крайней мере, написанный код не разглядывал)