Имя: Пароль:
1C
1С v8
Как оптимизировать запись регистра сведений
,
0 idw
 
14.02.13
19:46
Делаю перенос из 1С 7.7 в 1С 8 периодического реквизита с помощью ОЛЕ,
написал вот такой код:

           КодКонтра77  = СпрДог77.Контрагент.Код;
           КодДоговор77 = СпрДог77.Код;
           Спр=Справочники.Договоры.НайтиПоКоду(КодДоговор77);
           Если НЕ Спр.Пустая() Тогда
               Если СокрЛП(Спр.Контрагент.Код) = СокрЛП(КодКонтра77) Тогда                    
                   НаборЗаписей = РегистрыСведений.СуммаДоговоров.СоздатьНаборЗаписей();
                   НаборЗаписей.Отбор.Договор.Установить(Спр.Ссылка);
                   
                   Попытка
                       Периодический77.ИспользоватьОбъект("Сумма",СпрДог77.ТекущийЭлемент());
                       Периодический77.ВыбратьЗначения();
                       Пока Периодический77.ПолучитьЗначение() > 0 Цикл
                           Дата = Периодический77.ДатаЗнач;
                           Сумма = Периодический77.Значение;
                           
                           НовЗапись = НаборЗаписей.Добавить();
                           НовЗапись.Период = Дата;
                           НовЗапись.Договор = Спр.Ссылка;  
                           НовЗапись.Сумма = Сумма;
                       КонецЦикла;
                   Исключение
                       Сообщить(СпрДог77.Код);
                   КонецПопытки;
                                       
                   НаборЗаписей.Записать(Истина);
                   
               КонецЕсли;
            КонецЕсли;


Очень долго выполняется. Может можно его оптимизировать?
1 idw
 
14.02.13
19:55
(0) да идет перебор договоров в 1С 7.7 и для каждого договора переношу историю изменения суммы договора.
2 Очкарик
 
14.02.13
19:58
тут не набор записей тормозит, а 7.7
3 UnsavedSoul
 
14.02.13
19:58
Думаю, узкое место в записи в цикле. Попробуй создать сперва ТЗ с данными, загрузить ее в набор и его разом записать.
4 Очкарик
 
14.02.13
20:00
(3) никакого узкого места там нет.
НовЗапись = НаборЗаписей.Добавить() не создает никакой записи. Это просто заполняемая таблица в памяти до момента метода Записать()
5 Очкарик
 
14.02.13
20:01
(0) скорее всего долго выполняется из-за чтения периодических реквизитов 7.7.
6 GANR
 
14.02.13
20:03
(0) Что говорит замер? ppf-ник в студию.
7 UnsavedSoul
 
14.02.13
20:04
(4) так сказали же в (1), что договора перебираются. И НЗ пишется на каждом витке исходя из кода.
8 Очкарик
 
14.02.13
20:08
(7) ну теоретически можно выбрать все периодические реквизиты в ТаблицаЗначений и загрузить в Набор записей один раз. Но не думаю, что это кардинально ускорит.

Главный тормоз там - это перебор истории периодических реквизитов.
9 idw
 
14.02.13
20:18
Пробую без записи в регистр сведений запускать обработку. Долго выполняется и без записи, просто перебор.
Вот код перебора:

СпрОрг77.ВыбратьЭлементы();
   Пока СпрОрг77.ПолучитьЭлемент()=1 Цикл  
       Ном=Ном+1;        
       
       СпрДог77.ИспользоватьВладельца(СпрОрг77.ТекущийЭлемент());
       СпрДог77.ВыбратьЭлементы('20100101','20131231');
       Пока СпрДог77.ПолучитьЭлемент()=1 Цикл
           Если СпрДог77.ЭтоГруппа()=1 Тогда            
               Продолжить;
           КонецЕсли;

           Если СпрДог77.Контрагент.ПринадлежитГруппе(Группа1)=0 Тогда
               Продолжить;
           КонецЕсли;    
           
           КодКонтра77  = СпрДог77.Контрагент.Код;
           КодДоговор77 = СпрДог77.Код;
           Спр=Справочники.Договоры.НайтиПоКоду(КодДоговор77);
           Если НЕ Спр.Пустая() Тогда
10 idw
 
14.02.13
20:18
(8) либо перебор истории, либо поиск в базе 1С 8. Либо то и другое.
11 Очкарик
 
14.02.13
20:22
(9) на семерке ты больше никак не выберешь историю. Смирись.
12 UnsavedSoul
 
14.02.13
20:26
(8)(9)
Умываю руки. #семеркастаршеменя :)
Основная теорема систематики: Новые системы плодят новые проблемы.