Имя: Пароль:
1C
1С v8
В данной транзакции уже были ошибки.... помоги плиз
,
0 yfylhjkjy
 
20.06.13
09:06
Есть необходимость в одной самописной базе попробовать переровести (причем под перепровести понимается сначала отменить проведение, установить у одного реквизита другое значение и провести... если не удалось оставить как было). Пытался сделать так:

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

Если документ провести нельзя, то вылетает ошибка про транзанкцию. В чем ошибка?
1 yfylhjkjy
 
20.06.13
09:06
перенесите пожалуйста в секцию v8!!! спасибо
2 Ёпрст
 
20.06.13
09:08
в попытку надо оборачивать
3 Ёпрст
 
20.06.13
09:08
+ отменатранзакции
ну и наеборот только, попытка унутри транзакции
4 Ёпрст
 
20.06.13
09:10
Вот только, в данном коде, лучше вообше выкинуть транзакцию - она и так есть в модуле проведения..
Проще условие поставить, что запись не завершилась и привет
5 Vadim_37
 
20.06.13
09:10
А стандартной групповой обработкой не проще сделать?
6 yfylhjkjy
 
20.06.13
09:11
Нет не проще, потому что нужно именно попытаться сначала откатить, потом установить реквизит, потом провести. Если не получилось оставить документ в первозданном виде
7 yfylhjkjy
 
20.06.13
09:13
(4) тут подводный камень, в том, что у меня до этого проведенный документ тогда может стать не проведенным.
8 Vadim_37
 
20.06.13
09:14
(6) Что значит попытаться сначала откатить? Документ по какой-то причине может не стать проведенным?
9 yfylhjkjy
 
20.06.13
09:16
Я все делаю в одной транзанкции именно для того, чтобы не получилось так, что я отменил проведение документа, реквизит установил, провести не удалось и он у меня повис не проведенный.
10 Ёпрст
 
20.06.13
09:38
(9) а зачем отменять проведение, чтоб поменять реквизит ?!
11 Fish
 
20.06.13
09:41
(10) Тоже непонятно. Меняешь реквизит и всё.
12 Infsams654
 
20.06.13
09:49
(0) так база-то открыта может у кого еще, или сам что-то ? "в одной самописной базе"
13 yfylhjkjy
 
20.06.13
10:01
(9) (10) Для того, чтобы поменять реквизит не нужно отменять проведение. Еще раз: в какой-то хрен знает откуда взявшейся базе есть документ. В зависимости от галочки меняется логика движение. Совершенно не хочется разбираться почему тупое перепроведение с новым значение реквизита не дает такого же эффекта как совокупность действий отмена, изменение реквизита, проведение. Требуется просто решить поставленную задачу.
14 yfylhjkjy
 
20.06.13
10:03
конечно, в нормально сделанном документа должно быть дастаточно изменение реквизита и новое проведение, без этих дебрей с отменой.
15 trantor77
 
20.06.13
10:17
Если в какой нибудь вложенной транзакции (в данном случае проведение, отмена) возникает откат транзакции откатываются все внешние транзакции. Повлиять на это разработчик на 1С никак не может.
16 AaNnDdRrEeYy
 
20.06.13
10:18
(0) Эта ошибка означает что в самом модуле объекта мДок в обработчиках записи (приЗаписи, ОбработикаПроведения и т.д) была ошибка или Отказ = Истина. твоя Попытка погасила это и дальше при фиксации транзакции это все вылезло.

мне кажется эта ошибка из за несоотвествий версий объекта

сделай вот так
НачатьТранзакцию();
   мДок = Результат.Ссылка.ПолучитьОбъект();
   мДок.Записать(РежимЗаписиДокумента.ОтменаПроведения);
//вот тут я обновляю версию объекта, повторно его получая
мДок = мДок.Ссылка.ПолучитьОбъект();    
мДок.Подтверждено = Истина;
   мДок.Записать(РежимЗаписиДокумента.Проведение);
   ЗафиксироватьТранзакцию();
17 yfylhjkjy
 
20.06.13
11:04
(16) Не проканало
18 Xatori
 
20.06.13
12:20
(17) Перенеси Код из Обработки проведения в Перед записью, должно взлететь.
19 yfylhjkjy
 
20.06.13
13:27
вот так получилось

Пока Результат.Следующий() Цикл
       
   НачатьТранзакцию();
       
   Попытка
   мДок = Результат.Ссылка.ПолучитьОбъект();
           мДок.Записать(РежимЗаписиДокумента.ОтменаПроведения);
   Исключение
   КонецПопытки;
       
   Попытка
   мДок = мДок.Ссылка.ПолучитьОбъект();    
   мДок.Подтверждено = Истина;
           мДок.Записать(РежимЗаписиДокумента.Проведение);
   Исключение
   КонецПопытки;            
       
   ЗафиксироватьТранзакцию();
       
КонецЦикла;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший