Имя: Пароль:
1C
1С v8
v8: Свёртка базы: почему так долго чистит регистр "Хозрасчетный"?
0 dave2000
 
23.07.13
11:44
Есть база УПП на MS SQL Server 2005, поток документов в день небольшой: около 30-40 документов максимум! В начале этого года делал свёртку базы за 2008-й год. Создание документов остатков проходило быстро, движения по всем регистрам удалялись быстро, за исключением регистра бухгалтерии "Хозрасчетный", его чистка по времени занимала около 8-12 часов. Сейчас запустил свёртку 1 квартала 2009, думал пройдёт всё намного быстрее, но нет! Чистка регистра бухгалтерии занимает около 7-10 часов. Чего ж оно так долго-то? Мне кажется вручную удалять документы было бы намного быстрее, но это ведь не выход.

Когда открываешь диспечер задач, процесс sqlservr.exe что-то делает, загрузка около 80%. Может оно там таблицы пережимает, с места на место данные переставляет, и из-за этого так долго? В самой обработке "Свертка Информационной Базы 2.0" код чистки регистра выглядит так:



Процедура сбУдалитьДвиженияПоРегиструСРегистратором(ТипОбъектаМД, ИмяРегистра, ДатаНачала, ДатаОкончания) Экспорт
   ДокументСсылка = Неопределено;
   СсылкаНач = Неопределено;
           
   ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10000
                  |    ДокументРег.Регистратор КАК Регистратор
                  |ИЗ
                  |    " + ТипОбъектаМД + "."+ИмяРегистра+" КАК ДокументРег
                  |ГДЕ
                  |    ДокументРег.Период >= &ДатаНач
                  |    И ДокументРег.Период <= &ДатаКон";
           
   Пока Истина Цикл
               
       Запрос = Новый Запрос;
       Запрос.Текст = ТекстЗапроса;
               
       Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНачала));
       Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);
               
       Результат = Запрос.Выполнить();
       
       Если Результат.Пустой() Тогда
           Прервать;
       КонецЕсли;    
       
       Строка = Результат.Выбрать();
       Пока Строка.Следующий() Цикл
           СсылкаНач = Строка.Регистратор;
           
           Если ВРЕГ(ТипОбъектаМД) = "РЕГИСТРНАКОПЛЕНИЯ" Тогда
               НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
           ИначеЕсли ВРЕГ(ТипОбъектаМД) = "РЕГИСТРСВЕДЕНИЙ" Тогда
               НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
           ИначеЕсли ВРЕГ(ТипОбъектаМД) = "РЕГИСТРБУХГАЛТЕРИИ" Тогда
               НаборЗаписей = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
           Иначе

               сбСообщениеСвертки(НСтр("ru='Не известный тип объекта метаданных ';uk='Невідомий тип об`єкта метаданих '") + ТипОбъектаМД);
               Возврат;
           КонецЕсли;    
               
           НаборЗаписей.Отбор.Регистратор.Установить(Строка.Регистратор);
           НаборЗаписей.Записать();
       КонецЦикла;
   КонецЦикла;
   
КонецПроцедуры



Может можно как-то более оптимизировать данный код?
1 Maxus43
 
23.07.13
11:55
Итоги отключи
2 Maxus43
 
23.07.13
11:55
или в транзакции делай, по тыще другой доков
3 Vovan1975
 
23.07.13
11:57
(1) думается мне - дело в итогах, этож регистр бухгалтерии...
4 acsent
 
23.07.13
11:58
(2) все 7 методы никак не можешь забыть?
5 Maxus43
 
23.07.13
12:00
(4) нормальный метод, лучше конечно итоги отключить
6 fisher
 
23.07.13
12:01
Дело однозначно в пересчете итогов, но сомневаюсь что их можно отключить безболезненно для работы обработки свертки. Она ж остатки тоже где-то снимает. Нужно четко выверенное вмешательство.
7 fisher
 
23.07.13
12:03
Хотя... Стопудов она их снимает ДО. Но на всяк пожарный я бы прошелся по алгоритму. Может, и еще какое шаманство есть.
8 dave2000
 
23.07.13
12:18
(1) (3) (6) (7) Посмотрел по коду, перед вызовом процедуры сбУдалитьДвиженияПоРегиструСРегистратором() есть такая строка:

РегистрыБухгалтерии[ТекСтрока.ОбъектМД].УстановитьИспользованиеИтогов(Ложь);

Т.е. итоги отключаются, причина в чём-то другом.
9 Живой Ископаемый
 
23.07.13
12:21
просто не надо его чистить, нужно завести документы остатков и перенести их в пустую базу.
10 dave2000
 
23.07.13
12:32
(9) там документы за 2009-2013 год, это действующая рабочая база, с неё нужно убрать старые периоды
11 Maxus43
 
23.07.13
12:33
существующий алгоритм уже не ускорить...
12 Живой Ископаемый
 
23.07.13
13:11
2(10) и как это отменяет то, что я сказал?
13 Живой Ископаемый
 
23.07.13
13:13
то есть либо ты из дейстующей базы "убрать старые периоды", что влечет за собой чистку РБ Хозрасчтеный.
Либо ты разворачиваешь пустую базу, и переносишь документы ввода остатков, созданные сверткой в нее. Есть версия, что вариант займет меньше времени.
14 dave2000
 
23.07.13
13:14
(12) ты имеешь в виду, перенести не только все документы остатков, а и все рабочие документы 2009-2013?
15 acsent
 
23.07.13
13:15
(8) нужно еще
РегистрыБухгалтерии[ТекСтрока.ОбъектМД].УстановитьИспользованиеТекущихИтогов(Ложь);
16 Живой Ископаемый
 
23.07.13
13:15
2(14) что такое рабочий документ 2009-2013? Это документ который имеет проводки и движения? Чувак, ты же чистишь их  движения, то есть они перестанут быть рабочими
17 dave2000
 
23.07.13
13:28
(16) Ты не понял... чистятся только периоды до 2 квартала 2009, остальные документы остаются на месте, так была поставлена задача.
18 Живой Ископаемый
 
23.07.13
13:29
2(17) да, наверное не понял.. а зачем так делать?
19 acsent
 
23.07.13
13:31
(18) там может с 2003 года база
20 Живой Ископаемый
 
23.07.13
13:33
2(19) и тем не менее.. я бы попробовал перенести все документы с момента свертки в новую базу. вдруг это будет быстрее..
21 Bober
 
23.07.13
15:20
(0)
 - Перед циклом создать набор записей и им одним пользоваться
 - убрать условия в цикле (все равно все идет в рамках обного регистра
 - Сделать переменную ЭлементОтбора = НаборЗаписей.Отбор.регистратор и в цикле с ним работать
 - отключить как уже говори выше итоги, но не забудь отключить и текущие итоги. Если в базе работают люди, то отключать итоги нельзя, только сделать период расчета итогов 00010101 и отключи текущие итоги. Запросы будут тормозить, но люди смогут работать.
 - далее можно через фоновое задание раскидать, одно задание - один регистр.
22 Bober
 
23.07.13
15:23
(8) удаление движений по бух всегда идет туго, но в этом варианте случае думаю не хватает еще строки
УстановитьИспользованиеТекущихИтогов(Истина), так как при удалении все равно считаются итоги на 3999 год
23 Bober
 
23.07.13
15:24
УстановитьПериодРассчитанныхИтогов('00010101')
И
УстановитьИспользованиеТекущихИтогов(Ложь)