Имя: Пароль:
1C
1C 7.7
v7: Обработка пометить документы на удаление
0 msk-07
 
02.03.13
00:17
Пишу обработку, понимаю, что для кого-то это расплюснуть, но а я хочу разобраться. Прошу помогите найти ошибку, почему не срабатывает метод Удалить



Процедура Заполнить()
   Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата  по  КонДата;
   |ОбрабатыватьДокументы все;
   |Обрабатывать НеПомеченныеНаУдаление;
   |Контрагенты = Справочник.Контрагенты.ТекущийЭлемент;
   |Реализация = Документ.Реализация.ТекущийДокумент;
   |Группировка Реализация упорядочить по Реализация.ДатаДок;
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл
       // Заполнение полей Реализация
       Таб.ВывестиСекцию("Реализация");
   КонецЦикла;
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
//    Таб.Показать("Сформировать", "");    
   
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
   Возврат;
КонецЕсли;

Запрос.Выгрузить(ТЗ,0,1);        


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

Процедура Выполнить()    
   НачатьТранзакцию();
   ФлагФиксТранзакции = 1;
   
   ТЗ.ВыбратьЭлементы();
       Пока ТЗ.ПолучитьЭлемент()=1 Цикл
   
       ТЗ.Удалить(0);
       
   КонецЦикла;
   
   Если ФлагФиксТранзакции = 1 Тогда  
       ЗафиксироватьТранзакцию();
   Иначе
       ОтменитьТранзакцию();
   КонецЕсли;
   
КонецПроцедуры
1 Джордж1
 
02.03.13
00:19
Метод не у того объекта применяешь
2 msk-07
 
02.03.13
00:21
В тз все выгрузил, теперь пересчет строку в цикле делаю и пока это делаю хочу их удалить

   
   ТЗ.ВыбратьСтроку();
       Пока ТЗ.ПолучитьСтроку()=1 Цикл
   
       ТЗ.Удалить(0);
3 Джордж1
 
02.03.13
00:21
Ну и посмотри что ты удаляешь
4 Кокос
 
02.03.13
00:26
ОбъектыДок.НайтиДокумент(ТЗ.Реализация);
ОбъектыДок.Удалить(0);
5 msk-07
 
02.03.13
00:32
Значение не представляет агрегатный объект (НайтиДокумент)
6 msk-07
 
02.03.13
00:42
Процедура Выполнить()    
   НачатьТранзакцию();
   ФлагФиксТранзакции = 1;
   ОбъектыДок.НайтиДокумент(ТЗ.Реализация);  
       ОбъектыДок.Удалить(0);
   Если ФлагФиксТранзакции = 1 Тогда  
       ЗафиксироватьТранзакцию();
   Иначе
       ОтменитьТранзакцию();
   КонецЕсли;
   
КонецПроцедуры
7 msk-07
 
02.03.13
00:42
не может все равно удалить :(
8 Кокос
 
02.03.13
00:48
ОбъектДок = СоздатьОбъект("Документ");

ТЗ.ВыбратьСтроку();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
   
       ОбъектыДок.НайтиДокумент(ТЗ.Реализация);
       ОбъектыДок.Удалить(0);
9 NS
 
02.03.13
00:49
Красивый код, ничего что ФлагФикстранзакции всегда будет равен единице?
10 Кокос
 
02.03.13
00:50
эх. 7рка. сто лет ее не трогал :))
11 msk-07
 
02.03.13
00:53
простите, но не получается

ТЗ.ВыбратьСтроку();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
   
       ОбъектыДок.НайтиДокумент(ТЗ.Реализация);
       ОбъектыДок.Удалить(0);
       КонецЦикла;
   Если ФлагФиксТранзакции = 1 Тогда  
       ЗафиксироватьТранзакцию();
   Иначе
       ОтменитьТранзакцию();
   КонецЕсли;
12 msk-07
 
02.03.13
00:53
он не находит документ
13 Cthulhu
 
02.03.13
00:58
по краю ходишь.
пометка на удаление проведенного документа выполняется с предварительной отменой его проведения..
проведение и отмена проведения документов выполняются во "внутренней" (организовываемой самим движком) транзакции.
вложенные транзакции 1с не поддерживает.
рискуешь получить помеченные на удаления документы с движениями (которые толком без плясок даже и не увидишь)
14 msk-07
 
02.03.13
01:00
документы не проведенные, это точно
15 NS
 
02.03.13
01:01
|Период с НачДата  по  КонДата;
   |ОбрабатыватьДокументы все;
   |Обрабатывать НеПомеченныеНаУдаление;
   |Контрагенты = Справочник.Контрагенты.ТекущийЭлемент;
   |Реализация = Документ.Реализация.ТекущийДокумент;
   |Группировка Реализация упорядочить по Реализация.ДатаДок;

А это что за чудеса?
16 NS
 
02.03.13
01:02
Потом - зачем два раза выполнять запрос? Есть метод вначаловыборки()
17 msk-07
 
