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


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Свертка базы
06. Мая 2008 :: 06:38
Печать  
Помогите плз. боюсь что нить упустить, вот и прошу помощи. Проблема в следующем: имеется БД, достаточно серьезного объема. Дело конечно не в размере, но штатными средствами 1С ее уже не обрезать (слишком много времени требуется).  Пробовал уже много разных вариантов. Самый приемлемый выбрал следующий:
Создание нового документа в составе конфигурации - перенос остатков (идея подсмотренная) и при его проведении запись в регистры всех итогов (по регистрам и бухгалтерских) на позицию документа. т.е. один документ создает копию итогов по всем регистрам (такое я уже делал, достаточно быстро проходит), ну и создает проводки. Остается только одно - удалить данные до этого документа. Вот тут и начинается свистопляска. Опять же где то вычитал и наваял след. запрос:
Код
Выбрать все
UPDATE	_1SJOURN
SET
	CLOSED=4,
	ISMARK=1
WHERE
	IDDOCDEF NOT IN (15391,15145)
	AND DATE_TIME_IDDOC < '20071231Z 


Получилось достаточно быстро и главное результат, тот который я ожидал - документы помечены на удаление! Но! Как всегда, если бы не какое-нибудь "но". Первое что я обнаружил - количество помеченных на удаление объектов составляет почти 400 000. И штатными средствами 1С вываливается с сообщением о недостатке памяти, хотя ее (памяти) 8гб. (это все на сервере происходит). Но это пол беды, за 15 минут пишется обработка, которая с помощью НайтиПомеченныеНаУдаление() и УдалитьОбъекты() порциями начинает удалять помеченные на удаление с проверкой ссылочной целостности (что важно!).

Ах, да забыл указать, что после того, как я пометил на удаление документы, в конфигураторе сделал пересчет итогов. Попробовал парочку отчетов в удаленном периоде (один штатными средствами, другой прямыми запросами) - отчеты пустые, значит данных нет! Но не тут то было. Открываю Query Analyzer и запросом
Код
Выбрать все
SELECT top 1000 *
FROM RA4623 AS P
INNER JOIN _1SJourn AS J ON J.IDDOC=P.IDDOC
ORDER BY J.DATE_TIME_IDDOC 

получаю данные в удаленном периоде. Что не есть гут. Правда SELECT * FROM RG... Не дает цифр в удаленном периоде... Помимо движений в регистре остались так же и проводки в документах, причем они уже по отчетам видны....

Внимание! Вопрос: как бы покошернее удалить данные в сворачиваемом периоде? Я имею в виду движения по регистрам и проводки у документов. Почти каждый документ имеет как проводки, так и движения по регистрам (обычно не меньше 3-х регистров). Ни один документ не делает записи в периодику, так что на этом можно не заострять внимания.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #1 - 06. Мая 2008 :: 07:04
Печать  
А если по-тупому: удалить все записи движений и итогов, а потом перепровести документы с начала периода?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #2 - 06. Мая 2008 :: 07:16
Печать  
На вот посмотри, писал давно, но базу этим реально обрезали
  

