|
|
|
Правильное удаление группы в справочнике Номенклатура | ☑ | ||
|---|---|---|---|---|
|
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
|
Счас заметил что как минимум часть помеченных не удаляется из-за того что хоть и помечены, но ссылаются друг на друга.
Как модернезировать, чтобы такие сразу удалялись? |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |