Имя: Пароль:
1C
1C 7.7
v7: Свертка базы
,
0 kupec
 
24.06.14
14:34
День добрый, имеется база данных SQL размером примерно 30 ГГ, документов огромное количество, создается порядка 3000 в день, документы все проводимые, встала задача свернуть базу до 2013 года (на данный момент данные с 2008) есть ли какой нибудь способ удаления средствами SQL, а именно создать какой нибудь скрипт и удалить все записи с параметром меньше заданного, например датадокумента < 01.01.2013, само собой предварительно создать операцию по переносу остатков. Буду признателен любой информации
1 Ыщъ
 
24.06.14
14:43
1cpp.dll
2 ikea
 
24.06.14
14:44
Стандартный вариант, Получаешь остатки по всем ригистрам (остатки, долги и пр.) на 31.12.2012, записываешь их в документ типа "двигатель регистров". А дальше распроводишь документы и потом их удаляешь.
3 МихаилМ
 
24.06.14
14:56
зачем тему дублируете ?
Свертка базы 7.7  SQL 2000
4 МихаилМ
 
24.06.14
14:59
+(3)
прошло 3 месяца...

ждем тему еще через 3
5 kupec
 
24.06.14
15:10
(3) забыл ))) тогда руки не дошли, сейчас опять актуально
6 DalexLad
 
24.06.14
15:21
Не мое, но пользую лет 5


SE Pr
Go
CREATE TABLE ##ID
(IDDOC char(9) primary key clustered)
Go
INSERT INTO ##ID
SELECT DISTINCT IDDOC
FROM _1SJOURN
WHERE (DATE_TIME_IDDOC < '20100701')
Go
BEGIN TRANSACTION
DECLARE Mycur cursor for
SELECT sysobjects.name,syscolumns.name
FROM syscolumns INNER JOIN
sysobjects ON syscolumns.id = sysobjects.id
WHERE (syscolumns.name = N'iddoc') OR
(syscolumns.name = N'docid')
OPEN MyCur
DECLARE @TableName varchar(20)
DECLARE @ColName varchar(20)
FETCH NEXT FROM MyCur INTO @TableName, @ColName
WHILE @@FETCH_STATUS=0
BEGIN
EXEC ('Delete from '+@TableName+' with (tablock) where '+@ColName+' IN (Select IDDOC FROM ##ID)')
FETCH NEXT FROM MyCur INTO @TableName, @ColName
END
CLOSE MyCur
DEALLOCATE MyCur
COMMIT TRANSACTION
DROP TABLE ##ID

Дату соответственно меняем на необходимую
Потом ТиИ и т.д. и т.п.
И умоляю сначала пробуем НА КОПИИИИИ
7 kupec
 
24.06.14
15:27
(6) где нужно данный скрипт выполнить ?
8 DalexLad
 
24.06.14
15:32
Pr Соответственно база данних SQL, у тебя будет другая. Т.к. я SQL не силен, запускаю механически, Я думаю гугл в помощь с вопросом - "как запустить скрипт в SQL"
9 DalexLad
 
24.06.14
15:36
Скрипт у меня работает минут 10-15 на базе 10-15 гиг.
10 DalexLad
 
24.06.14
15:38
Естественно перед удалением желательно сжать базу средствами SQL, После опять сжать средствами SQL.
11 DalexLad
 
24.06.14
15:54
Да В ТиИ ставим "Очищать ссылки", "Удалять данные объектов"
12 kupec
 
24.06.14
15:54
Спасибо, нашел более простой скрипт
Для того, чтобы быстро пометить все документы в базе данных используем следующий скрипт:


UPDATE _1sjourn SET ismark = 1, closed=4
WHERE
(Date_Time_IDDOC < 'ДатаУдаленияДокументов')

может пригодится
Если есть спецы кто в данной штуке разбирается, расшифруйте данную штуку, я в этом не силен но из написанного полагаю что обработается полный журнал документов (или все документы) и установится флаг пометки удаления на все документы, удовлетворяющим условию, но мне интересно, пропадут ли движения данных документов, а именно операции ?
13 Злой Бобр
 
24.06.14
18:23
(12) Ну так и спроси там где "нашел".
Правильно полагаешь. Нет, не пропадут.
14 Злой Бобр
 
24.06.14
18:25
И кстати - чем вызвано такое непреодолимое желание обрезать?..
3 тыс для скульной базы это как семечки. У меня больше 20 и проблем нет.
15 Холст
 
24.06.14
19:02
до большого П оставалось несколько шагов...
16 ДенисЧ
 
24.06.14
19:09
(12) 3 конверта приготовил? А вазелином закупился?
17 kupec
 
24.06.14
19:54
(14) начальству надо
18 kupec
 
24.06.14
19:54
Свертка базы 1С включает в себя не только корректное формирование остатков. Это еще и удаление старых документов, которые не будут актуальными после формирования начального сальдо. Использование штатных методов платформы 1С: Предприятие 7.7 не подходят для свертки базы 1С больших размеров. Процесс удаления может затянуться на продолжительный промежуток времени. Отсюда возникает вопрос: КАК МАКСИМАЛЬНО БЫСТРО ВЫПОЛНИТЬ СВЕРТКУ БАЗЫ 1С?

Если Ваша база работает на SQL сервере, тогда решение этой задачи можно выполнить, используя его возможности. Что для этого нужно предпринять?

Немного теории
В каталоге информационной базы находится файл 1Cv77.DDS, в котором хранятся данные о структуре конфигурации. Из этого файла становится понятно, что шапки документов и их табличные части хранятся в таблицах, которые начинаются на DT и DH. Следовательно, нам нужно получить список таблиц базы данных, в которых хранятся данные по документам.

Установим пометку удаления на документах:
Для того, чтобы быстро пометить все документы в базе данных используем следующий скрипт:


UPDATE _1sjourn SET ismark = 1, closed=4
WHERE
(Date_Time_IDDOC < 'ДатаУдаленияДокументов')

Получим список таблиц табличных частей и шапок документов.
Открываем Enterprise Manager SQL Server 2000. Открываем список таблиц информационной базы. Выделяем все, которые начинаются на DH и DT и делаем экспорт списка.

Удалим из базы все помеченные на удаление документы.
К настоящему этапу у нас все документы помечены на удаление, список таблиц базы данных имеются. Следовательно, не что не мешает нам удалить не нужные нам документы. Делается все это очень просто. При помощи такого кода:

Delete From d From DH111(ИЛИDT111) d inner join _1SJourn j on d.iddoc = j.iddoc and j.ismark = 1 where j.Date_Time_IDDoc < 'ДатаУдаленияДокументов'

Заключительные шаги.
Очистив таблицы и шапки документов, нам остается удалить записи, которые хранятся в таблицах подчиненных документов и журнале документов.

DELETE FROM _1scrdoc WHERE Child_Date_Time_IDDoc <= 'ДатаУдаленияДокументов'
DELETE FROM _1SJourn Where ( (Date_Time_IDDOC < 'ДатаУдаленияДокументов') And (ISmark = 1))

В результате выполнения этих шагов мы сможем очистить базу данных от не нужных документов в считанные минуты. Тем самым свертка базы данных 1С осуществляется во многие разы быстрее штатных механизмов. Как следствие у Вас освобождается много времени на проработку более серьезных задач переноса.

