Очень часто при работе с базой данных возникают сложности с удалением объектов: с помеченным на удаление элементом справочника, документом, etc связаны другие объекты, тоже, возможно, помеченные на удаление, с ними — другие, и так далее. Цепочки таких связей могут быть очень большой длины, могут пересекаться, «зацикливаться», что вызывает трудности для анализа.
Эта проблема не избежала внимания сообщества, на просторах Инфостарта существует немало средств, помогающих в этой ситуации, например:
//infostart.ru/public/116386/ ,
однако по тем или иным причинам они не подошли для решения моих задач.
Предлагаю свой вариант, надеюсь что он будет небесполезен моим коллегам.
Основные возможности:
-
Построение дерева — цепочек объектов, связанных напрямую или опосредованно с объектами, помеченными на удаление. Для этого использовались стандартные механизмы платформы: НайтиПомеченныеНаУдаление(), НайтиПоСсылкам(). Отображается цепочка произвольной длины, при зацикливании построение цепочки прекращается на первом повторно встретившимся элементе. В дерево включаются все ссылочные объекты, константы и записи (а, точнее, ключи записей) независимых регистров сведений.
-
Одновременно с построением дерева происходит анализ, возможно ли удалить объект. При расчете предполагается, что ссылочный объект можно удалить, когда помечены на удаление все объекты, у которых есть на него ссылки; записи независимого регистра сведений могут быть удалены,если будет удален объект из состава ведущих измерений; а константу удалить нельзя :). В общем случае, это конечно же, не всегда соответствует действительности, так как разработчик в обработчиках ПриЗаписи и ПередУдалением может предусмотреть свои процедуры удаления связанных объектов или же запретить в обработчиках удаление, в зависимости от некоторых условий, но такие случаи выходят за рамки этой публикации.
-
Есть возможность просмотреть список реквизитов, в которых встречается ссылка на объект. Корректно обрабатываются реквизиты, реквизиты табличных частей, движения документов.
-
Пользователь может открыть объект для очистки мешающей ссылки, отмены проведения документа, может пометить на удаление ссылочный объект или удалить запись регистра. Пометка на удаление и удаление может происходить в режиме загрузки
-
В управляемой форме возможно открытие стандартного диалога для удаления помеченных объектов
-
Работает в режиме толстого клиента — обычные формы, тонкого клиента — управляемые формы, в том числе такси, веб-клиента. Не требует каких-либо библиотек.
Связанные Предопределенные элементы учитываются?
(1) Так как используются стандартные механизмы платформы: НайтиПомеченныеНаУдаление() и НайтиПоСсылкам(), то учитываются все объекты, учитываемые системой, в том числе предопределенные элементы. Операции с предопределенными элементами зависят от доступных пользователю прав.
В общем-то актуально — стандартной процедуре удаления этого как рази и не хватает, показывать, что еще мешает удалить кроме непосредственно тех объектов, которые уже мешают удалить.
А пробовали обработку на 1С:Документообороте?
Хорошая обработка, спасибо автор. Лучше да же, чем мояhttp://infostart.ru/public/104285/ .
Подскажите, автор, а у вас допилено построчное удаление и отмена удаления для подчиненных объектов?
Например:
1. Если в подчиненных был,например, документ установки цен — документ удаляется полностью, а не построчно.
2. Раз уж я увидел на первом шаге,что объект «тянет» за собой кучу подчиненных объектов и «передумал» его удалять, то как раз В КАЖДЫЙ подчиненный приходится заходить и с каждого СНИМАТЬ пометку на удаление.
Я обработку вашу скачал, но в код еще не лазил.
Автор, скажите, работает ли в 1с ДО?
(4) (7) В 1С:Документообороте я не пробовал обработку, но не вижу причин, по которой она может там не заработать. Если же все-таки будут проблемы в работе, сообщите, будем решать.
(6) Основной функцией этой обработки предполагается просмотр цепочек связанных объектов. Удаление (пометка на удаление) сделано в качестве дополнительного функционала. Устранить помеху для удаления можно не только удалением связанных объектов, но и заменой этой связи на что-либо другое. В приведенном Вами первом примере при попытке удаления ненужной номенклатуры можно удалить документ установки цен, можно удалить соответствующую строку в ТЧ, а можно изменить значение реквизита ТЧ, выбрав там другую номенклатуру (тем самым «разорвав» связь с помеченной). В общем случае, только пользователь может выбрать наиболее подходящий вариант. Что касается второго примера, то я противник автоматического снятия пометки на удаление у всех связанных объектов, потому что тем самым мы можем ошибочно снять пометку с элемента, который был помечен ранее, может даже другим пользователем. Так что указанный Вами функционал не реализован, и сделано это специально.
Если
вместо
то можно выделять несколько строк….
(10)
Да, наверное так будет лучше. Постараюсь доработать в ближайшее время. Спасибо.
(11) Хотел было быстро исправить, но не совсем просто.
Сообщите, если не сложно, как сделаете…
Что-то пошло не так:
Зарплата и Управление Персоналом, редакция 2.5 (2.5.126.1)
{Форма.Форма_.Форма(1,2)}: Ожидается оператор препроцессора
#<<?>>Область ОбработчикиСобытийФормы
{Форма.Форма_.Форма(2,2)}: Ожидается оператор препроцессора
#<<?>>КонецОбласти
{Форма.Форма_.Форма(5,2)}: Ожидается оператор препроцессора
#<<?>>Область ОбработчикиСобытийЭлементовФормы
{Форма.Форма_.Форма(32,2)}: Ожидается оператор препроцессора
#<<?>>КонецОбласти
{Форма.Форма_.Форма(34,2)}: Ожидается оператор препроцессора
#<<?>>Область ОбработчикиКомандФормы
{Форма.Форма_.Форма(79,2)}: Ожидается оператор препроцессора
#<<?>>КонецОбласти
{Форма.Форма_.Форма(81,2)}: Ожидается оператор препроцессора
#<<?>>Область СлужебныеПроцедурыИФункции
{Форма.Форма_.Форма(135,20)}: Тип не определен (ОписаниеОповещения)
Оповещение=новый <<?>>ОписаниеОповещения(«ОповещениеОтветНаВопросУдаления»,ЭтаФорма,ДопПараметры);
{Форма.Форма_.Форма(195,2)}: Ожидается оператор препроцессора
#<<?>>КонецОбласти
Извините, работает.
Запустил из «1С:Предприятие 8.3 (8.3.12.1616)»
Отличная обработка, автору спасибо!