Имя: Пароль:
1C
1С v8
Средствами SQL удалены документы, а табличные части остались
, ,
0 ГеннадийУО
 
25.05.15
09:53
Умельцы-внедренцы при чистке базы данных (нетиповая специализированная конфа) умудрились удалить документы, а их табличные части оставить.
В результате у меня 2 вопроса - чем это плохо, и можно ли как-нибудь удалить такие вещи средствами 1С?
1 ДенисЧ
 
25.05.15
09:54
Это плохо тем, что они остались в базе.
Средства 1с штатны - ТиИ
2 Широкий
 
25.05.15
09:55
Тестирование и исправление может помочь.
Но проще все же скуль запросами прибить
3 ГеннадийУО
 
25.05.15
09:56
ТИИ нельзя, документов несколько миллионов, за время допустимого простоя не успевает...
4 ГеннадийУО
 
25.05.15
09:57
(2) Ну я надеюсь умельцы исправят свой косяк, но на всякий случай интересуюсь...
5 ДенисЧ
 
25.05.15
09:57
(3) Тогда тебе самому придётся стать умельцем и написать запрос на удаление
6 hhhh
 
25.05.15
09:58
(4) ну просто пусть удалят табличеые части. Какие проблемы?
7 xXeNoNx
 
25.05.15
09:58
загрузка - выгрузка
8 xXeNoNx
 
25.05.15
09:58
(7) или наоборот
9 ГеннадийУО
 
25.05.15
10:02
(6) Проблема в их квалификации :)
10 МихаилМ
 
25.05.15
10:18
(7)

не поможет.
11 МихаилМ
 
25.05.15
10:23
(0)
удалите средствами SQL данные тч.

ПолучитьСтруктуруХраненияБазыДанных()
Вам поможет
12 Ненавижу 1С
 
гуру
25.05.15
10:25
да в общем то ничего страшного, просто фантомные записи, которые не влияют ни на что, кроме размера/скорости

вот если еще движения по регистрам остались, то веселее
13 Гёдза
 
25.05.15
10:28
а еще могут быть движения
14 Фрэнки
 
25.05.15
10:34
Не указана версия - вполне вероятно, что это еще на 7.7
Файл описания с соответствием таблиц у базы все равное есть. И правильно сказано в (13), что удалить нужно не только табличные части документов из нужной таблице, но так же надо выбрать/удалить все движения по регистрам, а также итоговые обороты/остатки надо будет рассчитывать заново.
15 ГеннадийУО
 
25.05.15
10:44
(11) Да это не проблема, просто интересно, можно это сделать средствами 1С кроме ТИИ или нет.
16 ГеннадийУО
 
25.05.15
10:45
(12) Эти документы к счастью не делают движений...
17 Славен
 
25.05.15
10:46
(15) можно
18 Славен
 
25.05.15
10:48
+(17) если часть тч нужна, то запросом дергаешь те у которых ссылки на док битые и удаляешь, если вообще все надо почистить, то удаляешь в конфигураторе тч(и док), обновляешь, заново добавляешь
19 ГеннадийУО
 
25.05.15
10:50
(18) Как удалить табличную часть, у которой битая ссылка на документ? Какой код надо написать?
20 Славен
 
25.05.15
10:51
21 Славен
 
25.05.15
10:52
+(20) выводит в том числе и http://catalog.mista.ru/public/98973/
22 Фрэнки
 
25.05.15
10:53
(20) найти не проблема - какой код удаляет обнаруженные битые ссылки в табличных частях?
Это же не удаление наборов записей в регистрах.
23 Славен
 
25.05.15
10:57
(22) тч просто для начала очистить у которой ссылка на объект битая
24 Славен
 
25.05.15
10:59
ну и по гуиду такой ссылки можно восстановить объект и затем его удалить полностью
25 Зеленый пень
 
25.05.15
11:03
(19) Если средствами 1С: запросом получай битые ссылки из таб.частей (ТабЧасть.Ссылка.Дата ЕСТЬ NULL), создавай документы с такими ссылками, очищай таб.часть, и тут же удаляй документ.
26 ГеннадийУО
 
25.05.15
11:06
(25) Вот и я так думаю, что по другому никак. Но несколько миллионов документов восстанавливать а потом удалять както печально...
27 МихаилМ
 
25.05.15
11:11
(26)
у создавайте-удаляйте в несколько фоновых заданий.
28 EugeniaK
 
25.05.15
11:15
(0) На самом деле, эти строки абсолютно никак не влияют на дальнейшую работу базы.
Можно на них просто забить.
Конечно, если у вас нет умельцев, строящих отчеты по данным табличных частей.

Для психологического комфорта, можно написать или найти на инфостарте маленькую обработочку, которая эти строки поудаляет.
29 Зеленый пень
 
25.05.15
11:20
(26) Чего там "восстанавливать"? Ссылка создастся мгновенно.
Теоретически, конечно, можно было бы так, но это будет нарушение лиц. соглашения 1С:

Процедура УдалитьЗависшиеТабличныеЧасти() Экспорт

    // удаляем таб.части документов, у которых нет записей в основных таблицах
    
    Для каждого ОбъектМетаданных Из Метаданные.Документы Цикл
        
        МассивМД = Новый Массив;
        МассивМД.Добавить(ОбъектМетаданных);
        
        ТаблицаБД = ПолучитьСтруктуруХраненияБазыДанных(МассивМД, Истина);
        
        // Основная таблица
        ИмяТаблицыДокумента = ТаблицаБД.Найти("Основная", "Назначение").ИмяТаблицыХранения;
    
        Для каждого СтрокаТЗ Из ТаблицаБД Цикл
        
            ОбработкаПрерыванияПользователя();
        
            Если СтрокаТЗ.Назначение = "ТабличнаяЧасть" Тогда
                // проверяем таб.часть
                
                ИмяТаблицы = СтрокаТЗ.ИмяТаблицыХранения;
                
                ИмяПоляСсылки = "";
                Для каждого СтрокаПолей Из СтрокаТЗ.Поля  Цикл
                    Если Найти(СтрокаПолей.ИмяПоляХранения, "_IDRRef") > 0 Тогда
                        ИмяПоляСсылки = СтрокаПолей.ИмяПоляХранения;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                
                Команда = "DELETE TOP (100000) FROM " + ИмяТаблицы + "
                          |FROM " + ИмяТаблицы + " as vt
                          |LEFT JOIN " + ИмяТаблицыДокумента + "
                          |     ON vt." + ИмяПоляСсылки + " = " + ИмяТаблицыДокумента + "._IDRRef
                          |    WHERE " + ИмяТаблицыДокумента + "._Date_Time is null";
                          
                Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ " + СтрокаТЗ.ИмяТаблицы + " КАК Док ГДЕ Док.Ссылка.Ссылка ЕСТЬ NULL");

                Состояние("Проверяем " + СтрокаТЗ.ИмяТаблицы);
                Записей = Запрос.Выполнить().Выгрузить()[0].Количество;
                
                Пока Записей > 0 Цикл
                
                    ВыполнитьКомандуSQL(Команда);
                    
                    Состояние("Проверяем " + СтрокаТЗ.ИмяТаблицы);
                    Записей = Запрос.Выполнить().Выгрузить()[0].Количество;
                    
                    ОбработкаПрерыванияПользователя();
                    
                КонецЦикла;
                
            
            КонецЕсли;
        
        КонецЦикла;
    КонецЦикла;
    

КонецПроцедуры
30 Фрэнки
 
25.05.15
11:20
(28) мда... уже отвечено было в ветке, что документы с тч, но без движений.
Естественно, что отчеты в базе будут работать именно по тч документов. Просто надо переделать все запросы, чтоб в них была проверка что тч.ссылка.ссылка не равна пустой ссылке.
31 EugeniaK
 
25.05.15
11:40
(30) Какие отчеты по ТЧ без движений?
Ни одного типового не знаю.
32 sapphire
 
25.05.15
11:42
(0) Легко
33 sapphire
 
25.05.15
11:42
(29) еретик.
надо использовать truncate
34 Зеленый пень
 
25.05.15
11:43
(33) для неполной очистки таблицы?
35 sapphire
 
25.05.15
11:45
(34) Я думал там полная, один фиг, если удалемых записей больше целевых то лучше использовать транкейт
36 ДенисЧ
 
25.05.15
11:46
(35) транкейт по условию? Научишь?
37 fisher
 
25.05.15
11:49
(26) Вот именно. С другой стороны это можно делать порционно в течение нескольких дней. Хотя, конечно, в разы проще и быстрее прибить их скриптом TSQL.
38 Черный маклер
 
25.05.15
11:56
(0) в 4 прыжка:
1. универсально выгружаешь в xml доки с нужными тч
2. в конфигураторе удаляешь тч
3. загружаешь сохраненную конфигурацию с тч
4. загружаешь из xml доки
39 ЧеловекДуши
 
25.05.15
11:58
(0) Отдельная благодарность, горе писателю прямого запроса.

Напиши, еще запрос, для удаления Табличной части, у которых нет Ссылок на Шапку документа.

...
А так, есть еще такое дело, что ссылки на удаляемый документ могли где либо записаться в других документах.
40 vde69
 
25.05.15
12:01
(0) я-бы подумал о смене "умельцев"...
41 Tateossian
 
25.05.15
12:03
Сделай TRUNCATE TABLE по требуемой таблице дока, затем тоже самое с таблицей регистрации (если есть регистрация изменений). А когда будет доступна база для регламентного обслуживания ТИИ сделай, можно в несколько заходов.
42 vde69
 
25.05.15
12:06
(39) у автора база БОЛЬШАЯ... и по любому там сейчас бардак с ссылочной целостностью.

давать реальные советы не посмотрев на это тело - точно не стоит :)
43 ЧеловекДуши
 
25.05.15
12:07
44 ЧеловекДуши
 
25.05.15
12:07
(43) Очистка базы средствами SQL
http://catalog.mista.ru/public/122546/
45 ГеннадийУО
 
25.05.15
12:25
(40) Не выйдет. Они сами разработчики этой конфы :)
46 ГеннадийУО
 
25.05.15
12:26
(44) Спасибо. Умельцы вроде согласились, что это их косяк и им его надо исправить, скину им эту ссылочку.