Имя: Пароль:
1C
 
ошибка при выполнения процедуры зафиксироватьтранзакцию
0 zhenianik
 
17.06.11
12:14
встретился с такой проблемой. Комплексная 7.7, перепровожу документы за период, выходит ошибка "ошибка при выполнения процедуры зафиксироватьтранзакцию". Вот простецкий код:
   Док = СоздатьОбъект("Документ");
   НачатьТранзакцию();
   ном = 0;
   Док.ВыбратьДокументы(НачДата, КонДата);
   Пока Док.ПолучитьДокумент() = 1 Цикл
       Если Док.Проведен()=1 Тогда
           ном = ном+1;
           Док.Провести();
           Сообщить(Док);
       КонецЕсли;
       Если ном/20 = Цел(ном/20) Тогда
           ЗафиксироватьТранзакцию();
           НачатьТранзакцию();
       КонецЕсли;
   КонецЦикла;
   ЗафиксироватьТранзакцию();
1 zhenianik
 
17.06.11
12:15
Всем доброго дня!
2 vicof
 
17.06.11
12:16
транзакция в транзакции...интересно
3 zhenianik
 
17.06.11
12:17
(2) перепровожу по 20 доков в транзакции... что не так?
4 dk
 
17.06.11
12:18
ошибок при выполнении не выскакивает?
5 fedoss
 
17.06.11
12:20
А если сделать
Провелись = Док.Провести();
Сообщить(?(Провелись = 1, "Проведен:", "Не проведен:") + Док);
6 zhenianik
 
17.06.11
12:22
(4) Ошибок не заметил
(5) Да, щас попробую, наверно все таки какой то документ не проводится
7 1Сергей
 
17.06.11
12:23
Если ном%20 = 0 Тогда
8 1Сергей
 
17.06.11
12:23
(7)* вместо
Если ном/20 = Цел(ном/20) Тогда
9 dk
 
17.06.11
12:24

   Док = СоздатьОбъект("Документ");
   НачатьТранзакцию();
   ном = 0;
   фл = 1;
   Док.ВыбратьДокументы(НачДата, КонДата);
   Пока Док.ПолучитьДокумент() = 1 Цикл
       Если Док.Проведен()=1 Тогда
           ном = ном+1;
           фл = 0;
           Попытка
               Док.Провести();
               Сообщить(Док);
               фл=1;
           Исключение
               Сообщить("Ошибка при проведении: " + описаниеошибки());
           КонецПопытки
           Если фл = 0 тогда
              Сообщить("выход");
              Прервать;
           КонецЕсли;
       КонецЕсли;
       Если (ном % 20) = 0 Тогда
           ЗафиксироватьТранзакцию();
           НачатьТранзакцию();
       КонецЕсли;
   КонецЦикла;
   Если фл = 1 Тогда
      ЗафиксироватьТранзакцию();
   КонецЕсли;
10 Ёпрст
 
гуру
17.06.11
12:25
(0) и.. пусть весь мир подождёт ?
Нафига этот изврат с транзакцией ?
Пользователи базы яички еще не прищемляют вам за это ?
11 zhenianik
 
17.06.11
12:27
(7)(9) ном%20 не юзал раньше такую конструкцию ))) Спасибо
12 zhenianik
 
17.06.11
12:27
(10) перепровожу на тестовой базе, так тупо быстрее обрабатывает. Яички в полном порядке)
13 Ёпрст
 
гуру
17.06.11
12:33
(12) ну-ну.. вот только движения неверные будут, ну это ничего.. продолжайте дальше творить.
14 Ёпрст
 
гуру
17.06.11
12:34
>>>
Если Док.Проведен()=1 Тогда

rtfm, смотри метод УстановитьФильтр у документа.
15 Ёпрст
 
гуру
17.06.11
12:35
да и.. весь код в топку.
Пользуйся проведением через операции - проведение документов, там документы проводятся в потоке, а не в "заднем" числе, как у тебя в (0) , причем, еще и в транзакции, что в корне не верно.
16 zhenianik
 
17.06.11
12:38
(15) Если трудно, расскажите, почему транзакции делают неверные движения? Через операции побовал, кучу ошибок выдает, поэтому и написал в "заднем" числе
17 Cthulhu
 
17.06.11
12:39
1с не поддерживает вложенные транзакции. Проведение само по себе выполняется в транзакции.
За проведение в транзакции - прострелить коленку нахрен.
При ошибке в процессе такого некорректного действа вполне можно получить проводки(движения) у непроведенного документа. со всеми вытекающими.
18 Ёпрст
 
гуру
17.06.11
12:41
(16) ну подумай сам.. у тебя новые движения сделанные предыдущим документом не учитываются при проведении следующего, ибо транзакция не зафиксирована.
Следовательно, при получении останков будут всегда браться "старые" записи от "старых" движений этих же документов.
Фирштейн ?
19 zhenianik
 
17.06.11
12:43
(18) во я тупанул, фирштейн, спасибо Ёпрст3