WrapSQL.rar ( 99 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



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

MD.rar ( 12 KB | Загрузки )
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

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


Код
Выбрать все
SELECT COUNT(*)
FROM _1SJOURN
WHERE
	IDDOCDEF NOT IN (15391,15145)
	AND DATE_TIME_IDDOC > '20071231Z'
	AND ISMARK=0 



64922. Сколько времени займет проведение такого числа документов? Думается мне, что не одну даже неделю (как никак 4 месяца работы).

Моя же цель такая: сегодня перестали работать, за ночь я формирую документ остатков, помечаю на удаление документы, и удаляю движения по ним. Делаю пересчет итогов. На следующий день люди приходят на работу, открывают 2 базы (до и после свертки), сверяют. Если данные в свернутой базе не изменены - работают в новой, если нет, то продолжают работать в не свернутой. Но хочеться, что бы все было правильно и потом я планомерно буду удалять уже помеченные документы с контролем ссылок. Поэтому мне бы по минимуму применять штатные средства - так как это долго. Т.е. времени ночь, ну если говорить конкретнее то с 20:00 до 8:00 - 12 часов. (ну с утреце можно хапнуть пару тройку часов). Вообщем времени не так уж и много.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #5 - 06. Мая 2008 :: 07:33
Печать  
Nick писал(а) 06. Мая 2008 :: 07:16:
На вот посмотри, писал давно, но базу этим реально обрезали

Спасибо. Ща гляну.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #6 - 06. Мая 2008 :: 11:01
Печать  
Вот статья Касперка:

http://www.kb.mista.ru/article.php?id=250

Я немного подточил это дело под себя, но суть, думаю, понятна
Скрипт можно сгенерить прямо в 1С
Единственное- ТиИ (это долго на больших базах)
  

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


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #7 - 07. Мая 2008 :: 09:16
Печать  
Новую тему создавать не буду. Вот наваял запрос:
Код
Выбрать все
DELETE FROM RA422 WHERE EXISTS(
SELECT
	*
FROM RA422 AS R
INNER JOIN _1SJOURN AS J ON J.IDDOC=R.IDDOC
WHERE DATE_TIME_IDDOC <= '20071231Z') 



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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #8 - 07. Мая 2008 :: 09:24
Печать  
Ну так ты сначала проверь какие записи твоим подзапросом выбираются, по моему у тебя там мало букв Z попробуй ZZZZZZZ
  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #9 - 07. Мая 2008 :: 09:31
Печать  
Не, записи нормально выбирает. Одной Z хватало.... По крайней мере SELECT и в случае:
Код
Выбрать все
DELETE FROM _1SOPER
WHERE DATE_TIME_DOCID <= '20071231Z' 


А вот тут что то не так.... Причем сам селект внутри отрабатывает нормально.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #10 - 07. Мая 2008 :: 09:35
Печать  
Удаляй сначала документы в журнале
А из регистров и проч - то чего нет в журнале
Чего мудрить?
  

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #11 - 07. Мая 2008 :: 09:43
Печать  
zenik писал(а) 07. Мая 2008 :: 09:16:
Новую тему создавать не буду. Вот наваял запрос:
Код
Выбрать все
DELETE FROM RA422 WHERE EXISTS(
SELECT  
	*
FROM RA422 AS R
INNER JOIN _1SJOURN AS J ON J.IDDOC=R.IDDOC
WHERE DATE_TIME_IDDOC <= '20071231Z') 



Конечно же хотел удалить движения до даты, но удалилось все... Подскажите, как правильно создать запрос.


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


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #12 - 07. Мая 2008 :: 10:09
Печать  
Цитата:
Удаляй сначала документы в журнале
А из регистров и проч - то чего нет в журнале
Чего мудрить?


Так оно еще как бы есть в журнале... Вот наработки:
Пометка на удаление в журнале:
Код
Выбрать все
UPDATE	_1SJOURN
SET
	CLOSED	=4,
	ISMARK	=1,
	RF18501	=0,
	RF422	=0,
	RF170	=0,
	RF1609	=0,
	RF17104	=0,
	RF15770	=0,
	RF1113	=0,
	RF4623	=0,
	RF939	=0,
	RF4918	=0,
	RF15394	=0,
	RF15405	=0,
	RF15659	=0,
	RF912	=0,
	RF17806	=0,
	RF6070	=0,
	RF1148	=0,
	RF15440	=0,
	RF181	=0,
	RF15606	=0,
	RF15247	=0,
	RF15251	=0
WHERE
	IDDOCDEF NOT IN (15391,15145)
	AND DATE_TIME_IDDOC <= '20071231Z'
 



Чистка БИ:
Код
Выбрать все
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' 



Вот таким же макаром хочу снести записи из регистров... Только даты там сразу нет, вот и хочу привязаться к дате из журнала, а как это сделать недотумкаю Печаль
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

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

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #14 - 07. Мая 2008 :: 10:16
Печать  
Я ж тебе выложил пример, там всё это есть
  
Наверх
ICQ  
IP записан
 
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 записан
 
Nick
God Member
*****
Отсутствует



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


I Love YaBB 2!

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

Данный период закрыт - такой необходимости возникнуть не может. В данном отношении у меня политика достаточно жесткая. У бухов - месяц на редактирование прошлого периода (иногда квартал), а все остальные 7 дней. Человек вошедший в базу не под моим логином очень ограничен в действиях на правку документов  Класс
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Свертка базы
Ответ #32 - 13. Мая 2008 :: 01:23
Печать  
Ну как успехи?
  
Наверх
ICQ  
IP записан
 
mov68
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 180
Зарегистрирован: 21. Декабря 2007
Re: Свертка базы
Ответ #33 - 13. Мая 2008 :: 11:40
Печать  
Предлагаю опробованный вариант:
1.Создается документ Остатки (проще не один а отдельно по каждому регистру) - такая обработка была в сети
2.Создается пустая база с такой-же структурой.
3.Переносятся документы остатков (стандартная с ИТС переносит документы с необходимыми справочниками)
4.старая база удаляется.

При таком подходе одновременно чистятся все справочники, если какой то справочник необходим в полном объеме, проблем нет перенести стандартной обработкой

Пункт 3 выполняется долго, но не сравнимо с чисткой базы
Ничто не мешает любой пункт ускорять прямыми запросами
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #34 - 14. Мая 2008 :: 06:35
Печать  
А что делать со свежими документами? А если их миллион?
Что делать со старыми документами которые не закрыты (удалять нельзя)?
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Свертка базы
Ответ #35 - 14. Мая 2008 :: 07:02
Печать  
Цитата:
А что делать со свежими документами? А если их миллион?
Что делать со старыми документами которые не закрыты (удалять нельзя)?


Свертку проводить на год-полгода назад (на начало квартала)
Документы на которые есть ссылки , но которые древнее - непроведенными.
То что написал  mov68 - действительно вполне опробованный вариант.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #36 - 14. Мая 2008 :: 07:50
Печать  
Обычно свертку делают после сдачи баланса (по крайней мере я так делал), а это март-апрель
А за 3-4 м-ца может быть много доков
  

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


I Love YaBB 2!

Сообщений: 180
Зарегистрирован: 21. Декабря 2007
Re: Свертка базы
Ответ #37 - 14. Мая 2008 :: 09:39
Печать  
По опыту, каким бы мне был оборот, перенесение документов за несколько месяцев проходит быстрее чем чистка базы за несколько предыдущих лет (обычно оборот в пред. периода не намного меньше).

Стандартный перенос, при переносе документов с остатками перенесет и документы, на которые остались ссылки в остатках. В новой базе старых документов окажется несравнимо меньше (если база спроектирована правильно и остатки по регистрам нормально закрываются, а то столкнулся что развернутые остатки содержат все от царя гороха - это мрак) и есть смысл помечать на удаление старые документы уже в новой базе
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Свертка базы
Ответ #38 - 14. Мая 2008 :: 10:59
Печать  
mov68 писал(а) 14. Мая 2008 :: 09:39:
По опыту, каким бы мне был оборот, перенесение документов за несколько месяцев проходит быстрее чем чистка базы за несколько предыдущих лет (обычно оборот в пред. периода не намного меньше).

Стандартный перенос, при переносе документов с остатками перенесет и документы, на которые остались ссылки в остатках. В новой базе старых документов окажется несравнимо меньше (если база спроектирована правильно и остатки по регистрам нормально закрываются, а то столкнулся что развернутые остатки содержат все от царя гороха - это мрак) и есть смысл помечать на удаление старые документы уже в новой базе

первый раз (в 2005г) я так и резал базу, но при этом синхронизировать базы пришлось в течение почти 3 месяцев.

зато во второй раз я порезал за 18 часов:
Цитата:
Протокол обрезки Торговой базы пакетным файлом retotal.bat                                    
           6-7Июля 2007г тест                  8-9Июля 2007г      
     Действие      Время окончания      Продолжи-тельность      Примечание      Время окончания      Продолжи-тельность
1      Старт пакетного файла      8:51      0            16:00      0
2      Сохранение рабочей базы в файл backup_sb.bak на сервере ssb01      9:16      0:25      если резать саму рабочую базу, то нужен бэкап      16:24      0:24
3      Загрузка из файла БД на сервер ssb01      9:40      0:24            17:00      0:36
4      Переиндексация      14:00      4:20      можно выполнить на рабочей базе перед обрезкой      17:00      0:00
5      Выполнение обработки ОбрезкаSQL      22:50      8:50            2:14      9:14
6      Пересчет итогов в обрезанной базе      1:03      2:13            4:16      2:02
7      Возврат точки актуальности в состояние до обрезки      1:28      0:25            4:39      0:23
8      Удаление помеченных на удаление объектов      1:43      0:15      эту операцию можно выполнить уже на рабочей базе      4:54      0:15
9      Усушка базы (освобождение пустот и обрезка лишнего пространства)      3:12      1:29      эту операцию можно выполнить уже на рабочей базе      6:11      1:17
10      Выгрузка обрезанной базы в файл backup_sb_.bak на сервер sb-file2      3:28      0:16            6:28      0:17
11      Восстановление рабочей базы из файла backup_sb_.bak      3:46      0:18            7:18      0:50
     Общее время обрезки базы            18:55                  15:18
     Общее время обрезки, если резать саму рабочую базу            18:13                  
     Время обрезки без переиндексации и усушки базы            13:06
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #39 - 14. Мая 2008 :: 13:11
Печать  
Nick писал(а) 13. Мая 2008 :: 01:23:
Ну как успехи?

Пробую... На периодические реквизиты пока забил полностью. А остальные результаты обнадеживают. Проведение документа по переносу итогов - 35 мин. Удаление движений и ТиИ порядка 4-х часов. Сейчас делаю пробную срезку со всеми стадиями как положено (до этого каждый шаг отрабатывался независимо), буду сверять перенесенные и пересчитанные итоги.

з.ы. Для всех остальных, кто тут предлагал переносить документы: я уже писал, что документов за этот только год уже 65000. Даже если предположить невероятное и дать одному документу 1 секунду времени на запись и проведение, то 18 часов на перенос.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Свертка базы
Ответ #40 - 14. Мая 2008 :: 13:23
Печать  
Никто не предлагал проводить документы и тем более в режиме 1С (кроме ввода остатков)...
Прямыми запросами думаю за 1 сек можно записать несколько больше, чем один документ...
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #41 - 15. Мая 2008 :: 08:36
Печать  
kiruha писал(а) 14. Мая 2008 :: 13:23:
Никто не предлагал проводить документы и тем более в режиме 1С (кроме ввода остатков)...
Прямыми запросами думаю за 1 сек можно записать несколько больше, чем один документ...

Всетаки при удалении нюансов меньше, чем при создании и переносе.

Но получилось не плохо. Единственной ошибкой было формирование остатков на 01.01.2008 на начало дня. Так как движения удаляются по принципу <= '20071231Z'. Пришел к выводу, что формировать остатки надо на 31.12.2007, а итоги убирать по 30.12.2007. Что бы не изменялись обороты в 01.01.2008 и можно было нормально провести сверку.

Если кому интересно, документ для формирования остатков регистров сделан на основе: http://infostart.ru/projects/1159/, а для формирования проводок - немного правленная wrap.ert из бухгалтерии. После свертки база усохла с 12 до 4 гигов, правда были удалены еще не все объекты, но результат уже на лицо.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #42 - 16. Мая 2008 :: 13:54
Печать  
Народ, подскажите плз. по переменным.
Что бы не писать везде DATE_TIME_IDDOC <= '20071230Z' и следовательно исправлять, решил загнать значение в переменную. Сделал так:
DECLARE @DT char
SET @DT='20071230Z'

UPDATE      _1SJOURN
SET
     CLOSED      =4,
     ISMARK      =1,
WHERE
     IDDOCDEF NOT IN (15391)
     AND DATE_TIME_IDDOC <= @DT

Результат нулевой... Заменил DATE_TIME_IDDOC <= '20071230Z', сразу все отработал. Как мою дату объявить в переменной?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Свертка базы
Ответ #43 - 16. Мая 2008 :: 14:20
Печать  
А если так?
char (23) (мот и туплю Улыбка)
А чего не устанавливаешь параметр? Или это типо строго в QA?
  

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


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Свертка базы
Ответ #44 - 19. Мая 2008 :: 05:45
Печать  
Цитата:
А если так?
char (23) (мот и туплю Улыбка)

Судя по тому, что достаточно долго работает, видимо все же так. Закончит посмотрю.
Цитата:
А чего не устанавливаешь параметр? Или это типо строго в QA?

Да, чисто в QA, поскольку запросы выполняются достаточно продолжительное время, то что бы не складывалось впечатление, что 1С висит... Вообщем, так надежнее  Класс
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать