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

Новая тема
Показывать по сообщений
Счас нужно пометить все зависимости на удаление (т.е. все ссылки на включенные, в выбранную группу, элементы).<br><br>А лучше - вывод в таблицу найденные зависимости (дубликаты не показывать) и дать возможность пользователю помечать (снимать) на удаление какие нужно.
Как, всё-таки, с помощью полученных ссылок помещенных в ТабЗнач {применив НайтиСсылки() (или УдалитьОбъекты()}  помечать на удаление сами справочники, документы и т.д.<br>А то никак не пойму.
Какой-то не понятный вопрос.<br>Алгоритм простой:<br>1. берется объект который надо удалить (пометить)<br>2. Через НайтиСсылки ищется, кто его держит, т.е. не даст удалить стандартным способом<br>3. Если среди найденых ссылок есть критически важные (путем перебора строк таблицы), т.е. такие, которые нельзя удалять по внутренним соображениям, тогда ругаемся и ничего не делаем - выходим.<br>4. Опять-таки перебором строк берется ссылка, ищется объект (Метаданные указаны в этой же строке) и удаляется.<br>5. Удаляется основной объет.<br>
"Примерно так, наверное:<br><br>Документ=СоздатьОбъект("Документ");<br>Справочник=СоздатьОбъект("Справочник");<br>ТаблЗнач=СоздатьОбъект("ТаблицаЗначений");<br>НайтиСсылки(ПлохойТовар,ТаблЗнач);<br>Для i=1 По ТаблЗнач.КоличествоСтрок() Цикл<br>     ТекОбъект=ТаблЗнач.ПолучитьЗначение(i,2);<br>     ТипЗначенияОбъекта=ТипЗначения(ТекОбъект);<br>     Если ТипЗначенияОбъекта=11 Тогда //это справочник<br>          Если Справочник.НайтиЭлемент(ТекОбъект)=1 Тогда<br>               Справочник.Удалить(0);<br>          КонецЕсли;<br>     ИначеЕсли ТипЗначенияОбъекта=12 Тогда //это документ<br>          Если Документ.НайтиДокумент(ТекОбъект)=1 Тогда<br>               Документ.Удалить(0);<br>          КонецЕсли;<br>     КонецЕсли;<br>КонецЦикла;<br><br>только будет проблема с тем, что на те элементы, которые мы в данном случае метим на удаление тоже могут быть какие то ссылки и их тоже в свою очередь нужно собирать. У вас не получилось воспользоваться предложенными выше алгоритмами?"
"Вот результат. Но всё равно выходит удалить небольшую часть объектов и ссылок на них, хотя поидее должна обойти их и пометить:<br><br><br>Процедура СсылкиНаСсылки(Удал1, н1) Далее<br><br>//*******************************************<br>Процедура Сформировать() //начало<br><br>СсылкиНаСсылки(ВыбНоменклатура, 1);<br> <br>Сообщить("Готово"); <br>КонецПроцедуры<br>  <br><br>//н1 - счетчик<br>//Удал1 = Удаляемый объект<br>Процедура СсылкиНаСсылки(Удал1, н1)<br><br> <br>//Помечает на удаление объекты выбранного справочника Номенклатуры и передает в СпНом<br>СпНом = СоздатьОбъект("СписокЗначений");<br>СпрНом = СоздатьОбъект("Справочник.Номенклатура");<br><br>СпрНом.ВыбратьЭлементы();<br>Пока СпрНом.ПолучитьЭлемент() = 1 Цикл <br> Если СпрНом.ТекущийЭлемент() = Удал1 Тогда<br> СпрНом.Удалить(0);<br>    СпНом.ДобавитьЗначение(СпрНом.ТекущийЭлемент()); <br> КонецЕсли;<br>КонецЦикла;<br><br>//Удаление выб. Номенклатуры, если есть ссылки на них - не удаляются, а ссылки в ТЗ<br>ТЗ = СоздатьОбъект("ТаблицаЗначений");<br>УдалитьОбъекты (СпНом, 1, ТЗ);<br><br><br><br>//ссылки на справочники и документы помечаем на удаление <br>ТЗ.ВыбратьСтроки();<br>Пока ТЗ.ПолучитьСтроку() = 1 Цикл<br><br> Объект = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,"Ссылка");<br>    ТипОбъекта = ТипЗначенияСтр(Объект);<br>    ВидОбъекта = Объект.Вид();<br>    ВремОбъект = СоздатьОбъект(ТипОбъекта+"."+ВидОбъекта);<br>    Если ТипОбъекта = "Справочник" Тогда<br>        Элем=ВремОбъект.НайтиЭлемент(Объект);<br>        ВремОбъект.Удалить(0); //помечаем на удаление<br> н1=н1+1;<br> СсылкиНаСсылки(ВремОбъект, 1);<br>    ИначеЕсли ТипОбъекта = "Документ" Тогда<br>        Докум=ВремОбъект.НайтиДокумент(Объект);<br>        ВремОбъект.Удалить(0);<br> н1=н1+1;<br> СсылкиНаСсылки(ВремОбъект, 1);<br> КонецЕсли;<br> Сообщить(н1);<br>КонецЦикла;<br> <br> Сообщить("КонецОбхода");<br>КонецПроцедуры"
"Заменил<br><br>СсылкиНаСсылки(ВремОбъект, 1);<br><br>На<br><br>СсылкиНаСсылки(Объект, н1);<br><br><br>Стал работать дольше , счетчик н1 показал в 4 раза больше обходов.<br>Но все равно не хочет удалять все вложенные (а также вложенных (и т.д.) ) зависимости.<br><br><br>Счас заметил что как минимум часть помеченных не удаляется из-за того что хоть и помечены, но ссылаются друг на друга.<br>Как модернезировать, чтобы такие сразу удалялись?"
Отвязать. Я так понимаю это что-то типа в Номенклатуре указана основная единица измерения, которая является подчиненной этого элемента. Тут только очистить поле в номенклатуре.<br><br>Я в 8-ке делал так: собирал ссылки до глубины скажем 4 (вложенность не более 4), смотрел нет ли среди них того, что удалять нельзя (документов) и если все хорошо - удалял непосредственно, без контроля (я уже проконтролировал).<br>Потому как и в 8-ке циклическая ссылка двух удаляемых элементов друг на друга не дает удалить стандартным метод.
Читают тему
(гостей: 1)

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