Имя: Пароль:
1C
1C 7.7
v7: Прямые запросы к БД: DELETE частями
0 OnePrg
 
04.10.21
15:36
Вот этот код

    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    RS.ВыполнитьИнструкцию(ТекстЗапроса);                                                    

при больших объёмах кладёт 1С-ку

Как сделать выполнение его частями?

Думал вот так:

    ТекстЗапроса = "
    |DELETE TOP 1000
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);              
        Пока тб.КоличествоСтрок()<> 0 Цикл
           тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);              
        КонецЦикла;                              

но не уверен. ВыполнитьИнструкцию при DELETE возвращает таблицу?
1 mikecool
 
04.10.21
15:37
where и описываешь условия пачки
2 ДенисЧ
 
04.10.21
15:37
выбрать первые 1000, поместить в вт, потом соединять с этой вт.
3 pechkin
 
04.10.21
16:21
ну сделай топ 1 и проверь
4 Sserj
 
04.10.21
17:41
При запросе на изменение delete/update/insert ВыполнитьИнструкцию возвращает не таблицу а число - количество обработанных записей.
Т.е. цикл должен быть типа такого:

Пока RS.ВыполнитьИнструкцию(ТекстЗапроса) > 0 Цикл
КонецЦикла
5 trad
 
04.10.21
17:43
(0)
set nocount on
delete...
6 Sserj
 
04.10.21
17:50
Вообще странно что delete куда-то что-то кладет.
Подозреваю что тут дело не в самом delete а в том как укладывается #тбУдалять.
Если там сотни тысяч строк то как она укладывается. Или она создается запросом.
И еще какие индексы есть у _1SUPDTS, может поможет создание временного индекса по двум полям DBSIGN и OBJID если такого нет.
7 trad
 
04.10.21
17:54
8 trad
 
04.10.21
17:58
9 Sserj
 
04.10.21
17:59
Быстро глянул что такое эта _1SUPDTS.
И с ней явно неправльно работают.
OBJID это id объекта а он не уникальный!
Для документов он сквозной у всех видов документов а у справочников он уникальный только в пределах самого справочника.
Тобишь один ID может быть у какого то документа и у всех видов справочников одновременно.
Поэтому у таблицы иднекс должен быть по трем полям DBSIGN,TYPEID и OBJID и для оптимального соединения в условии join должны быть все эти 3 поля.
А вашим запросом вы можете грохнуть кучу объектов которые грохать не собирались.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн