Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Свертка базы (число прочтений - 15642 )
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #15 - 07. Мая 2008 :: 10:24
Печать  
Nick писал(а) 07. Мая 2008 :: 10:16:
Я ж тебе выложил пример, там всё это есть

О! Точно... А я его только запустил, прождал его часов 10... Недождался, решил свое написать.

А из твоего примера сейчас дернул во такую строку:
Код
Выбрать все
DELETE FROM RA422 WHERE IDDOC IN (SELECT IDDOC FROM _1SJOURN WHERE DATE_TIME_IDDOC <= '20071231Z' 


Судя по коду, то что надо Подмигивание Еще раз сенкс.
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Свертка базы
Ответ #16 - 07. Мая 2008 :: 10:26
Печать  
надо примерно так:

Код
Выбрать все
	DD = СоздатьОбъект("AddIn.V7TextFile");
	DD.ОткрытьФайл(КаталогИБ()+"1Cv7.DDS");
	ttm=_GetPerformanceCounter();
	Состояние("Выполняется запрос к SQL-серверу ...");
	ДТх = Формат(ДатаКонцаПериода+1,"ДГГГГММДД");
	ДТу = Формат(ДобавитьМесяц(ДатаКонцаПериода+1, -3),"ДГГГГММДД");
	DD.ВыбратьСтроки();
	стр="";
	Пока DD.ПрочитатьСтроку(стр)=1 Цикл
		поз=найти(стр,"T=D");
		Если поз>0 Тогда
			тбл=сокрп(сред(стр,поз+2,8));
		//Сообщить(стр);
			sql="delete "+тбл+" from _1sjourn j, "+тбл+" d
			 	  |where d.iddoc=j.iddoc AND j.date_time_iddoc < '"+ДТу+"'
				|";
			RecSet=Conn.Execute(sql);
		КонецЕсли;
		стр="";
	КонецЦикла;
	DD.ЗакрытьФайл();
	Сообщить("Выполняется очистка ЛОГ-файла БД...");
	LogFile.ЗаписатьСтроку("Выполняется очистка ЛОГ-файла БД...");
	// обрезка ЛОГа базы
	sql="BACKUP LOG "+SQL_db+"
	 	  |    WITH TRUNCATE_ONLY";
	RecSet=Conn.Execute(sql);
	sql="DBCC SHRINKDATABASE
	 	  |    ("+SQL_db+", TRUNCATEONLY)";
	RecSet=Conn.Execute(sql);
	Сообщить("Очищается журнал от старых документов...");
	LogFile.ЗаписатьСтроку("Очищается журнал от старых документов...");
	//sql="delete from _1sconst where rtrim(ltrim(objid)) <> '0' AND date < '"+ДТу+"' AND rtrim(docid) <> ''";
	////Тхт.ДобавитьСтроку(sql);
	//RecSet=Conn.Execute(sql);
	sql="delete from _1scrdoc where child_date_time_iddoc < '"+ДТу+"'";
	//Тхт.ДобавитьСтроку(sql);
	RecSet=Conn.Execute(sql);

	sql="delete _1sjourn
	    |where date_time_iddoc < '"+ДТу+"'
		|";
	//Тхт.ДобавитьСтроку(sql);
	RecSet=Conn.Execute(sql);
	sql="update _1sjourn SET ismark=1, closed=0
	    |where date_time_iddoc < '"+ДТх+"'
		|";
	//Тхт.ДобавитьСтроку(sql);
	RecSet=Conn.Execute(sql);
	Сообщить("Выполняется очистка ЛОГ-файла БД...");
	LogFile.ЗаписатьСтроку("Выполняется очистка ЛОГ-файла БД...");
	// обрезка ЛОГа базы
	sql="BACKUP LOG "+SQL_db+"
	 	  |    WITH TRUNCATE_ONLY";
	RecSet=Conn.Execute(sql);
	sql="DBCC SHRINKDATABASE
	 	  |    ("+SQL_db+", TRUNCATEONLY)";
	RecSet=Conn.Execute(sql);
	// Удаление движений регистров
	Сообщить("Удаляются движения регистров магазинов до "+ДТу);
	LogFile.ЗаписатьСтроку("Удаляются движения регистров магазинов до "+ДТу);
	Если Optim=1 Тогда
		//sql="delete ra6283 Where date_time_iddoc < '"+ДТу+"'
		//	|";
		sql="select * into mag from ra6283 Where date_time_iddoc >= '"+ДТу+"'
			|";
	иначе
		//sql="delete ra6283 Where not exists (select 1 from _1sjourn where ra6283.iddoc = _1sjourn.iddoc)
		sql="select * into mag from ra6283 Where exists (select 1 from _1sjourn where ra6283.iddoc = _1sjourn.iddoc)
			|";
	КонецЕсли;
	RecSet=Conn.Execute(sql);
	sql="truncate table ra6283
		|";
	RecSet=Conn.Execute(sql);
	// восстановим данные в регистре магазинов
	sql="insert into ra6283 select * from mag
		|
		|
		|";
	RecSet=Conn.Execute(sql);
	sql="IF OBJECT_ID('"+SQL_db+"..mag') IS NOT NULL
	    |drop table mag
		|";
	RecSet=Conn.Execute(sql);
	Сообщить("Выполняется очистка ЛОГ-файла БД...");
	LogFile.ЗаписатьСтроку("Выполняется очистка ЛОГ-файла БД...");
	// обрезка ЛОГа базы
	sql="BACKUP LOG "+SQL_db+"
	 	  |    WITH TRUNCATE_ONLY
		|";
	RecSet=Conn.Execute(sql);
	sql="DBCC SHRINKDATABASE
	 	  |    ("+SQL_db+", TRUNCATEONLY)
		|";
	RecSet=Conn.Execute(sql);
	Сообщить("Удаляются движения регистров остатков до "+ДТу);
	LogFile.ЗаписатьСтроку("Удаляются движения регистров остатков до "+ДТу);
	//sql="delete ra99 Where not exists (select 1 from _1sjourn where ra99.iddoc = _1sjourn.iddoc)
	sql="select * into mag from ra99  Where date_time_iddoc >= '"+ДТу+"'
			//Where exists (select 1 from _1sjourn where ra99.iddoc = _1sjourn.iddoc)
		|
		|
		|";
	RecSet=Conn.Execute(sql);
	sql="truncate table ra99
		|";
	RecSet=Conn.Execute(sql);
	// восстановим данные в регистре остатков
	sql="insert into ra99 select * from mag
		|
		|
		|";
	RecSet=Conn.Execute(sql);
	sql="IF OBJECT_ID('"+SQL_db+"..mag') IS NOT NULL
	    |drop table mag
		|";
	RecSet=Conn.Execute(sql);
	Сообщить("Выполняется очистка ЛОГ-файла БД...");
	LogFile.ЗаписатьСтроку("Выполняется очистка ЛОГ-файла БД...");
	// обрезка ЛОГа базы
	sql="BACKUP LOG "+SQL_db+"
	 	  |    WITH TRUNCATE_ONLY
		|";
	RecSet=Conn.Execute(sql);
	sql="DBCC SHRINKDATABASE
	 	  |    ("+SQL_db+", TRUNCATEONLY)
		|";
	RecSet=Conn.Execute(sql);
	Сообщить("Удаляются движения регистров партий до "+ДТу);
	LogFile.ЗаписатьСтроку("Удаляются движения регистров партий до "+ДТу);
	//sql="delete ra1130 Where not exists (select 1 from _1sjourn where ra1130.iddoc = _1sjourn.iddoc)
	sql="select * into mag from ra1130  Where date_time_iddoc >= '"+ДТу+"'
			//Where exists (select 1 from _1sjourn where ra1130.iddoc = _1sjourn.iddoc)
		|
		|
		|";
	RecSet=Conn.Execute(sql);
	sql="truncate table ra1130
		|";
	RecSet=Conn.Execute(sql);
	// восстановим данные в регистре остатков
	sql="insert into ra1130 select * from mag
		|
		|
		|";
	RecSet=Conn.Execute(sql);
	sql="IF OBJECT_ID('"+SQL_db+"..mag') IS NOT NULL
	    |drop table mag
		|";
	RecSet=Conn.Execute(sql); 


  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #17 - 07. Мая 2008 :: 10:32
Печать  
zenik писал(а) 07. Мая 2008 :: 10:24:
Nick писал(а) 07. Мая 2008 :: 10:16:
Я ж тебе выложил пример, там всё это есть

О! Точно... А я его только запустил, прождал его часов 10... Недождался, решил свое написать.

А из твоего примера сейчас дернул во такую строку:
Код
Выбрать все
DELETE FROM RA422 WHERE IDDOC IN (SELECT IDDOC FROM _1SJOURN WHERE DATE_TIME_IDDOC <= '20071231Z' 


Судя по коду, то что надо Подмигивание Еще раз сенкс.


Если напишешь что - нибудь что будет работать быстрее будешь крут! Улыбка
  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #18 - 07. Мая 2008 :: 11:14
Печать  
Nick писал(а) 07. Мая 2008 :: 10:32:
Если напишешь что - нибудь что будет работать быстрее будешь крут! Улыбка

Буду надеяться что будет быстрее... Я просто не буду заморачиваться на создании универсальной обработки, буду затачиваться под конкретный случай. Главное что бы ТиИ не подвело по скорости...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #19 - 07. Мая 2008 :: 14:07
Печать  
Засада блин... Оказывается есть документы, которые периодические реквизиты пишут. Народ, как думаете, если просто заменить DOCID в _1SCONST на ID документа, которым я остатки сформирую, взлетит?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #20 - 07. Мая 2008 :: 14:49
Печать  
И один и тот же документ 10 раз запишет историю для одного элемента (вместо 10 удаленных) с разными датами  Подмигивание ?
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #21 - 07. Мая 2008 :: 15:04
Печать  
Цитата:
И один и тот же документ 10 раз запишет историю для одного элемента (вместо 10 удаленных) с разными датами  Подмигивание ?


Насколько я понимаю значение нужно только на дату обрезки
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #22 - 07. Мая 2008 :: 15:05
Печать  
zenik писал(а) 07. Мая 2008 :: 14:07:
Засада блин... Оказывается есть документы, которые периодические реквизиты пишут. Народ, как думаете, если просто заменить DOCID в _1SCONST на ID документа, которым я остатки сформирую, взлетит?


В моей свертке это тоже решено
  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #23 - 08. Мая 2008 :: 06:17
Печать  
Так есть некоторые наработки, надо посмотреть одобрить/отругать, вообщем оценить то что есть, может так и не правильно. Перебрал подряд все таблицы _1S*, пришел к следующему выводу:
Код
Выбрать все
_1SACCSEL 	- Отборы по проводкам.								(да)
_1SBKTTL 	- Остатки по кварталам.								(да)
_1SBKTTLC 	- Итоги оборотов.									(да)
_1SENTRY	- Все проводки операций.							(да)
_1SOPER		- Операции, которые формируют проводки.				(да)
_1SSBSEL	- Отбор проводок по субконто						(да)
_1SJOURN	- Журнал документов									(да) 


Остальные таблицы править без надобности (кроме 1sconst, но до нее я еще не добрался). Скрипт правки 1sjourn я уже приводил, он остался без изменений. Смысл его прост: устанавливаем признак непроведености, пометку на удаление, и все RF* (принадлежность к регистрам) выставляем в 0.

Далее, чистим регистры. К каждому регистру применен вот такой не хитрый скрипт:
Код
Выбрать все
TRUNCATE TABLE RG18501
DELETE FROM RA18501 WHERE IDDOC IN (SELECT IDDOC FROM _1SJOURN WHERE DATE_TIME_IDDOC <= '20071231Z')
 


Удаляем таблицу итогов (RG*) и записи до нашей даты Х (RA*)

И БИ. Сносим вот таким скриптом:
Код
Выбрать все
DELETE FROM _1SOPER
WHERE DATE_TIME_DOCID <= '20071231Z'

DELETE FROM _1SENTRY
WHERE DATE_TIME_DOCID <= '20071231Z'

DELETE FROM _1SACCSEL
WHERE DATE_TIME_DOCID <= '20071231Z'

DELETE FROM _1SSBSEL
WHERE DATE_TIME_DOCID <= '20071231Z'

DELETE FROM _1SBKTTLC
WHERE DATE <= '20071231'

DELETE FROM _1SBKTTL
WHERE DATE <= '20071231' 


Только вот по поводу _1SBKTTLC и _1SBKTTL терзают меня смутные сомнения. Если это таблицы итогов, может к ним применить TRUNCATE TABLE? Все равно потом пересчет итогов делать.

Вот что получилось. Вроде неплохо. Но вопрос по константам остается открытым. Nick, свертка констант в твоей обработке присутствует, но поскольку делает ее сама 1С - делает долго. Процесс переноса констант у меня занял около 2-х часов. Это для меня нереально долго. У меня самый долгий скрипт:
Код
Выбрать все
TRUNCATE TABLE RG4623
DELETE FROM RA4623 WHERE IDDOC IN (SELECT IDDOC FROM _1SJOURN WHERE DATE_TIME_IDDOC <= '20071231Z') 

выполнялся 40 минут, но он и удалил 10,5 млн. записей. А констант всего навсего:
Код
Выбрать все
SELECT Count(*) FROM _1SCONST AS k
INNER JOIN _1sJourn AS j ON j.IDDOC=k.DOCID
WHERE lTrim(rTrim(DOCID))<>'0' 

- 11966

Так что пока думаю над периодическими...
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #24 - 08. Мая 2008 :: 06:28
Печать  
Если ты посмотриш код то увидишь что удаляются константы запросом:

Код
Выбрать все
	Состояние("Удаляется история периодических реквизитов...");
	  
	Если ДБФ = 0 Тогда
		RS.УстановитьТекстовыйПараметр("Дата", Формат(ДатаУдаления,"Д ГГГГММДД"));
		RS.ВыполнитьИнструкцию("delete from "+ИмяКонстант +" where (date < cast(:Дата as datetime)) and (OBJID <> '     0   ')");
	Иначе  
		сДата = Формат(ДатаУдаления,"Д ГГГГММДД");
   		сДата = Лев(сДата,4)+"-"+Сред(сДата,5,2)+"-" + Прав(сДата,2)+"T";
		//ТЗ =	RS.ВыполнитьИнструкцию("Select *, CTOT(""" + сДата + """) from "+ИмяКонстант +" where (DATE <= CTOT(""" + сДата + """)) and (OBJID <> ""     0   "") order by DATE" ,ТЗ);
		RS.ВыполнитьИнструкцию("delete from "+ИмяКонстант +" where (date <= CTOT(""" + сДата + """))  and (OBJID <> ""     0   "")");
	КонецЕсли;
 



А вот заполнение документа, да можно сделать быстрее, но с другой стороны что тебе мешает спокойно заполнить документ до обрезки базы, а после обрезки провести его?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #25 - 08. Мая 2008 :: 06:32
Печать  
А удалять итоги по регистрам и бух итоги по моему бессмыслено
  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #26 - 08. Мая 2008 :: 07:09
Печать  
Nick писал(а) 08. Мая 2008 :: 06:28:
А вот заполнение документа, да можно сделать быстрее, но с другой стороны что тебе мешает спокойно заполнить документ до обрезки базы, а после обрезки провести его?

Документ не хранит никаких данных... В ОбработкеПроведения() он будет выбирать итоги, и записывать их в регистры (с бух итогами тоже самое).
Цитата:
А удалять итоги по регистрам и бух итоги по моему бессмыслено

А все равно быстро Подмигивание
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #27 - 08. Мая 2008 :: 07:15
Печать  
Цитата:
Документ не хранит никаких данных... В ОбработкеПроведения() он будет выбирать итоги, и записывать их в регистры (с бух итогами тоже самое).


А если отменить проведение такого документа после обрезки базы?
  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #28 - 08. Мая 2008 :: 08:16
Печать  
Nick писал(а) 08. Мая 2008 :: 07:15:
А если отменить проведение такого документа после обрезки базы?

А нельзя... Да и зачем?

з.ы. Просто как то пробовал хранить данные, которые надо перенести. Приходиться создавать слишком много документов, что бы табличная часть была вменяемой. А тут недавно увидел такой способ - понравилось. Один документ сразу делает все записи, в себе ничего не хранит, что вполне логично. Распроводить его незачем, так как если согласны на свертку, то итоги уже готовые.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #29 - 08. Мая 2008 :: 08:28
Печать  
Цитата:
А нельзя... Да и зачем?

з.ы. Просто как то пробовал хранить данные, которые надо перенести. Приходиться создавать слишком много документов, что бы табличная часть была вменяемой. А тут недавно увидел такой способ - понравилось. Один документ сразу делает все записи, в себе ничего не хранит, что вполне логично. Распроводить его незачем, так как если согласны на свертку, то итоги уже готовые.


Ну ну нельзя... А если всё таки возникнет такая необходимость что будешь делать?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать