Имя: Пароль:
1C
1С v8
Как бы ускорить?
0 AlStorm
 
21.11.11
08:50
// регистрируем в обмен документ    
                   Если не ПланыОбмена.ИзменениеЗарегистрировано(СтрокаЗаписиКатегории.Категория.УзелОбмена, ОбъектЗаписиСсылка) Тогда
                       ПланыОбмена.ЗарегистрироватьИзменения(СтрокаЗаписиКатегории.Категория.УзелОбмена, ОбъектЗаписиСсылка);
                   КонецЕсли;
                       
                   // и все его движения
                   Если ОбъектЗаписиСсылка.Проведен Тогда
                       ОбъектЗаписи = ОбъектЗаписиСсылка.ПолучитьОбъект();
                       Для каждого Запись Из ОбъектЗаписи.Движения Цикл
                           Запись.Прочитать();
                           Если Запись.Количество() > 0 и Метаданные.ПланыОбмена.Полный.Состав.Содержит(Метаданные.НайтиПоТипу(ТипЗнч(Запись))) Тогда
                               Если не ПланыОбмена.ИзменениеЗарегистрировано(СтрокаЗаписиКатегории.Категория.УзелОбмена, Запись) Тогда
                                   ПланыОбмена.ЗарегистрироватьИзменения(СтрокаЗаписиКатегории.Категория.УзелОбмена, Запись);
                               КонецЕсли;
                               
                           КонецЕсли;
                       КонецЦикла;
                   КонецЕсли;




Всем привет. Есть вот такой код. Он регистрирует к обмену документ и все его движения.
Очень много времени (процентов 80) занимает операция Запись.Прочитать(), тк для некоторых типов документов список регистров, по которым они делают движения очень большой..
Как бы это все дело ускорить?
1 Нуф-Нуф
 
21.11.11
08:51
а типовая обработка регистрации не подходит? и посмотреть как она работает?
2 AlStorm
 
21.11.11
08:53
(1)
Типовая обработка регистрации не регистрирует движения дока.. Только отдельно записи регистров
3 hhhh
 
21.11.11
09:15
(2) ну может не ПолучитьОбъект() а СоздатьНаборЗаписей(). Без получения объекта.
4 mikecool
 
21.11.11
09:17
а нафиг Запись.Прочитать? вроде уже перебираешь движения
5 guitar_player
 
21.11.11
09:20
(4) иначе как он переберет не прочтенные движения?
6 H A D G E H O G s
 
21.11.11
09:22
ОбъектЗаписи = ОбъектЗаписиСсылка.ПолучитьОбъект();
ОбъектЗаписи.Движения.Прочитать();
                       Для каждого Запись Из ОбъектЗаписи.Движения Цикл
                         
                           Если Запись.Количество() > 0 и
7 AlStorm
 
21.11.11
09:22
(3)
Зачем?
Набор записей создается пустым..

(4)
Ну как бы это объяснить... ммм... :)
8 AlStorm
 
21.11.11
09:22
(6)
и?
9 AlStorm
 
21.11.11
09:22
(6)
А, все, понял
10 AlStorm
 
21.11.11
09:24
(6)
Но разве так можно? В СП ни слова..
11 AlStorm
 
21.11.11
09:26
(6)
Нельзя...
12 hhhh
 
21.11.11
09:33
(7) Запись = ТвойРегистр.СоздатьНаборЗаписей();
    Запись.Отбор.Установить(ОбъектЗаписиСсылка);
    Запись.Прочитать();

Здесь не нужно получать объект, прикинь.
13 AlStorm
 
21.11.11
09:34
(12)
Точно! Сам не допер почему-то:)

PS Регистратор забыл
14 AlStorm
 
21.11.11
09:34
Хотя стоп... А откуда я узнаю регистр?
15 H A D G E H O G s
 
21.11.11
09:35
(11) Точно нельзя, странно.
16 H A D G E H O G s
 
21.11.11
09:36
(12) Прочитывать не надо.
17 H A D G E H O G s
 
21.11.11
09:37
ОбъектЗаписиСсылка.Метаданные().
18 Axel2009
 
21.11.11
09:37
и в какой момент то это происходит??
19 AlStorm
 
21.11.11
09:38
(18)
Подписка на событие записи категории...

(17)
чито это?
20 Axel2009
 
21.11.11
09:39
(19) ну там же объект есть, а не ссылка. плюс ко всему тебе надо получать сам факт наличия записей, а не количества, поэтому в запросе выбрать первые 1 и вперед и с песней.
21 AlStorm
 
21.11.11
09:42
(20)
В каком запросе? Я заранее не знаю, какого типа у меня документ, и регистры, по которым он может делать движения тоже не знаю. Ставлю категорию... И мне для каждого регистра, по которому он делает движения, запрос делать? Не резон...
22 Axel2009
 
21.11.11
09:44
(21) не обращаться к метаданным умеешь ведь, вот и тут тоже самое.
а ты думаешь Запись.Прочитать(); не запрос для каждого регистра??
23 vmv
 
21.11.11
09:44
Метаданные.ПланыОбмена.Полный.Состав да и все что с метаданными в итерациях цикла завернуть в элементарные коллекции(соответствие, сттруктура) в крайнем случае список
24 AlStorm
 
21.11.11
09:44
Как определить наличие записей в регистре определенного регистратора без оператора Прочитать()?
25 Axel2009
 
21.11.11
09:46
(24) ну ты посмотри процедуру которая удаляет движения из регистров, там тот же самый принцип
26 AlStorm
 
21.11.11
09:48
(22)
блин... запрос в цикле всегда старался не писать:)

(23)
Да это не надо, т.к. дважды по одному регистру цикл не прохордит у меня.

(25)
Кстати, идея, да:)
27 vmv
 
21.11.11
09:48
в 8.2 в тонком клиента на котором уже работают некоторые типовые полностью из-за особенностей передач управления клиент-сервер и обратно передача параметров через элементарные коллеции используется очень часто и лучше сразу затвинуть в архивы мозга все что умел толстый клиент в том числе и прямое обращение к метаданным.

Если уж они нужны в обходах, то нужно иметь готовые коллекции перед началом обходов
28 Axel2009
 
21.11.11
09:49
(26) ну и плюс проверка на количество записей не совсем корректна. вот у тебя есть проведенный документ, все перегрузилось. потом отменяешь проведение документа у него записей становится 0, в итоге изменения не регистрируются и набор записей как бы вообще не перегружается
29 AlStorm
 
21.11.11
09:51
(28)
Это уже другая история... Там все отрабатывает по-типовому
30 alkov
 
21.11.11
09:54
Зачем проверка на Запись.Количество() > 0 ?
А если раньше было не 0, а после изменения дока 0, это не должно улететь куда надо?
31 alkov
 
21.11.11
09:55
Ну и Метаданные.ПланыОбмена.Полный.Состав.Содержит(Метаданные.НайтиПоТипу(ТипЗнч(Запись))) можно заменить на Метаданные.ПланыОбмена.Полный.Состав.Содержит(Запись.Метаданные())
32 AlStorm
 
21.11.11
09:57
(30)
Тут отдельная история, я вкурсе...