Имя: Пароль:
1C
1С v8
Очистка РН за период средствами SQL
,
0 trey1
 
04.04.19
14:19
Всем привет! Ребят очень нужна ваша помощь. Как очистить таблицу РН до определенной даты? Мне нужно чтобы всё удалилось до определенной даты.

если общий запрос то я думаю так

Connection.Execute("TRUNCATE TABLE "+имя РН как оно в скуле);
1 1Сергей
 
04.04.19
14:20
Удаляет все строки в таблице или указанные секции таблицы, не записывая в журнал удаление отдельных строк. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE, однако TRUNCATE TABLE выполняется быстрее и требует меньших ресурсов системы и журналов транзакций.

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-2017
2 Cyberhawk
 
04.04.19
14:22
Через 1С замерял за сколько удаляется? Или ты не 1Сник?
3 bolobol
 
04.04.19
14:24
Обновление итогов не забудьте!
4 trey1
 
04.04.19
14:25
(2) 1Сник, записей больше 100 миллионов, после полдня просиживания решил что это прям не самый лучший вариант
5 Ёпрст
 
04.04.19
14:25
(0) неправильно думаешь
6 trey1
 
04.04.19
14:27
(5) Как правильно? Поэтому и спрашиваю
7 trey1
 
04.04.19
14:28
(3) После того как снесу в ыйд? чтобы данные в ВТ появились видимо?
8 Ёпрст
 
04.04.19
14:28
(6) как минимум, delete + where
а так, на нимфостарте полно поделок по удалению всего и вся средстами sqlготовых
9 trey1
 
04.04.19
14:31
(8) я видел, если даже разработка стоит 1стартмани эт надо абонемент купить минимум за 4500, эт как бы дофига, учитывая что мне нужно то только одна обработка
10 Ёпрст
 
04.04.19
14:33
(9) ищи их -же, на других ресурсах.
11 Робинзон Крузо
 
04.04.19
14:34
Грохнуть регистр в метаданных. Выгрузить загрузить через .dt. Восстановить необходимый период из копии с помощью КД 2.0
12 Ёпрст
 
04.04.19
14:47
ну вот, первая же ссылка в поиске.. внизу статьи пример
https://habr.com/ru/post/264687/
13 timurhv
 
04.04.19
16:56
(6)
- Создать таблицу с префиксом запросом SQL;
- Скопировать записи из старой таблицы в новую с отбором по периоду;
- Грохнуть старую таблицу;
- Переименовать новую таблицу;
14 timurhv
 
04.04.19
16:57
(12)
----------------
командаРегистров.CommandText = командаРегистров.CommandText + "DELETE FROM " + ОсновнаяТаблицаРегистра + " WHERE _RecorderRRef IN (SELECT _IDRRef FROM " + строкаТаблицы.ИмяТаблицыХранения + " WHERE _Date_Time BETWEEN @StartDate AND @EndDate);";
----------------
Это долгая операция, если нужно удалить данные допустим за 10 лет и сформировать остатки на начало 2019 года.
15 ptiz
 
04.04.19
17:01
Я так чищу, потом только итоги пересчитать:

    // создаем копию таблицы
    Команда = "SELECT * INTO " + ИмяВремТаблицы + " FROM " + ИмяТаблицы + "WHERE " + ИмяПоляПериода + " > " + ДатаСтрокойВSQL(КонецДня(Дата2));
    ВыполнитьКомандуSQL(Команда);
    
    // чистим текущую таблицу
    Команда = "TRUNCATE TABLE " + ИмяТаблицы;
    ВыполнитьКомандуSQL(Команда);
    
    // возвращаем данные из копии таблицы
    Команда = "INSERT INTO " + ИмяТаблицы + " SELECT * FROM " + ИмяВремТаблицы;
    ВыполнитьКомандуSQL(Команда);
    
    // удаляем временную таблицу
    Команда = "DROP TABLE " + ИмяВремТаблицы;
    ВыполнитьКомандуSQL(Команда);
16 timurhv
 
04.04.19
17:08
(15) Можно еще дополнить условие, которое оставит движения документов определенных, например корректировки данных.
17 bolero
 
04.04.19
17:12
(14) > WHERE _RecorderRRef IN (SELECT

поубивав бы


DELETE FROM {} reg
USING (SELECT n.{} bref
          FROM {} n
          WHERE n.{} = TRUE
      ) t
WHERE
  reg.{} = t.bref
18 bolero
 
04.04.19
17:17
(17) подробнее: DELETE WHERE IN (SELECT) - по каждой строчке очищаемой страницы будет производиться сравнение, входит ли значение в колонке в список из 100500 (или 100500800) отобранных другим запросом значений, и время исполнения запроса возрастает в гиперболической зависимости от объема данных

DELETE USING (SELECT) WHERE - аналог JOIN для DELETE - внутрях сначала обычным SELECT JOIN быстро отбирается список строк к удалению, и за один проход удаляется
19 rsv
 
04.04.19
17:26
(18)  вывод все равно один ...delete пишет в лог .. Truncate нет
20 bolero
 
04.04.19
17:40
(19) чего-то я этот вывод пропустил, видимо топик невнимательно читал...

TRUNCATE коротенько пишет в WAL одну операцию "поделить на ноль вон ту таблицу", на реплику эта операция передается быстро, и исполняется там также быстро
а DELETE - да, подробно перечисляет, что именно удалять, и кусок журнала может получиться увесистым

частичного TRUNCATE не существует

ТС изначально запрашивал "почистить регистр до определенной даты", это можно сделать

DELETE FROM WHERE _Period < '2019-01-01'

я пока не видел, чтобы в РН и регистраторе даты различались, поэтому брать дату из регистратора смысла не вижу

а если более подробный отбор по регистраторам - то схема из (17)
21 Immortal
 
04.04.19
19:00
И таблицу итогов не забудьте
22 trey1
 
05.04.19
06:12
О ребят спасибо большое всем за помощь и наводки, сейчас буду разбираться!
Программист всегда исправляет последнюю ошибку.