1с7 Поиск и пометка на удаление зависимостей группы справочника Номенклатура

Новая тема
Показывать по 10 20 40 сообщений
Счас нужно пометить все зависимости на удаление (т.е. все ссылки на включенные, в выбранную группу, элементы).

А лучше - вывод в таблицу найденные зависимости (дубликаты не показывать) и дать возможность пользователю помечать (снимать) на удаление какие нужно.
Как, всё-таки, с помощью полученных ссылок помещенных в ТабЗнач {применив НайтиСсылки() (или УдалитьОбъекты()}  помечать на удаление сами справочники, документы и т.д.
А то никак не пойму.
Какой-то не понятный вопрос.
Алгоритм простой:
1. берется объект который надо удалить (пометить)
2. Через НайтиСсылки ищется, кто его держит, т.е. не даст удалить стандартным способом
3. Если среди найденых ссылок есть критически важные (путем перебора строк таблицы), т.е. такие, которые нельзя удалять по внутренним соображениям, тогда ругаемся и ничего не делаем - выходим.
4. Опять-таки перебором строк берется ссылка, ищется объект (Метаданные указаны в этой же строке) и удаляется.
5. Удаляется основной объет.
"Примерно так, наверное:

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

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


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

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

СсылкиНаСсылки(ВыбНоменклатура, 1);

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

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


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

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

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



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

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

Сообщить("КонецОбхода");
КонецПроцедуры"
"Заменил

СсылкиНаСсылки(ВремОбъект, 1);

На

СсылкиНаСсылки(Объект, н1);


Стал работать дольше , счетчик н1 показал в 4 раза больше обходов.
Но все равно не хочет удалять все вложенные (а также вложенных (и т.д.) ) зависимости.


Счас заметил что как минимум часть помеченных не удаляется из-за того что хоть и помечены, но ссылаются друг на друга.
Как модернезировать, чтобы такие сразу удалялись?"
Отвязать. Я так понимаю это что-то типа в Номенклатуре указана основная единица измерения, которая является подчиненной этого элемента. Тут только очистить поле в номенклатуре.

Я в 8-ке делал так: собирал ссылки до глубины скажем 4 (вложенность не более 4), смотрел нет ли среди них того, что удалять нельзя (документов) и если все хорошо - удалял непосредственно, без контроля (я уже проконтролировал).
Потому как и в 8-ке циклическая ссылка двух удаляемых элементов друг на друга не дает удалить стандартным метод.
Читают тему
(гостей: 1)

Быстрый переход