Удачи Вам и не забывайте делать backup`ы…
19 kupec
 
24.06.14
19:54
полный текст инструкции
20 kupec
 
24.06.14
20:00
мне не совсем понятно как сделать экспорт списка таблиц
21 mehfk
 
24.06.14
20:22
А с движениями что будешь делать?
22 МихаилМ
 
24.06.14
20:23
(20)
мало кто помнит "Enterprise Manager SQL Server 2000"

ему 14 лет . с 2005 - ssms
23 kupec
 
24.06.14
20:23
ну так там вроде есть про удаление подчиненных документов
24 kupec
 
24.06.14
20:29
а в какой таблице хранятся операции ? Может их также грохнуть как и документы
25 Эмбеддер
 
24.06.14
20:38
(18) размер базы после этого вообще не изменится
26 kupec
 
24.06.14
20:42
главное документы удалить, а потом выгрузку загрузку
27 Эмбеддер
 
24.06.14
20:55
(26) а что изменится? если документы удалены вместе с движениями регистров (а не помечены на удаление), то можно сделать Shrink и SQL база уменьшится. вопрос только в том, как начальные остатки загрузить по регистрам
28 kupec
 
24.06.14
23:45
(27) регистров нет
29 Эмбеддер
 
25.06.14
06:29
стандартная wrap.ert быстро создает ввод остатков, а потом долго удаляет документы (эту часть нужно убрать). а сами документы надо будет удалить из базы SQL запросом, за исключением тех, которые есть во вводе остатков (как субконто). но кроме 1sjourn есть еще таблицы самих документов, поэтому если есть время на выполнение обработки, но нет времени на ее долгое написание, можно удалять с помощью 1С, но главное бух итоги установить на дату раньше первого документа, тогда удаление будет идти быстрее
делается выборка в таблицу значений (или список значений) за каждую дату и в транзакции документы удаляются непосредственно
30 Рэйв
 
25.06.14
06:34
На ИТС есть обработка СверткаИнформационнойБазы  для 8-ки.
Скульные запросы вполне можно оттуда взять и использовать для 7.7.
31 Эмбеддер
 
25.06.14
06:38
(30) вообще ничего общего у 7-ки и в 8-ки в свертке и структуре документов...
32 Рэйв
 
25.06.14
06:43
(31) Удаление записей в скуле оно и в африке удаление в скуле.
33 Эмбеддер
 
25.06.14
06:50
(32) в 8-ке нельзя запросами менять данные. и в обработке от 1С не может быть конструкций "УДАЛИТЬ ИЗ". 1С же запрещает в 8-ке лезть в базу непосредственно SQL запросами или для этой обработки сделано исключение?
34 Duke1C
 
25.06.14
07:54
(29) + предварительно, перед удалением, отключить в Пофигураторе регистрацию событий в журнале регистрации, и не забыть включить её потом
35 kupec
 
25.06.14
08:44
Вообщем вот что я сделал
операцию по переносу остатков
//журнал
UPDATE _1sjourn SET ismark = 1, closed=4
WHERE
(Date_Time_IDDOC < 'ДатаУдаленияДокументов')
//операции
UPDATE _1SOPER SET active= 0
WHERE
(Date_Time_DOCID < 'ДатаУдаленияДокументов')
//проводки
UPDATE _1SENTRY SET active= 0
WHERE
(Date_Time_DOCID < 'ДатаУдаленияДокументов')

на обработку журнала ушло 1-2 сек, на операции 1-2 сек, на проводки 4-5 минут, в общей сложности документов было порядка 65 000, операций 67 000, проводок 1 500 000, объем базы 5 ГГб, после всего этого пересчет бухгалтерских итогов, в итоге получил что до даты удаления никаких движений нет а конечное сальдо совпадает с конечным сальдо до обработки, какие будут комментарии ???? Можно пробовать на живой базе ???? единственное отличие что база не 5 а 25 гигов....
36 Эмбеддер
 
25.06.14
08:47
(35) база уменьшилась на 5 гигов только за счет уменьшения регистров с итогами по бух проводкам. проводка не активна - итоги не заполняются за этот период
37 Мимохожий Однако
 
25.06.14
08:50
(35)Результат своей работы покажи главбуху и другим ответственным лицам. Если дадут добро, то делай архив и вперед
38 ptiz
 
25.06.14
08:50
По-моему, еще так можно:
включить распределенку, отпочковать базу для свертки, её стандартно свернуть. По окончании сделать перенос из рабочей того, что наработали за время свертки, всех перевести на свернутую базу.
39 kupec
 
25.06.14
08:53
(35) то что я сделал сопоставимо с кодом
Пока Док.ПолучитьДокумент()=1 Цикл
Док.Удалить(0);
КонецЦикла;
40 kupec
 
25.06.14
08:53
+(39) ???
41 Эмбеддер
 
25.06.14
09:17
да, только проводки похоже выключил, а не удалил, а в случае (39) проводки удалятся
42 kupec
 
25.06.14
09:19
а если после данного (35) способа пройтись (39) скорость должна в разы вырасти? движений же нет, никакого пересчета быть не должно, или я что то не правильно понимаю ?
43 Эмбеддер
 
25.06.14
09:26
(42) если точку пересчета бух итогов перенести на старую дату, то сама по себе станет меньше. приведенные SQL запросы скорость выполнения Удалить(0) не изменят
удалять надо по-настоящему, если мы хотим уменьшить базу, а не помечать на удаление. и при удалении надо использовать транзакции, иначе все будет очень медленно
44 Ёпрст
 
25.06.14
09:36
(35) лучше в 2-х последних запросах написать delete.. эти записи ужо не нужны.
45 Ёпрст
 
25.06.14
09:37
а в скуле, всё это, никакого прироста в скорости не даст.. вообще, впрочем, как и в дбф базе.
Смысл в свёртке вообще не ясен, зачем она тебе вообще упала.
46 Эмбеддер
 
25.06.14
09:46
(45) насчет скуля вопрос спорный, но DBF постоянно сворачивать приходится. там же ограничение 2 или 4 Гига на таблицу
47 Ёпрст
 
25.06.14
10:13
(46) 2.
ну, вот разве что из-за размера. Всё остальное - баловство.
48 Ёпрст
 
25.06.14
10:13
в скуле - подавно
49 Эмбеддер
 
25.06.14
10:20
(47) еще время на реиндексацию DBF, на большой базе (в пределах разумного) в некоторых конторах доходит и до 20-40 минут
50 kupec
 
25.06.14
11:01
(44) а можно скрипт ??
Delete From _1SOPER where DATE_TIME_DOCID <'ДатаУдаленияДокументов'
Вот так или нет ?
51 Ёпрст
 
25.06.14
11:05
да
52 Ёпрст
 
25.06.14
11:06
только еще, нужно в 1crdoc ссылки почистить на подчиненные доки
53 Ёпрст
 
25.06.14
11:06
а блин, ты же доки не удаляешь, тогда не нужно :)
54 Ёпрст
 
25.06.14
11:07
максимум - периодику, установленную доками прибить в 1sconst
55 kupec
 
25.06.14
11:07
страшно...но интересно....
56 Ёпрст
 
25.06.14
11:08
Хотя для свёртки бухни, я исключаю документы вида ввод в эксплатацию, модернизация и прочая шняга, связанная с ОС (так проще)
57 Ёпрст
 
25.06.14
11:09
(55) не сцы, сделай скулевый архив, завсегда можно перегнать чтто угодно с него тем же прямым запросом.
58 Эмбеддер
 
25.06.14
11:39
(50) а во вводе остатков будет "ссылка не найдена" там, где документы были...
59 kupec
 
25.06.14
11:40
(58) ввода остатков нет
60 kupec
 
25.06.14
11:42
Вроде все получилось, НО...в периодических реквизитах остались данные, т.е. приходная цена по товару изменена документом помеченным на удаление, как убрать периодические значения констант всех, т.е. почистить значения до определенной даты, какую таблицу нужно скриптить ?
61 Ёпрст
 
25.06.14
11:42
(59) всмысле нет ?
:)
62 kupec
 
25.06.14
11:43
ну раньше все резалось, когда база была маленькой штытными способами, сейчас ввод остатков на 01.01.2008 операцией
63 kupec
 
25.06.14
11:43
т.е. существует большая операция в корреспонденции со счетом 00, не спрашивайте почему так, все это было до меня
64 kupec
 
25.06.14
11:46
а по (60) будут какие-нибудь подсказки...очень надо )))
65 Ёпрст
 
25.06.14
11:46
(60) _1sconst
с условием на docid in(select iddoc from_1sjourn (nolock) where closed&1 = 0)
66 Ёпрст
 
25.06.14
11:47
(62)
да блин, пофик чем, документом или операцией, главное, шо остатки введены.
67 kupec
 
25.06.14
11:48
delete from _1sconst docid in(select iddoc from_1sjourn (nolock) where closed&1 = 0)
вот так вот да ?
68 kupec
 
25.06.14
11:49
блин
delete from _1sconst where docid in(select iddoc from_1sjourn (nolock) closed&1 = 0)
вот так
69 kupec
 
25.06.14
11:56
ругается
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '('.
70 Эмбеддер
 
25.06.14
11:58
(59) извините за прямоту, но тут только один совет остается - позовите специалиста...
71 kupec
 
25.06.14
11:59
(70) если в Вашей базе такое есть а в моей нет это не значит что так как есть у Вас так и должно быть
72 Ёпрст
 
25.06.14
12:00
(68) where пропущено
73 kupec
 
25.06.14
12:02
(72) оно там есть, если не трудно можно строку скрипта
74 Ёпрст
 
25.06.14
12:03
(73) ну покажи, где оно в (68)
:)
75 Ёпрст
 
25.06.14
12:03
если че,where пропущено в подзапросе к _1sjournl
76 kupec
 
25.06.14
12:07
delete from _1sconst where docid in(select iddoc from_1sjourn (nolock) where closed&1 = 0)
опять наверно не так ((((
77 kupec
 
25.06.14
12:07
та же самая ошибка
78 Эмбеддер
 
25.06.14
12:09
(76) после второго from нет пробела
79 kupec
 
25.06.14
12:12
СПАСИБО РЕБЯТА
80 Эмбеддер
 
25.06.14
12:12
и (nolock) можно убрать в данном случае это не важно
81 kupec
 
25.06.14
12:15
(80) а что этот nolock значит, типа не заблокирован ?
82 Эмбеддер
 
25.06.14
12:24
(81) точно не скажу, врать не буду. когда один пользователь работает (ваш случай) - там могла быть опечатка, ошибка же была рядом со скобкой )))
83 Эмбеддер
 
25.06.14
12:25
т.е. если не знаешь почему запрос выдает ошибку (из-за опечатки), надо убирать лишний текст
84 kupec
 
25.06.14
12:28
спасибо большое все получилось, вопрос теперь про работоспособность, но думаю что все должно быть отлично, ЕПРСТ отдельно выражаю благодарность
Основная теорема систематики: Новые системы плодят новые проблемы.