Имя: Пароль:
1C
1С v8
Как найти элементы справочника без связей с другими объектами?
0 AVI_stealth
 
14.03.13
12:23
Добрый день!
8.2.16, конфигурация моя.

Дано: справочник с огромным количеством элементов. В основном элементы связаны с другими объектами данных, но есть элементы "пустышки", т.е. не имеют никаких связей, которые туда попали по ошибке и теперь мешаются.

Задача: как их найти и удалить?

Мысли: нужно как-то реализовать выборку по отсутствию связи с элементами, как обычно 1С проверяет помеченные на удаление объекты перед тем как удалить. Но как это описать программным кодом не знаю(((
1 ДенисЧ
 
14.03.13
12:24
НайтиПоСсылкам ?
2 pessok
 
14.03.13
12:24
НайтиПоСсылкам
3 Aleksey
 
14.03.13
12:24
А группа - это пустышка

А так ничего не понял
4 Лефмихалыч
 
14.03.13
12:24
пометить все на удаление и запустить удаление помеченных. Дальше аносамо автоматически. Все, что останется после удаления, разпометить
5 pessok
 
14.03.13
12:25
(4) мсье знает толк в извращениях :)
6 Ork
 
14.03.13
12:30
(4) Кстати самый (наверное) быстрый вариант.
7 AVI_stealth
 
14.03.13
12:30
(4) их очень много несколько десятков тысяч. в общем база виснет при пометке на удаление.
(3) группы отсутствуют
(1) (2) угу, щас попробую...
8 pessok
 
14.03.13
12:32
(6) чем он быстрее
Спр = Справочники.Чтото.Выбрать();

Пока Спр.Следующий() Цикл
М = Новый Массив();
М.Добавить(Спр.Ссылка);
Если НайтиПоСсылкам(Массив).Количество() = 0 Тогда
Спр.ПолучитьОбъект.Удалить();
КонецЕсли;
КонецЦикла
9 Ork
 
14.03.13
12:37
(8) Ну хотя бы тем, что НайтиПоСсылкам будет выполнять один раз в отличии от ...
10 Рэйв
 
14.03.13
12:37
(8)Несколько десятков тысяч оно месяц будет колбасить
11 hhhh
 
14.03.13
12:38
(10) надо не все помечать, а разбить на порции по 2-3 тысячи. За час можно всё поудалять.
12 pessok
 
14.03.13
12:39
(9) ну не знаю, право слово... может быть, конечно, но попахивает как-то странно :)
13 pessok
 
14.03.13
12:39
да и в (7) написано, что не помечается, что странно, кстати
14 AVI_stealth
 
14.03.13
12:41
(12) уважаемый, вот эту строку 1С не может скушать

НайтиПоСсылкам(Массив).Количество() = 0

и я тоже что не могу понять)))
15 ptiz
 
14.03.13
12:42
1) Удалить принудительно все элементы.
2) Запустить ТиИ с проверкой ссылочной целостности.
Ссылки восстановятся.
3) Потом обработкой затянуть данные из копии (по УИД) :)
16 AVI_stealth
 
14.03.13
12:43
(12) может так:

НайтиПоСсылкам(М).Количество() = 0 ???
17 pessok
 
14.03.13
12:44
(16) да, есессна, я ж на коленке писал. и при удаление там ПолучитьОбъект(), со скобками
18 AVI_stealth
 
14.03.13
12:44
Делаю по методу (8)... пока висит)) думает чо то))
19 pessok
 
14.03.13
12:45
(18) бекап есть? :)
20 hhhh
 
14.03.13
12:47
(18) лучше по (4), но помечай не все: например, начинающиеся на букву А, потом удалишь - переходишь к букве Б и т.д.
21 AVI_stealth
 
14.03.13
12:47
(19) конечно)) но я все равно пока удаление закомментил и счетчик поставил "оценить масштаб трагедии" пустых объектов)))
22 AVI_stealth
 
14.03.13
14:43
В общем конечный вариант, с пометкой на удаление получился такой:

Спр = Справочники.ФизическиеЛица.Выбрать();
Пока Спр.Следующий() Цикл
   М = Новый Массив();
   М.Добавить(Спр.Ссылка);
   Если НайтиПоСсылкам(М).Количество() = 0 Тогда
       ППНайденоПустышек = ППНайденоПустышек + 1;
       Спр.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
   КонецЕсли;
КонецЦикла;

pessok, спасибо ОГРОМНОЕ!)))
23 pessok
 
14.03.13
15:02
(22) в таком ключе уже можно сразу удалять, без пометки :)
про пометку вообще предлагался другой подход, без кодинга :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.