Ошибка при проведении документа приводит к его удалению из базы

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

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

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


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

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

Так вот всё вроде бы хорошо работает, но есть одно но.
ДокОбъект(документ заказа поставщику) записывается в базу(ссылка на документ есть, в базе он тоже есть), после чего пытается провестись, но не может (специально не заполнил договор), вываливается ошибка и, о чудо, записаный ранее заказ просто удаляется из базы, его нет.
Во время отладки, при попытке посмотреть в исключении что стало с докОбъект или внутреннийЗаказ, конфигуратор виснет наглухо.
Куда копать?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
9. sommid 07.06.13 14:52 Сейчас в теме
чтобы отладить создание Заказа поставщику вынеси функционал на кнопку и нажимай руками после проведения внутреннего заказа
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kilo81 07.06.13 13:55 Сейчас в теме
Может есть начатая транзакция, документ записывается, появляется ссылка, потом транзакция отменяется и документ исчезает?
3. kilo81 07.06.13 13:57 Сейчас в теме
Хотя, если виснет, то либо база навернутая, либо одно из двух.
4. Sevens 6 07.06.13 14:11 Сейчас в теме
(3)Транзакция нету.
Есть другой документ, в который запихиваются все внутренние заказы и он на основании их создаёт заказы поставщику. Отрабатывает корректно, даже при ошибке проведения заказ остаётся.
15. Rovan 22 07.06.13 16:20 Сейчас в теме
(4) Sevens, ОбработкаПроведения - это же всегда транзакция !

попробуй перенести свои алгоритмы в
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
16. Sevens 6 07.06.13 16:34 Сейчас в теме
(15)Процедура перед записью
Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.
Транзакция тоже присутствует, не вариант. + пробовал.
5. Sevens 6 07.06.13 14:33 Сейчас в теме
Добавил вознаграждение
6. sommid 07.06.13 14:46 Сейчас в теме
так а проведение Внутреннего заказа завершается успешно? ведь создание заказа получается внутри транзакции проведения внутреннего заказа, если оно не успешно, то поидее все, что было внутри транзакции откатывается
7. Sevens 6 07.06.13 14:50 Сейчас в теме
(6)Транзакций запущенных нет.
Проведение внутреннего заказа тоже отваливается.
8. sommid 07.06.13 14:51 Сейчас в теме
так проведение - это и есть транзакция, неявная
9. sommid 07.06.13 14:52 Сейчас в теме
чтобы отладить создание Заказа поставщику вынеси функционал на кнопку и нажимай руками после проведения внутреннего заказа
10. Sevens 6 07.06.13 14:56 Сейчас в теме
(9)Сейчас попробую, отпишусь.
11. Sevens 6 07.06.13 15:03 Сейчас в теме
(9)В случае если создавать заказ по кнопке, всё работает, при ошибке заказ остаётся в базе.
Спасибо)
Теперь то это надо как-то обойти(мне ж надо создавать при проведении), есть идеи?
12. Sevens 6 07.06.13 15:08 Сейчас в теме
Вариант конечно создать регистр, добавлять туда ссылки на внутренний заказ при проведении, после чего раз в 15 минут проверять наличие там записей, если есть то формировать заказы и удалять записи, но как-то не то.
13. sommid 07.06.13 15:18 Сейчас в теме
если попадает в исключение при проведении, то там Заказ просто записывай, записаться-то то должно дать
14. Sevens 6 07.06.13 15:24 Сейчас в теме
(13)проблема в том, что когда попадает в исключение ДокОбъект уже не существует.
Пробовал.
17. sommid 07.06.13 16:38 Сейчас в теме
(14) да ладно, быть не может
если вот здест падает:
Если НЕ ДокОбъект.ЭтоНовый() Тогда
      Попытка
         ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
         //Сообщить("Документ Заказ поставщику проведён");
      Исключение
         СтрокаПриращения = "Процедура ""Формирование заказов поставщикам"" не удалось провести  заказ поставщику по аптеке: " + Строка(ВнутреннийЗаказ.Склад);
         НомерЗаписиСообщения = НомерЗаписиСообщения + 1;
         ДобавитьСтрокуВЛогФайл(ЛогФайл, СтрокаПриращения, НомерЗаписиСообщения);

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

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

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