|
|
|
Программное удаление объектов | ☑ | ||
|---|---|---|---|---|
|
0
olia_superstar
28.09.07
✎
13:38
|
Добрый день!
У меня такой вопрос: Если я удаляю какие-нибудь элементы справочника или документы программно (ПолучитьОбъект.Удалить()), насколько я понимаю они удаляются в любом случае, даже если на них есть ссылки в других объектах. А можно ли как-нибудь перед этим проверить есить ли ссылки и если есть, то удаление отменить? Заранее спасибо! |
|||
|
1
Salvador Limones
28.09.07
✎
13:46
|
Можно. Например НайтиСсылки
|
|||
|
2
Salvador Limones
28.09.07
✎
13:47
|
+(1), т.е. "НайтиПоСсылкам"
|
|||
|
3
olia_superstar
28.09.07
✎
13:56
|
А у какого объекта есть такой метод, вот,например, у меня есть код :
НовКод = Справочники.ОбщероссийскийКлассификаторОсновныхФондов.Выбрать(); Пока НовКод.Следующий() Цикл НовКод.ПолучитьОбъект().Удалить(); КонецЦикла; Ни у объекта, ни у выборки я такого не нашла. |
|||
|
4
Salvador Limones
28.09.07
✎
13:58
|
(3) СП спёрли?
|
|||
|
5
Михаил Козлов
28.09.07
✎
14:00
|
(3) У Вас и цикл написан неверно.
|
|||
|
6
olia_superstar
28.09.07
✎
14:03
|
Подскажите, пожалуйста, где ошибка. Вообще-то этот цикл работает и никаких ошибок не выдает, только удаляет все подряд. А я хочу, чтобы он сообщал есть ли ссылки, и если есть, то удаление не делать.
|
|||
|
7
Oleg_Kag
28.09.07
✎
14:08
|
Проверять по одному будем?
НовКод = Справочники.ОбщероссийскийКлассификаторОсновныхФондов.Выбрать(); Пока НовКод.Следующий() Цикл НашаСсылка=НовКод; ТабСсылок = НайтиПоСсылкам(НашаСсылка); Если ТабСсылок .Количество()=0 Тогда Сообщить("Мать моя, что же я делаю!!!!"); НовКод.ПолучитьОбъект().Удалить(); КонецЕсли; КонецЦикла; |
|||
|
8
Oleg_Kag
28.09.07
✎
14:12
|
Или так (вроде вот это будет рабочий код)
НовКод = Справочники.ОбщероссийскийКлассификаторОсновныхФондов.Выбрать(); Пока НовКод.Следующий() Цикл м = новый Массив(); м.Добавить(НовКод); ТабСсылок = НайтиПоСсылкам(м); Если ТабСсылок .Количество()=0 Тогда НовКод.ПолучитьОбъект().Удалить(); КонецЕсли; КонецЦикла; т.к. в описании вроде просит массив |
|||
|
9
Salvador Limones
28.09.07
✎
14:13
|
(7)(8) Жуть какая.
|
|||
|
10
Oleg_Kag
28.09.07
✎
14:14
|
(9) Не спорю, опишите свой вариант, пожалуйста....
|
|||
|
11
Oleg_Kag
28.09.07
✎
14:25
|
м-да...
вот так работает: НовКод = Справочники.ОбщероссийскийКлассификаторОсновныхФондов.Выбрать(); Пока НовКод.Следующий() Цикл м = новый Массив(); м.Добавить(НовКод.Ссылка); ТабСсылок = НайтиПоСсылкам(м); Если ТабСсылок .Количество()=0 Тогда НовКод.ПолучитьОбъект().Удалить(); КонецЕсли; КонецЦикла; |
|||
|
12
olia_superstar
28.09.07
✎
14:55
|
Большое спасибо, так она вроде бы работае правильно, но если бд большая, думать, наверное, будет пол дня!
P.S. Я все-таки не поняла что было не правильно в моем первом цикле (5). |
|||
|
13
Живой Ископаемый
28.09.07
✎
14:59
|
2(12) У вас нарушается выборка... Вы получаете объект из выборки и тут же его удаляете... и на каком объекте после первого удаления у вас спозионирована выборка?
|
|||
|
14
hhhh
28.09.07
✎
15:04
|
(11) НовКод - это объект Выборка. У него нет свойства ПолучитьОбъект();
то есть надо было написать: НовКод.Ссылка.ПолучитьОбъект().Удалить(); |
|||
|
15
olia_superstar
28.09.07
✎
16:01
|
У справочника выборки есть метод ПолучитьОбъект() (14). На первом шаге выборка спозиционирована на первом элементе, я получаю из выборки объект и удаляю, свойства НовКод - ссылка в это время имеет значение объект неопределен, на следующем шаге цикла я перехожу на 2-ой элемент выборки и т.д.
Если делать по типу: НовКод.Ссылка.ПолучитьОбъект().Удалить(); эффект тот же самый, свойство выборки НовКод - ссылка имеет тоже значение объект неопределен. Так какая разница? |
|||
|
16
hhhh
28.09.07
✎
16:19
|
(15) прости, не посмотрел насчет выборки.
А зачем тебе удалять непосредственно? Можно сделать: НовКод.ПолучитьОбъект().УстановитьПометкуУдаления(Истина); А потом Обработкой "Удаление помеченных объектов" все удалишь (а проверкой ссылок). Или Вариант: СпУд = Новый СписокЗначений; НовКод = Справочники.ОбщероссийскийКлассификаторОсновныхФондов.Выбрать(); Пока НовКод.Следующий() Цикл СпУд.Добавить(НовКод.ПолучитьОбъект()); НовКод.ПолучитьОбъект().Удалить(); КонецЦикла; Для Каждого Элемент Из СпУд Цикл Элемент.Значение.Удалить(); КонецЦикла; |
|||
|
17
hhhh
28.09.07
✎
16:20
|
16+
убрать строчку НовКод.ПолучитьОбъект().Удалить(); |
|||
|
18
olia_superstar
28.09.07
✎
16:49
|
Если использовать Ваш вариант (16), то он перепишет все объекты в список значений, когда удаляю вторым циклом ссылка выборки указывает все время на последний элемент, но на определенном шаге она дойдет до последнего и его тоже удалит, и ссылка будет опять объект неопределен! Вам не кажется, что это почти тоже самое, что и мой первый цикл, только сложнее?
|
|||
|
19
hhhh
28.09.07
✎
18:37
|
(18) чтобы не заморачиваться, сделайте
НовКод = Неопределено; Для Каждого Элемент Из СпУд Цикл Элемент.Значение.Удалить(); КонецЦикла; Выборка на этот момент вам уже не нужна, объекты для удаления уже есть, ну и уничтожить эту выборку, чтобы не попадалась на глаза. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |