Имя: Пароль:
1C
 
быстрая очистка регистра бухгатерии
0 MegaKent
 
13.10.10
07:51
Здрасти.
как быстро очистить регистр бухгалтерии
за опреденный период. по определенно организации
примечание: движения делает только документ "ОперацияБух"
Конфа: Бух 2.0
платформа 8.2
пояснение:
как бы вообще я килю большое количество этих документов за ~2 месяца

тут возникла идея не открывать у каждого дока движения вычищать их а потом килять документ.
мож просто очистить все движения))) а то в рабочей базе это делается около часа. а загрузка доков и движений минут 20-30

сейчас работает вот так вот:
Процедура ЗагрузкаБазЗаМесяц(ОчищатьОрганизации=истина) экспорт
   спрБазы=Справочники.Нов_ВнешниеБазы.Выбрать();
   Пока спрБазы.Следующий() Цикл
       ДатаНач=НачалоМесяца(ДобавитьМесяц(ТекущаяДата(),-1));
       ДатаКон=КонецДня(ТекущаяДата());
       Если ОчищатьОрганизации Тогда
           СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), очещается. время начала выборки данных - "+строка(ТекущаяДата()));            
           Запрос = Новый Запрос;
           Запрос.Текст =
           "ВЫБРАТЬ
           |    ОперацияБух.Ссылка
           |ИЗ
           |    Документ.ОперацияБух КАК ОперацияБух
           |ГДЕ
           |    ОперацияБух.Дата >= &ДатаНач
           |    И ОперацияБух.Дата <= &ДатаКон
           |    И ОперацияБух.Организация = &Организация
           |
           |УПОРЯДОЧИТЬ ПО
           |    ОперацияБух.Дата";
           запрос.УстановитьПараметр("ДатаНач",ДатаНач);
           запрос.УстановитьПараметр("ДатаКон",ДатаКон);
           запрос.УстановитьПараметр("Организация",спрБазы.ссылка.Организация.ссылка);
           Результат = Запрос.Выполнить();
           ВыборкаДетальныеЗаписи = Результат.Выбрать();
           СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), очещается. количество данных к очистки -"+ВыборкаДетальныеЗаписи.Количество()+". время начала очистки - "+строка(ТекущаяДата()));
           Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
               док=ВыборкаДетальныеЗаписи.ссылка;
               докО=док.получитьОбъект();
               доко.Движения.Хозрасчетный.Очистить();
               доко.Движения.Хозрасчетный.Записать();
               доко.Записать();
               доко.Удалить();
           КонецЦикла;                
       КонецЕсли;
       
       СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), очещена. время окончания - "+строка(ТекущаяДата()));        
       СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), даты загрузки: " +Строка( ДатаНач)+" - "+ Строка(ДатаКон));
       СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), загружается. время начала - "+строка(ТекущаяДата()));        
       ОбъБаза=спрБазы.ПолучитьОбъект();
       обр=Обработки.Нов_ЗагрузитьВнешнююБазу.Создать();
       обр.База=спрБазы.Ссылка;
       
       обр.ЗагрузитьПериодБазы(ДатаНач ,ДатаКон);
       ОбъБаза.ДатаПоследнейЗагрузки=ДатаКон;
       ОбъБаза.Записать();
       
       СообщитьЭкранФаил("База ("+спрБазы.Наименование+"), загружена. время окончания -"+строка(ТекущаяДата()));
   конеццикла;
КонецПроцедуры // ЗагрузитьМесяц()
1 MegaKent
 
13.10.10
08:23
и тишина....
2 asady
 
13.10.10
08:57
(0) 1. нафига записывать объект если очищаешь только движения
2. рекомендую отключить использование итогов по очищаемым регистрам перед обработкой и включить их использование после.
3 Fragster
 
гуру
13.10.10
09:01
truncate table... - работает быстрее всего
4 MegaKent
 
13.10.10
09:26
(2) а не надо ?  да там при замере производительности не долго все делается (всмысле запись)
(3)хм.. ты имеешь ввиду запрос sql дать на сервер.

пробывал так вот делать :
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ОперацияБух.Ссылка как Док
       |ИЗ
       |    Документ.ОперацияБух КАК ОперацияБух
       |ГДЕ
       |    ОперацияБух.Дата >= &ДатаНач
       |    И ОперацияБух.Дата <= &ДатаКон
       |    И ОперацияБух.Организация = &Орг";

   Запрос.УстановитьПараметр("ДатаКон", КонПериода);
   Запрос.УстановитьПараметр("ДатаНач", НачПериода);
   Запрос.УстановитьПараметр("Орг", Орг);
   
   Рез = Запрос.Выполнить();
   тз=рез.Выгрузить();
   мас=тз.ВыгрузитьКолонку("Док");
   СпЗн=Новый СписокЗначений();
   СпЗн.ЗагрузитьЗначения(мас);
   нз=РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
   нз.Отбор.регистратор.ВидСравнения=ВидСравнения.ВСписке;    
   нз.Отбор.регистратор.Использование=Истина;    
   нз.Отбор.регистратор.Значение=СпЗн;
   нз.Прочитать();    
   нз.Очистить();
   нз.Записать();

оказалось что список низя в отбор по регистратору
цитирую СП :
Тип: Отбор. Содержит объект Отбор, по которому осуществляется текущая фильтрация записей при считывании или записи набора. Позволяет отобрать записи с определенным регистратором при считывании или записи набора.
Важно! Отбор может устанавливаться только на равенство.
последняя строчка не порадовала ((((


еще есть варианты делать через стандартные средства?
5 asady
 
13.10.10
11:26
(4) при отключенных итогах всё залетает
6 MegaKent
 
13.10.10
11:54
(9)
просто баз у меня 9 штук.. отключение быстрое.. включение занимает порядка 20-50 минут
выйгрыш не большой..
или "плохому танцору всегда что-то мешает" ?? )))))
7 asady
 
13.10.10
12:15
МР = РегистрыБухгалтерии.Хозрасчетный;
НЗБух = МР.СоздатьНаборЗаписей();
МР.УстановитьИспользованиеИтогов(Ложь);

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ОперацияБух.Ссылка как Док
       |ИЗ
       |    Документ.ОперацияБух КАК ОперацияБух
       |ГДЕ
       |    ОперацияБух.Дата >= &ДатаНач
       |    И ОперацияБух.Дата <= &ДатаКон
       |    И ОперацияБух.Организация = &Орг";

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

если документов много выигрыш будет большой
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший