Имя: Пароль:
1C
 
Правильное удаление группы в справочнике Номенклатура
0 regAlex2
 
07.12.09
13:13
Помогите, пожалуйста, создать внешнюю обработку поиска зависимостей группы "Папка для удаления" справочника Номенклатуры и их удаления.

Данные в .dbf
Комплексная конфигурация "Бухгалтерия+Торговля+Склад+Зарплата+Кадры", редакция 4.5


Самостоятельно удалось только пометить (а также удалить без учета зависимостей) группу "Папка для удаления"

//Самостоятельные попытки:

СпрНом=СоздатьОбъект("Справочник.Номенклатура");
Удал1= ВыбНоменклатура; //Реквезит диалога формы типа Справочник.Номенклатура

СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент(0) = 1 Цикл
Если СпрНом.ТекущийЭлемент() = Удал1 Тогда

Сообщить ("удаляем: " + СпрНом.Наименование);
СпрНом.Удалить(0);

КонецЕсли;
КонецЦикла;
1 AeDen
 
07.12.09
13:13
repval.ert
2 Фрид
 
07.12.09
14:37
Процедура УдалитьГруппу(ВыбГрНоменклатура)
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(ПодчиненныеЭлементы)
   |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
   |Группировка ТекущийЭлемент;
   |Условие(ТекущийЭлемент.ПринадлежитГруппе(ВыбГрНоменклатура) = 1);
   |"//}}ЗАПРОС
   ;
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   СпрНом=СоздатьОбъект("Справочник.Номенклатура");
   Пока Запрос.Группировка(1) = 1 Цикл
       СпрНом.НайтиЭлемент(Запрос.ТекущийЭлемент);
       СпрНом.Удалить(0);
       Сообщить ("удаляем: " + СпрНом.Наименование);
   КонецЦикла;
   СпрНом.НайтиЭлемент(ВыбГрНоменклатура);
   СпрНом.Удалить(0);
   Сообщить ("удаляем: " + СпрНом.Наименование);
КонецПроцедуры


кактатак?)
3 supremum
 
07.12.09
15:00
Условие можно слегка упростить:
|Условие(ТекущийЭлемент в ВыбГрНоменклатура);
4 Ёпрст
 
гуру
07.12.09
15:12
Двоешники..

СпрНом.НайтиЭлемент(ВыбГруппа);
СпрНом.Удалить(0);

Удалит(пометит на удаление) выбранную группу и всё что в ней...
5 Фрид
 
07.12.09
15:34
(4) :-[
будем знать)
6 Злопчинский
 
07.12.09
15:54
(4) и подчиненный справочник цен...???
7 Ёпрст
 
гуру
07.12.09
16:01
(6) да.
8 supremum
 
07.12.09
16:12
(4) Дейтвительно...
9 supremum
 
07.12.09
16:13
Дейтвительно=Действительно
10 Злопчинский
 
07.12.09
16:44
(7) А ПОЧЕМУ??????????
пару раз на грабли наступал такие - пометил на удаление - штатное удаление помеченных - опа - не удалилось - действительно.. есть ссылки ;-) а все "подчиненное" - опа.. нету его уже... ;-)
11 Ёпрст
 
гуру
07.12.09
16:46
(10) Что почему ?...
12 Ёпрст
 
гуру
07.12.09
16:47
+10 ссылки видать были через 2 подчинения ?...
13 Злопчинский
 
07.12.09
16:49
(12) нет.. например цены к товарам... товар помеченный на удаление - останется, а цены - уйдут в небытиё
14 Ёпрст
 
гуру
07.12.09
16:56
(13) ну дык товар еще где-нить светится ?
15 regAlex2
 
08.12.09
11:30
Спасибо за запрос, но ничего нового, в отличии от моего (1) он не дал - так и остались зависимости. Среди них бывают: Справочник.Единицы , Справочник.Состав комплектов и др.
16 regAlex2
 
09.12.09
12:59
Как понял в моём случае нужно использовать НайтиСсылки() а как реализовать механизм удаления - не знаю


//ТабЗнач - таблица помещённая на форму

СпрНом=СоздатьОбъект("Справочник.Номенклатура");
Удал1= ВыбНоменклатура;
СпрНом.Использоватьродителя (Удал1);
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент(0) = 1 Цикл
 Если СпрНом.ЭтоГруппа() = 0 Тогда

   Сообщить ("удаляем: " + СпрНом.Наименование);
   НайтиСсылки(СпрНом.ТекущийЭлемент(),ТабЗнач);

//не знаю как
     
 КонецЕсли;
 //Сообщить ("удаляем: " + СпрНом.Наименование);
 СпрНом.Удалить(0);
КонецЦикла;
17 Ёпрст
 
гуру
09.12.09
13:00
(16) удалитьОбъекты()
18 regAlex2
 
