Имя: Пароль:
1C
 
Программное удаление объектов
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) чтобы не заморачиваться, сделайте

НовКод = Неопределено;  
Для Каждого Элемент Из СпУд Цикл
      Элемент.Значение.Удалить();
   КонецЦикла;

Выборка на этот момент вам уже не нужна, объекты для удаления уже есть, ну и уничтожить эту выборку, чтобы не попадалась на глаза.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.