Имя: Пароль:
1C
1С v8
Как удалить ТЧ дока в скуле с фильтром на дату?
,
0 Обработка
 
07.09.22
11:42
Доки в скуле удаляю так;

delete        _Document13589
FROM            _Document13589
where _Date_Time < '40210101'

А как мне удалить ТЧ тоже с фильтром даты?
Пример:
delete        _Document13383_VT13393
FROM            _Document13383_VT13393
1 mikecool
 
07.09.22
11:43
иннер джойн шапка и отбор по дате
2 mikecool
 
07.09.22
11:44
а вообще - надо удалять ТЧ уже не существующих доков
3 Обработка
 
07.09.22
11:44
(1) Понмаю. Но можно пример?
В скуле очень редко что делаю.
4 Bigbro
 
07.09.22
11:45
Delete From d From DT1813 d
INNER JOIN _1SJourn j on d.iddoc = j.iddoc and j.ismark = 1
WHERE j.Date_Time_IDDoc < '20220901'
5 Обработка
 
07.09.22
11:45
(2) Задача для себя нариовалась. ТЧ много строк сам док делает всего 6 проводок.
В старых периодах хочу замочить ТЧ. Тем более базе копии для разработки.
6 Bigbro
 
07.09.22
11:45
упс пардон тут снеговиков лепят.
7 mikecool
 
07.09.22
11:47
(5) сделай лефт джойн "шапки" по ИД
Где ИД "шапки" есть нулл
8 mikecool
 
07.09.22
11:47
+7 удалишь ТЧ по удаленным "шапкам"
9 Обработка
 
07.09.22
11:48
(8) Я же шапки не удаляю.
10 Обработка
 
07.09.22
11:48
Я привел чисто пример по доку.
11 mikecool
 
07.09.22
11:50
тогда п1
12 ptiz
 
07.09.22
12:11
(0) В качестве заготовки:

Процедура УдалитьНепосредственноДокументы(ИмяДокумента, Дата1, Дата2) Экспорт

    Сообщить("удаление " + ИмяДокумента + " " + ТекущаяДата());
    
    ОбъектМетаданных = Метаданные.Документы[ИмяДокумента];
    
    МассивМД = Новый Массив;
    МассивМД.Добавить(ОбъектМетаданных);
    
    ТаблицаБД = ПолучитьСтруктуруХраненияБазыДанных(МассивМД, Истина);
    
    // Основная таблица
    ИмяТаблицыДокумента = ТаблицаБД.Найти("Основная", "Назначение").ИмяТаблицыХранения;
    
    Для каждого СтрокаТЗ Из ТаблицаБД Цикл
    
        Если СтрокаТЗ.Назначение = "ТабличнаяЧасть" Тогда
            // чистим таб.часть
            ИмяТаблицы = СтрокаТЗ.ИмяТаблицыХранения;
            ИмяПоляСсылки = "";
            Для каждого СтрокаПолей Из СтрокаТЗ.Поля  Цикл
                Если Найти(СтрокаПолей.ИмяПоляХранения, "_IDRRef") > 0 Тогда
                    ИмяПоляСсылки = СтрокаПолей.ИмяПоляХранения;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            
            Команда = "DELETE vt FROM " + ИмяТаблицы + " vt
                      |INNER JOIN " + ИмяТаблицыДокумента + " t
                      |     ON vt." + ИмяПоляСсылки + " = t._IDRRef
                      |    WHERE t._Posted = 0
                      |        and t._Date_Time <= " + ДатаСтрокойВSQL(КонецДня(Дата2));
                      
            Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ " + СтрокаТЗ.ИмяТаблицы + " ГДЕ НЕ Ссылка.Проведен И Ссылка.Дата <= &Дата2");
            Запрос.УстановитьПараметр("Дата1", Дата1);
            Запрос.УстановитьПараметр("Дата2", КонецДня(Дата2));
            Результат = Запрос.Выполнить();
            
            Пока НЕ Результат.Пустой() Цикл
            
                ВыполнитьКомандуSQL(Команда, ИмяДокумента);
                
                Результат = Запрос.Выполнить();
                
                ОбработкаПрерыванияПользователя();
            
            КонецЦикла;
            
        
        КонецЕсли;
    
    КонецЦикла;
    
    // сначала удалим записи из журналов

    СписокЖурналов = ПолучитьСписокЖурналовДокумента(ИмяДокумента);
    
    Для каждого ИмяЖурнала Из СписокЖурналов Цикл
        
        МассивМД = Новый Массив;
        МассивМД.Добавить(Метаданные.ЖурналыДокументов[ИмяЖурнала.Значение]);
        
        ТаблицаБД = ПолучитьСтруктуруХраненияБазыДанных(МассивМД, Истина);
        
        ИмяТаблицыЖурнала = ТаблицаБД.Найти("Основная", "Назначение").ИмяТаблицыХранения;
        
    
        Команда1 = "DELETE vt FROM " + ИмяТаблицыЖурнала + " vt
                  |INNER JOIN " + ИмяТаблицыДокумента + " t
                  |     ON vt._DocumentRRef = t._IDRRef
                  |        and t._Posted = 0
                    |        and t._Date_Time <= " + ДатаСтрокойВSQL(КонецДня(Дата2));
        
        ВыполнитьКомандуSQL(Команда1, ИмяДокумента);
        
    
    КонецЦикла;
    
    
    // чистим документы
    
    Команда = "DELETE t FROM " + ИмяТаблицыДокумента + " t
              |    WHERE t._Posted = 0
              |        and t._Date_Time <= " + ДатаСтрокойВSQL(КонецДня(Дата2));
    
    ВыполнитьКомандуSQL(Команда, ИмяДокумента);

КонецПроцедуры
13 TormozIT
 
гуру
07.09.22
14:31
Ты там десятки миллионов документов удаляешь? Можно же без таких сложностей, но в несколько раз дольше удалить надежно и безопасно во встроенном языке.
А тему эту забанят? =)
14 Обработка
 
07.09.22
14:35
(13) Всего лишь ТЧ одного документов при этом оставляя сам док и его движения.
Просто база большая. Для нужд "разработки!" хочу жирные таблицы убрать.
Эта ТЧ занимает 70-80 ГБ всего записей в ТЧ 180 млн а самих документов где то 260 тыс.
И проводок в нем тоде не много кадлый док длает 4-5 проводок и 2 записи РН и все.
15 TormozIT
 
гуру
07.09.22
14:40
(14)
Объект = Документ.ПолучитьОбъект();
Объект.ТЧ.Очистить();
Объект.ОбмедДанными.Загрузка = Истина;
// Ну еще авторегистраю можно отключить
Объект.Записать();
16 Конструктор1С
 
07.09.22
18:00
Не зная броду, не суйся в воду (с) народное

Если такие вопросы задаешь, то рановато тебе скулём баловаться
17 Обработка
 
08.09.22
06:33
(16) Ну зачем такие спешные выводы?
22 года в 1С. Еще в 1с77 в скуле много что делали.
Свертка базы на 1с77 скульными методами делал.
Не свое конечно а именно юзал то что в гуле умные ребята предлагали.

Просто в скуле я не пишу никакие запросы всегда только в 1С.
Но тем не менее отлично понимаю внутреннюю кухню!

Все нормально получилось у меня (уменьшил базу на 160 ГБ удалив регистрации узлов и удалив ТЧ дока одно):

DELETE vt FROM _Document13383_VT13393 vt
INNER JOIN _Document13383 t
ON vt._Document13383_IDRRef = t._IDRRef
WHERE  t._Date_Time <= '40220501'

DBCC SHRINKDATABASE ('GO_LOG_OLD', 10);
18 Обработка
 
08.09.22
06:39
В догонку...
Кстати в 2005м мой нач ИТ заставил запросы в скуль писать для каких то отчетов.
Я отказался, сказал что только в рамках 1С.
Для этой отчетности взяли другого спеца. И Через некоторое время успешно похоронили проект по отчетом в 1С через скуль.
Никогда не любил и не интересовался все что снаружи 1С.