09.12.09
13:18
(17) В моём случае результат выполнения НайтиСсылки() и УдалитьОбъекты() один, просто операций меньше (всё что можно - удалено).
19 regAlex2
 
14.12.09
12:59
Как, всё-таки, с помощью полученных ссылок помещенных в ТабЗнач {применив НайтиСсылки() (или УдалитьОбъекты()}  помечать на удаление сами справочники, документы и т.д.
А то никак не пойму.
20 regAlex2
 
18.12.09
13:09
Вот какой результат:


Процедура Сформировать()

//Помечает на удаление объекты выбранного справочника Номенклатуры и передает в СпНом
СпНом = СоздатьОбъект("СписокЗначений");
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
СпрНом.ИспользоватьРодителя(ВыбНоменклатура);  //ВыбНоменклатура - группа из которой надо все удалить
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
   СпрНом.Удалить(0);
   СпНом.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
КонецЦикла;

//Удаление выб. Номенклатуры, если есть ссылки на них - не удаляются, а ссылки в ТЗ
ТЗ = СоздатьОбъект("ТаблицаЗначений");
УдалитьОбъекты (СпНом, 1, ТЗ);

//ссылки на справочники и документы помечаем на удаление    
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл

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

//Второй раз пытаемся удалить и показываем оставшиеся ссылки
СпрНом.ИспользоватьРодителя(ВыбНоменклатура);  //ВыбНоменклатура - группа из которой надо все удалить
СпрНом.ВыбратьЭлементы();
СпНом.УдалитьВсе();

Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
   СпНом.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
КонецЦикла;

УдалитьОбъекты (СпНом, 1, ТабЗнач); //ТабЗнач - таб. значений на форме

Сообщить("Готово");
КонецПроцедуры


Таким способом удалось удалить часть.
Помогите, пожалуйста, как можно здесь выполнить нормальную (не стремящуюся к бесконечности) рекурсию?
21 Ёпрст
 
гуру
18.12.09
13:20
22 regAlex2
 
21.12.09
10:31
(21) К сожаленью на этот сайт не попасть: "Извините, небольшая перестройка индексов" .
23 regAlex2
 
21.12.09
12:02
Вот что у меня, но всё равно выходит удалить небольшую часть объектов и ссылокна них:


Процедура СсылкиНаСсылки(Удал1, н1) Далее

//*******************************************
Процедура Сформировать() //начало

СсылкиНаСсылки(ВыбНоменклатура, 1);
   
Сообщить("Готово");    
КонецПроцедуры
 

//н1 - счетчик
//Удал1 = Удаляемый объект
Процедура СсылкиНаСсылки(Удал1, н1)

   
//Помечает на удаление объекты выбранного справочника Номенклатуры и передает в СпНом
СпНом = СоздатьОбъект("СписокЗначений");
СпрНом = СоздатьОбъект("Справочник.Номенклатура");

СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
   Если СпрНом.ТекущийЭлемент() = Удал1 Тогда
   СпрНом.Удалить(0);
   СпНом.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
   КонецЕсли;
КонецЦикла;

//Удаление выб. Номенклатуры, если есть ссылки на них - не удаляются, а ссылки в ТЗ
ТЗ = СоздатьОбъект("ТаблицаЗначений");
УдалитьОбъекты (СпНом, 1, ТЗ);



//ссылки на справочники и документы помечаем на удаление    
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл

   Объект = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,"Ссылка");
   ТипОбъекта = ТипЗначенияСтр(Объект);
   ВидОбъекта = Объект.Вид();
   ВремОбъект = СоздатьОбъект(ТипОбъекта+"."+ВидОбъекта);
   Если ТипОбъекта = "Справочник" Тогда
       Элем=ВремОбъект.НайтиЭлемент(Объект);
       ВремОбъект.Удалить(0); //помечаем на удаление
       н1=н1+1;
       СсылкиНаСсылки(ВремОбъект, 1);
   ИначеЕсли ТипОбъекта = "Документ" Тогда
       Докум=ВремОбъект.НайтиДокумент(Объект);
       ВремОбъект.Удалить(0);
       н1=н1+1;
       СсылкиНаСсылки(ВремОбъект, 1);
   КонецЕсли;
   Сообщить(н1);
КонецЦикла;
   
   Сообщить("КонецОбхода");
КонецПроцедуры
24 regAlex2
 
21.12.09
12:27
(21) Посмотрел. Ненужно, т.к. удалить (и удалял) ВыбНоменклатура, без ссылочной целостности, мог уже давно с помощью Удалить(1) .
25 regAlex2
 
22.12.09
12:10
Счас заметил что как минимум часть помеченных не удаляется из-за того что хоть и помечены, но ссылаются друг на друга.
Как модернезировать, чтобы такие сразу удалялись?