Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Корректность скрипта для пометки документов на удаление (число прочтений - 5408 )
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Корректность скрипта для пометки документов на удаление
09. Декабря 2011 :: 18:26
Печать  
Продолжение темы начатой на этой ветке
http://www.1cpp.ru/forum/YaBB.pl?num=1322064453
----------
Уважаемый ЁПРСТ вот тут
http://www.1cpp.ru/forum/YaBB.pl?num=1322064453/30#30
как в небо пальцем попал....
... только немножко перепутал причину со следствием.
----------
Ситуация следующая, хозяева решили прикрыть бизнес.
Половину манагеров уже разогнали,
а мне дали дембельский аккорд - провести в базе "джихад".
То есть всех неверных - вырезать, а всех верных - обрезать.  Смех.
Масштаб геноцида - на картинке.
После наведения некоторого порядка в регистрах
подошел к задаче пометки на удаление докуменов в обрезаемом периоде.
Попробывал стандартым методом:
ДокОбъект.Удалить(0);
- оценочное время выполнения пометки на удаление - примерно 3-4 суток.
Это мне не очень понравилось.  
Поэтому выставляю на обсуждение вариант решения задачи
через прямые запросы. Пример кода далее.
« Последняя редакция: 11. Декабря 2011 :: 04:28 - ЮраОС »  

______________.PNG ( 28 KB | Загрузки )
______________.PNG
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #1 - 09. Декабря 2011 :: 18:26
Печать  
Код
Выбрать все
	MetaDataWork=СоздатьОбъект("MetaDataWork");
	ФормаЗапрос=СоздатьОбъект("ODBCRecordSet");

	ФормаЗапрос.Выполнить("
	|IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
	|ID=OBJECT_ID('tempdb..#ВыборкаДокументов') AND sysstat & 0xf = 3 )
	|DROP TABLE #ВыборкаДокументов
	|");
	Рез=ФормаЗапрос.Выполнить("
	|CREATE TABLE #ВыборкаДокументов (
	|IDDOC char(9),
	|IDDOCDEF int,
	|DATE_TIME_IDDOC char(23),
	|PRIMARY KEY CLUSTERED (IDDOC)
	|)
	|");
	ФормаЗапрос.УстановитьТекстовыйПараметр("КонДата",ВыбДата);
	ФормаЗапрос.Выполнить("
	|INSERT INTO #ВыборкаДокументов
	|SELECT
	|Журнал.IDDOC as IDDOC,
	|Журнал.IDDOCDEF as IDDOCDEF,
	|Журнал.DATE_TIME_IDDOC as DATE_TIME_IDDOC
	|FROM
	|_1SJOURN AS Журнал With (NOLOCK)
	|WHERE (1=1)
	|-- AND (Журнал.DATE_TIME_IDDOC >= :НачДата)
	| AND (Журнал.DATE_TIME_IDDOC <= :КонДата~)
	|-- AND (Журнал.ISMARK = 0)
	|");

	сзЗапросыДокументы_DelДвижения=СоздатьОбъект("СписокЗначений");
	сзЗапросыРегистры_DelИтоги=СоздатьОбъект("СписокЗначений");
	СписокЖурSET="
	|Жур.ISMARK = 1,
	|Жур.CLOSED = 0,
	|Жур.ACTCNT = 0";
	Для ООО=1 По Метаданные.Регистр() Цикл
		МетаРег=Метаданные.Регистр(ООО);
		РегИмя=МетаРег.Идентификатор;
		РегИд=MetaDataWork.ИДРегистра(ООО);

		СписокЖурSET=СписокЖурSET+?(ПустаяСтрока(СписокЖурSET)=1,"",",
		|")+"Жур.RF"+РегИд+" = 0";

		сзЗапросыДокументы_DelДвижения.ДобавитьЗначение(
		"DELETE Рег
		|FROM
		|$Регистр."+РегИмя+" as Рег (NOLOCK)
		|INNER JOIN
		|#ВыборкаДокументов as ДокВыб (NOLOCK) ON (Рег.IDDOC = ДокВыб.IDDOC)
		|","Регистр."+РегИмя);

		сзЗапросыРегистры_DelИтоги.ДобавитьЗначение(
		"TRUNCATE TABLE $РегистрИтоги."+РегИмя,РегИмя);
	КонецЦикла;
	Для ООО=1 По Метаданные.Последовательность() Цикл
		РегИд=MetaDataWork.ИДОбъекта(Метаданные.Последовательность(ООО));

		СписокЖурSET=СписокЖурSET+?(ПустаяСтрока(СписокЖурSET)=1,"",",
		|")+"Жур.DS"+РегИд+" = 0";
	КонецЦикла;

	сзЗапросыДокументы_DelДвижения.ДобавитьЗначение(
	"DELETE Кон
	|FROM
	|_1SCONST as Кон (NOLOCK)
	|INNER JOIN
	|#ВыборкаДокументов as ВыбДок (NOLOCK) ON (Кон.DOCID = ВыбДок.IDDOC)
	|","Справочники.ИсторияРеквизитов");

	ФормаЗапрос.ВыполнитьИнструкцию("
	|UPDATE Жур
	|SET "+СписокЖурSET+"
	|FROM
	|_1SJOURN as Жур (NOLOCK)
	|INNER JOIN
	|#ВыборкаДокументов as ВыбДок ON (ВыбДок.IDDOC=Жур.IDDOC)
	|");

	Для ООО=1 По сзЗапросыДокументы_DelДвижения.РазмерСписка() Цикл
		ДвижИмя="";
		ТекстЗапроса=сзЗапросыДокументы_DelДвижения.ПолучитьЗначение(ООО,ДвижИмя);
		ФормаЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
	КонецЦикла;

	Для ООО=1 По сзЗапросыРегистры_DelИтоги.РазмерСписка() Цикл
		РегИмя="";
		ТекстЗапроса=сзЗапросыРегистры_DelИтоги.ПолучитьЗначение(ООО,РегИмя);
		ФормаЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
	КонецЦикла;
 

  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #2 - 11. Декабря 2011 :: 17:01
Печать  
Первые результаты проверки скрипта - превосходные!
Судя по логам тестирования базы (без исправления)
скрипт не внес в данные новых косяков.
Тестирование также замечательным образом
пересчитало транкнутые итоги по регистрам.
Класс
  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #3 - 11. Декабря 2011 :: 17:01
Печать  
ЮраОС писал(а) 11. Декабря 2011 :: 17:01:
Первые результаты проверки скрипта - превосходные!
Судя по логам тестирования базы (без исправления)
скрипт не внес в данные новых косяков.
Тестирование также замечательным образом
пересчитало транкнутые итоги по регистрам.
Класс


Вопрос для общего развития:
----
Что надо добавить в скрипт
для корректной очистки движений по бухгалтерским проводкам
и записям журнала расчетов ???
« Последняя редакция: 11. Декабря 2011 :: 18:05 - ЮраОС »  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Корректность скрипта для пометки документов на удаление
Ответ #4 - 11. Декабря 2011 :: 18:23
Печать  
Как бэ временная табличка там нафик не упёрлась, писать RF,DS - моветон при наличии метапарсера и ФлагаРегистра иПоследовательность, пихать всё в список значений (еще и с представлением, которое нигде не используется) тоже не надо, порезать проводки и операции + итоги по ним, это еще аж целых 2 таблички + итоги.

ЗЫ: Да, и по-поводу " попал пальцем в небо", читай свою тему с самого начала, в части полного удаления данных по регистру.
К свёртке, это не имеет никакого отношения.
  
Наверх
 
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #5 - 11. Декабря 2011 :: 19:31
Печать  
Eprst писал(а) 11. Декабря 2011 :: 18:23:
Как бэ временная табличка там нафик не упёрлась, писать RF,DS - моветон при наличии метапарсера и ФлагаРегистра иПоследовательность, пихать всё в список значений (еще и с представлением, которое нигде не используется) тоже не надо, порезать проводки и операции + итоги по ним, это еще аж целых 2 таблички + итоги.

ЗЫ: Да, и по-поводу " попал пальцем в небо", читай свою тему с самого начала, в части полного удаления данных по регистру.
К свёртке, это не имеет никакого отношения.

...
не совсем  Улыбка ... нахрен мне эти партии сворачивать, если они, как говориться, в *** не уперлись!
  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #6 - 12. Декабря 2011 :: 01:17
Печать  
точно также, зачем сворачивать кривые остатки в разсогласованном регистре ... лучше сначала привести их в порядок.  Подмигивание
  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #7 - 12. Декабря 2011 :: 01:39
Печать  
ЮраОС писал(а) 11. Декабря 2011 :: 17:01:
Первые результаты проверки скрипта - превосходные!
Судя по логам тестирования базы (без исправления)
скрипт не внес в данные новых косяков.
Тестирование также замечательным образом
пересчитало транкнутые итоги по регистрам.
Класс

------------------
а скрипт весьма "злым" получился ...
... нефиг дело минут за 20-30 пометить на удаление ВСЕ документы практически в любой базе, задно грохнув ВСЕ итоги!!!
Ужас
  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #8 - 12. Декабря 2011 :: 01:45
Печать  
Eprst писал(а) 11. Декабря 2011 :: 18:23:
Как бэ временная табличка там нафик не упёрлась, писать RF,DS - моветон при наличии метапарсера и ФлагаРегистра иПоследовательность, пихать всё в список значений (еще и с представлением, которое нигде не используется) тоже не надо, порезать проводки и операции + итоги по ним, это еще аж целых 2 таблички + итоги.

ЗЫ: Да, и по-поводу " попал пальцем в небо", читай свою тему с самого начала, в части полного удаления данных по регистру.
К свёртке, это не имеет никакого отношения.

Представление в списке - это для красоты...  Улыбка
В  форме реальной обработки выводится строка состояния процесса. В эту строку из преставления в добавляется информация о том, что в настоящий момент обрабатывается запросом.
  
Наверх
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #9 - 12. Декабря 2011 :: 01:48
Печать  
ЮраОС писал(а) 11. Декабря 2011 :: 17:01:
ЮраОС писал(а) 11. Декабря 2011 :: 17:01:
Первые результаты проверки скрипта - превосходные!
Судя по логам тестирования базы (без исправления)
скрипт не внес в данные новых косяков.
Тестирование также замечательным образом
пересчитало транкнутые итоги по регистрам.
Класс


Вопрос для общего развития:
----
Что надо добавить в скрипт
для корректной очистки движений по бухгалтерским проводкам
и записям журнала расчетов ???

Вопрос на злобу дня:
----
Как без шума и пыли удалить из базы
почти 2 миллиона документов????
....
С контролем ссылочной целостности!!!!!
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Корректность скрипта для пометки документов на удаление
Ответ #10 - 12. Декабря 2011 :: 05:49
Печать  
Штатно - УдалитьОбъекты, не штатно - прямым запросом вестимо.
Подобные поделки валяются на инфостарте.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #11 - 13. Декабря 2011 :: 05:05
Печать  
вариант без временной таблицы (она же здоровенная, наиг надо?!!):  сначала чистим _1sjourn, а потом всё остальное
!!!ПРЕДУПРЕЖДАЮ!!!  Это пример, не знаю насколько деструктивный. Просто валялось тут.
Код
Выбрать все
delete from _1SJourn
where ...

declare Names cursor for
SELECT
	RTrim(obj.name) name
FROM
	sysobjects obj
WHERE
	obj.type = 'U'
ORDER BY
	obj.name

declare @NRows int, @name nvarchar(100)
open Names
SET @NRows = @@Cursor_Rows
WHILE @NRows > 0 BEGIN
 	FETCH Names Into @name
	SET @Nrows = @NRows - 1

	If Left(@name, 2) = 'DH' or Left(@name, 2) = 'DT' or Left(@name, 2) = 'RA'
	Begin
		declare @query nvarchar(500)
		set @query = N'delete from ' + @name + ' where IDDoc Not In (SELECT IDDoc FROM _1SJourn (NoLock))'
		exec sp_executesql @query
	End
End

close Names
 



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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Корректность скрипта для пометки документов на удаление
Ответ #12 - 13. Декабря 2011 :: 05:24
Печать  
1sconst туда еще и 1scrdoc
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Корректность скрипта для пометки документов на удаление
Ответ #13 - 13. Декабря 2011 :: 06:57
Печать  
в любом случае - ссылки на документы из справочников она не алле
  
Наверх
 
IP записан
 
ЮраОС
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 68
Местоположение: Новосибирск
Зарегистрирован: 12. Сентября 2011
Пол: Мужской
Re: Корректность скрипта для пометки документов на удаление
Ответ #14 - 13. Декабря 2011 :: 12:56
Печать  
Satans Claws писал(а) 13. Декабря 2011 :: 06:57:
в любом случае - ссылки на документы из справочников она не алле

согласен! использовать не стоит.
непосредственно лучше удалять
с контролем ссылочной целостности.
---
Но моем случае штатная обработка похоже не канает:
Часов 12 заполняла список помеченных объектов и проверяла возможность удаления.  А теперь она стоит дурацкий список ссылок на удаляемые объекты ... после чего надо будет нажать "удалить". Сколько же она будет удалять после этого???
---
В общем жду утра  Печаль
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать