Имя: Пароль:
1C
1С v8
Почему медленно удаляються объекты даже в транзакции?
,
0 Shur1cIT
 
31.05.13
17:22
может транзакцию не правильно юзаю?


Процедура ОсновныеДействияФормыУдалитьСсылки(Кнопка)
   НачатьТранзакцию();
   Для каждого  Стр ИЗ  ЭлементыФормы.Ссылки.Значение Цикл
       Если Строка(ТипЗнч(Стр.Данные)) = "Реализация товаров и услуг" Или  Строка(ТипЗнч(Стр.Данные)) = "Поступление товаров и услуг" Тогда
           Сообщить(Стр.Данные);
           Стр.Данные.ПолучитьОбъект().удалить();
       КонецЕсли;
   КонецЦикла;
   Сообщить("Завершаем транзакцию");
   ЗафиксироватьТранзакцию();
КонецПроцедуры
1 Господин ПЖ
 
31.05.13
17:22
жестЪ
2 Wobland
 
31.05.13
17:23
множественное сообщить вообще неплохо так систему грузит
3 Shur1cIT
 
31.05.13
17:23
(1) где-то ошибка да?
4 Wobland
 
31.05.13
17:23
(3)  Строка(ТипЗнч(Стр.Данные)) как минимум
5 Shur1cIT
 
31.05.13
17:23
сообщить для проверки, но реально одно "сообщить" в секунду как будто не в транзакции
6 vde69
 
31.05.13
17:26
1. нет отката по ошибке
2. сравнение по синониму метаданных (надо по типам)
3. транзакция неограниченного размера - обычно медленно (оптимально по 200-500 элементов за одну транзакцию)
4. сообщить на каждой итерации - не гуд
7 H A D G E H O G s
 
31.05.13
17:27
(3) Ошибка в том, что ты не послушал моего совета 3-х недельной давности и не поменял профессию.
8 acsent
 
31.05.13
17:29
В отличии от 77 транзакция вообще не ускоряет, а даже замедляет выполнение команд
9 Jaap Vduul
 
31.05.13
17:29
А кто-то обещал, что в транзакции будет быстрее?
10 Shur1cIT
 
31.05.13
17:29
Стр.Данные.ПолучитьОбъект().удалить();
по замерам выполняет 75% времени
11 acsent
 
31.05.13
17:29
отключи регистры на время удаления
12 Shur1cIT
 
31.05.13
17:30
(8) (9) так ить всегда убыстряла так как физическое удаление происходит только при фиксировании транзакции
13 Shur1cIT
 
31.05.13
17:33
(1) (7) это одноразовая обработка на коленке
14 Jaap Vduul
 
31.05.13
17:33
(12)
С чего бы вдруг?
15 Shur1cIT
 
31.05.13
17:33
(14) а разве нет?
16 ДенисЧ
 
31.05.13
17:34
(15) нет
17 Shur1cIT
 
31.05.13
17:38
значит что-то спутал... наверно с 77
18 vde69
 
31.05.13
17:40
примерно так, за ошибки и стиль извеняйте, пишу "с листа"



Процедура ОсновныеДействияФормыУдалитьСсылки(Кнопка)
   НачатьТранзакцию();

е = 1;

попытка
м = ЭлементыФормы.Ссылки.Значение;
т1 = ТипЗнч(Документы.РеализацияТоваров.ПустаяСсылка);
т2 = ТипЗнч(Документы.ПоступлениеТоваров.ПустаяСсылка);
   Для каждого  Стр ИЗ м Цикл
тд = Стр.Данные;
       Если (ТипЗнч(тд) = т1)
Или  (ТипЗнч(тд) = т2) Тогда
//            Сообщить(Стр.Данные);
од = тд.получитьобъект();
од.Удалить();
       КонецЕсли;

если е > 500 Тогда
   ЗафиксироватьТранзакцию();
   НачатьТранзакцию();
е = 1;
конецесли;
е=е+1;


   КонецЦикла;
если транзакцияактивна() тогда
   ЗафиксироватьТранзакцию();
конецесли;

исключение
сообщить ("трендец");
если транзакцияактивна() тогда
   отменитьтранзакцию();
конецесли;
конецпопытки
КонецПроцедуры
19 Shur1cIT
 
31.05.13
17:41
львиную долю од.Удалить();
занимает как и у меня
20 Shur1cIT
 
31.05.13
17:42
остальное копейки которыми для отчета на коленке можно принебречь
21 H A D G E H O G s
 
31.05.13
17:43
Зайти в ТонкийКлиент и отключить пересчет Итогов.
22 H A D G E H O G s
 
31.05.13
17:43
А потом включить
23 vde69
 
31.05.13
17:44
еще можно

од = тд.получитьобъект();
од.обменданными.загрузка = истина;
од.Удалить();

будет быстрее, только не забудь что движения могут остатся висеть
24 H A D G E H O G s
 
31.05.13
17:44
Глобальный контекст (Global context)
УдалитьОбъекты (DeleteObjects)
Синтаксис:

УдалитьОбъекты(<СписокСсылок>, <Проверять>, <НайденныеДанные>)
25 Shur1cIT
 
31.05.13
17:45
(24) ок спасибо !
26 krbIso
 
31.05.13
17:46
нафига вообще тут НачатьТранзакцию?, при удалении и так неявная транзакция будет открыта
27 Shur1cIT
 
31.05.13
17:47
(26) я предполагал что быстрее будет как в 77