02.03.13
01:05
простите но не кажется что все таки что-то не так здесь

  ОбъектыДок.НайтиДокумент(ТЗ.Реализация);
       ОбъектыДок.Удалить(0);

Все время ругается на удалить
18 NS
 
02.03.13
01:10
ОбъектыДок у тебя как определены?
=Создатьобъект("Документ")?
19 Злопчинский
 
02.03.13
03:28
внимание, вопрос - ты хочеь пометить на удаление или удалить?
20 Дегенератор идей
 
02.03.13
08:24
(13) что значит не поддерживает вложенные транзакции?
21 mishaPH
 
02.03.13
08:27
(13) глупость
22 mishaPH
 
02.03.13
08:30
Процедура Выполнить()    
   НачатьТранзакцию();

   ТЗ.ВыбратьЭлементы();
       Пока ТЗ.ПолучитьЭлемент()=1 Цикл
          Док = СоздатьОбъект("Документ."+ТЗ.Реализация.Вид());  
          Док.НайтиДокумент(ТЗ.Реализация);
          Док.Удалить(0);
       КонецЦикла;
    ЗафиксироватьТранзакцию();
КонецПроцедуры
23 mishaPH
 
02.03.13
08:31
(15) кстати да. что за фигня
24 mishaPH
 
02.03.13
08:32
Автор. тебе тупо надо выбрать проведенные доки и их удалить? нафига тогда черный запрос.
25 mishaPH
 
02.03.13
08:34
Процедура Выполнить()  

   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"

   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Таб.ТолькоПросмотр(1);
 
   НачатьТранзакцию();
   Док = СоздатьОбъект("Документ.Реализация");  
   Док.ВыбратьДокументы()
       Пока Док.ПолучитьДокумент()=1 Цикл
          Таб.ВывестиСекцию("Реализация");
          Док.Удалить(0);
       КонецЦикла;
    ЗафиксироватьТранзакцию();
Таб.Показать();
КонецПроцедуры
26 mishaPH
 
02.03.13
08:34
и к чему печатная таблица?
27 mishaPH
 
02.03.13
08:35
если тупо удалить доки то выпили из (25) код с таблицей
28 sapphire
 
02.03.13
10:16
Изобретение колеса продолжается?
29 Lionee
 
02.03.13
10:35
ага квадратного
30 Cthulhu
 
02.03.13
12:10
(20): что непонятно в это фразе из документации?
(21): глупостью было бы полагать, что собеседник высказывает свое мнение без достаточных на то оснований. так что глупость - ты сказал, но не я. а ситуацию такую сам видел (наличие движений у помеченных на удаление вследствие использования пакетного проведения/распроведения/плясокспометкойнаудаление в транзакции).
31 mishaPH
 
02.03.13
18:04
(30) Однажды встречал такое. но с транзакциями не связывал
32 Cthulhu
 
02.03.13
23:40
(31): я просто вынужден был связать. после того, как мне показали - после чего это случилось. и этим самым "чем" оказалась обработка, лупящая в транзакции цикл с проведением/распроведением и пометку на удаление со снятием (по условиям определенным), проверил на том же наборе данных (есс-но после выпрямления кривизны ранее обнаруженной) - ага, точнёхонько воспроизвелось. но там нюанс - был вылет по ошибке. что, однако, не меняет сути. в связи с чем проведение в транзакции с тех пор - табу. подтвержденное приведенными выше выдержками из комплектного мануала.
33 Torquader
 
03.03.13
01:24
(32) Без вылета вложенные транзакции в 1С прекрасно работают, только нужно учитывать один нюанс - ОтменитьТранзакцию() будет работать только для основной транзакции, то есть все открытые вложенные просто увеличивают счётчик транзакции, но никак не влияют на результат.
В случае проведения, это означает, что если система отменит проведение документа (в случае неуспеха), то ошибки не произойдёт, но и проведение не отменится.

То есть имеем проведённый документ.
Открываем транзакцию.
Изменяем документ.
Записываем.
Выполняем проведение - тут ошибка - должна произойти отмена (и функция провести возвращает неуспех), а в базе остаются последствия проведения (причём не старое состояние, а часть нового).
34 Злопчинский
 
03.03.13
01:33
(33) не понял малость вот этого:
> В случае проведения, это означает, что если система отменит проведение документа (в случае неуспеха), то ошибки не произойдёт, но и проведение не отменится.
.
код типа

НачатьТранзакцию();
Цикл по докам
 Результат = Док.Провести();
 Если Результат = 0
 Тогда
   ОтменитьТранзакцию();
   Возврат;
 КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
.
покатит или нет?
35 Torquader
 
03.03.13
15:22
(34) Так прокатит, но только в том случае, когда это всё ещё в одну транзакцию не завёрнуто.
Там ещё есть фокусы с обработкой Попытка Исключение в случае транзакций.