Сценарий "Каскадное удаление записи справочника"

25 18

Иногда возникает необходимость удалить из базы DIRECTUM какую-либо запись справочника. Но удалить ее не удастся в случае, если существуют записи в других справочниках, документы или константы, в реквизитах которых используется удаляемая запись. Эти записи в свою очередь могут использоваться в др. объектах и т.д. Т.е. для удаления исходной записи необходимо удалить все “дерево” – под этим и подразумевается каскадное удаление записи справочника.

Для реализации каскадного удаления был разработан сценарий, предназначенный для администраторов и разработчиков. Для успешного использования сценария у пользователя должны быть права на удаление самой записи и всех объектов, каскадно использующих данную запись.

Как работает сценарий.

  1. Запрашивается тип справочника, запись справочника и вариант работы сценария (Удаление записи или Сбор информации).

  1. При Удалении вызывается функция, в которую передается запись справочника. Она находит все объекты, использующие данную запись. Если запись не используется, то происходит ее удаление. В противном случае, просматриваются все объекты, и для записи справочника - функция рекурсивно вызывает сама себя, документы – удаляются (реквизит, в котором используется запись, обязательный) или предлагается выбрать Удалить документ/Очистить реквизит (реквизит необязательный), константы - очищаются. Если все объекты обработаны, значит, запись больше не используется, и она удаляется.
  2. При Сборе информации выполняется также разработанный аналитический отчет «Каскадное использование записи справочника», который показывает ссылки на объекты, каскадно использующие запись справочника в качестве значения реквизита.

Рис. 1. Отчет.

Особенности работы сценария:

  • если запись из одного из следующих справочников: Организации, Подразделения организаций, Контактные лица организаций, Абоненты систем обмена документами, является отражением записи из зеркального справочника - Наши организации, Подразделения, Работники, Наши абоненты систем обмена документами, удалить такую запись можно только через зеркальный справочник. Поэтому сначала происходит удаление исходной записи, а затем отражения;
  • т.к. в базе может существовать циклическое использование записи справочника, например: в таких случаях выполнение сценария прерывается и выводится сообщение с указанием справочника и наименования записи, которую не удалось удалить. Следует вручную очистить значение соответствующего реквизита и запустить сценарий заново. Однако, для случая очистка реквизита “Руководитель” выполнятся автоматически.

Сценарий также может быть запущен из командной строки или другой компоненты . Дополнительные параметры для запуска сценария: “RefType” – имя типа справочника, “ID” – ИД записи, “UseType” – тип использования “Удаление/Отчет”:

SBLauncher.exe  S=SQLSERVER  D=DIRECTUM -CT=Script -F="CascadeDeleting"

-R="RefType=ОРГ|ID=101702|UseType=Отчет"

Работает в DIRECTUM 4.9.

 

******************01.02.2013******************

Добавлено:

1) после успешного завершения сценария выводится список удаленных или очищенных объектов;

2) в документах предлагается очистить необязательный реквизит.

CascadeDeleting.zip (19,28 Кб)

Отредактировал Анастасия Луценко, 01.02.2013 в 10:13
Иван Чурбаков

Константы очищать нельзя: там может содержаться значение, только внешне похожее на эту запись справочника. В реальности это может быть код записи совсем другого справочника или произвольное число.

Алексей Язынин

Отличная разработка.

Пожелание: После успешного удаления выводить список удаленных объектов. Не знаю насколько полезно, но интуитивно хочется знать полный результат работы сценария.

Виталий Астраханцев

Вещь действительно полезная, но хотелось бы чтобы можно было выбрать несколько записей из справочника и после выполнения удаления выдавался запрос "Хотите удалить записи из других справочников? Да/Нет"  и если да, то снова появлялось окно выбора справочника

Андрей Девятьяров
документы – удаляются, константы - очищаются
1. Правильно ли я понял, что если в документе, есть поле типа справочник, ссылающееся на удаляемую запись - то этот документ удаляется?
 
2. Как определяется, что в константе используется эта запись справочника?
 
Ну а вообще сценарий полезный и пригодится.
Денис Баранов
Константы очищать нельзя: там может содержаться значение, только внешне похожее на эту запись справочника. В реальности это может быть код записи совсем другого справочника или произвольное число.

В данном случае имелось ввиду, что при удалении нашей организации удаляются соответствующие строки табличной части констант, которые делятся по нашим организациям. Больше ничего.
Денис Баранов
Вещь действительно полезная, но хотелось бы чтобы можно было выбрать несколько записей из справочника и после выполнения удаления выдавался запрос "Хотите удалить записи из других справочников? Да/Нет"  и если да, то снова появлялось окно выбора справочника

Виталий, сценарий предусматривает в том числе и программный вызов. Напишите свой сценарий сверху, который будет вызывать этот сценарий - хоть циклично, хоть с мультивыбором, хоть как. smiley
Юлия Мартыненко

Очень необходимая возможность! Жаль, что только для 4.9(

Анастасия Пермякова
 
 
1. Правильно ли я понял, что если в документе, есть поле типа справочник, ссылающееся на удаляемую запись - то этот документ удаляется?
Да, именно так.
Анастасия Пермякова
2. Как определяется, что в константе используется эта запись справочника?
запросом:
select distinct
                  'Константа', '', '', con.OurFirm, '', con.Const
                from 
                  MBAnalit a, MBConst con
                where
                  con.OurFirm = a.Analit
                  and a.Analit = "&Analit&"
                order by
                  con.Const"
Андрей Девятьяров
Да, именно так.
1. Если этот реквизит содержится в табличной части документа, получается аналогия с константами, только тут удаляется весь документ.
2. Если реквизит необязательный для заполнения - почему его просто не очищать? Удаление документа это крайний шаг.
 
Владимир Рудаков

Спасибо. Очень полезный сценарий. Есть еще одна хотелка))) Возможно добавить в сценарий функционал восстановления удаленных записей? Например, после удаления записи формируется SQL – запрос, после выполнения которого, удаленные записи восстанавливаются.

Анастасия Пермякова
2. Если реквизит необязательный для заполнения - почему его просто не очищать? Удаление документа это крайний шаг.
Действительно, необязатеьный реквизит лучше очищать. Или предлагать пользователю Удалить документ/Очистить реквизит.
Денис Исаев
Если запись не используется, то происходит ее удаление. В противном случае, просматриваются все объекты, и для записи справочника - функция рекурсивно вызывает сама себя, документы – удаляются, константы - очищаются.

Каким-нибудь образом решена проблема того, что рекурсивно функцию можно вызывать только 32 раза? После IS-Builder прервет выполнение сценария. Конечно, ситуация редкая, что у нас что-то где то используется 32 раза smiley

А в целом сценарий очень полезен. Спасибо! 
Анастасия Пермякова
Каким-нибудь образом решена проблема того, что рекурсивно функцию можно вызывать только 32 раза? После IS-Builder прервет выполнение сценария. Конечно, ситуация редкая, что у нас что-то где то используется 32 раза
К сожалению, нет. Остается надеяться как раз на редкость ситуации.
Анастасия Пермякова
Есть еще одна хотелка))) Возможно добавить в сценарий функционал восстановления удаленных записей?
В принципе, возможно конечно все :) Но перед использованием лучше проанализировать что будет удалено через Сбор информации, чтоб потом не пришлось восстанавливать.
 
Будет время - доработаю сценарий по пожеланиям.
Алексей Язынин

В DIRECTUM 5.0 сценарий валится на попытке обработать несохраняемый реквизит - в ошибке пишет, что не удается обратится к полю NamaNS. Решил проблему добавлением в двух функциях, используемых сценарием, условие, чтобы обрабатывались только сохраняемые реквизиты. 

Авторизуйтесь, чтобы написать комментарий