Иногда возникает необходимость удалить из базы DIRECTUM какую-либо запись справочника. Но удалить ее не удастся в случае, если существуют записи в других справочниках, документы или константы, в реквизитах которых используется удаляемая запись. Эти записи
в свою очередь могут использоваться в др. объектах и т.д. Т.е. для удаления исходной записи необходимо удалить все “дерево” – под этим и подразумевается каскадное удаление записи справочника.
Для реализации каскадного удаления был разработан сценарий, предназначенный для администраторов и разработчиков. Для успешного использования сценария у пользователя должны быть права на удаление самой записи и всех объектов, каскадно использующих данную
запись.
Как работает сценарий.
Запрашивается тип справочника, запись справочника и вариант работы сценария (Удаление записи или
Сбор информации).
При Удалении вызывается функция, в которую передается запись справочника. Она находит все объекты, использующие данную запись. Если запись не используется, то происходит ее удаление. В противном случае, просматриваются все объекты,
и для записи справочника - функция рекурсивно вызывает сама себя, документы – удаляются (реквизит, в котором используется запись, обязательный) или предлагается выбрать Удалить документ/Очистить реквизит (реквизит необязательный), константы - очищаются. Если
все объекты обработаны, значит, запись больше не используется, и она удаляется.
При Сборе информации выполняется также разработанный аналитический отчет «Каскадное использование записи справочника», который показывает ссылки на объекты, каскадно использующие запись справочника в качестве значения реквизита.
Рис. 1. Отчет.
Особенности работы сценария:
если запись из одного из следующих справочников: Организации,
Подразделения организаций, Контактные лица организаций,
Абоненты систем обмена документами, является отражением записи из зеркального справочника -
Наши организации, Подразделения, Работники,
Наши абоненты систем обмена документами, удалить такую запись можно только через зеркальный справочник. Поэтому сначала происходит удаление исходной записи, а затем отражения;
т.к. в базе может существовать циклическое использование записи справочника, например:
в
таких случаях выполнение сценария прерывается и выводится сообщение с указанием справочника и наименования записи, которую не удалось удалить. Следует вручную очистить значение соответствующего реквизита и запустить сценарий заново. Однако, для случая
очистка
реквизита “Руководитель” выполнятся автоматически.
Сценарий также может быть запущен из командной строки или другой компоненты . Дополнительные параметры для запуска сценария: “RefType” – имя типа справочника, “ID” – ИД записи, “UseType” – тип использования “Удаление/Отчет”:
Константы очищать нельзя: там может содержаться значение, только внешне похожее на эту запись справочника. В реальности это может быть код записи совсем другого справочника или произвольное число.
Пожелание: После успешного удаления выводить список удаленных объектов. Не знаю насколько полезно, но интуитивно хочется знать полный результат работы сценария.
Вещь действительно полезная, но хотелось бы чтобы можно было выбрать несколько записей из справочника и после выполнения удаления выдавался запрос "Хотите удалить записи из других справочников? Да/Нет" и если да, то снова появлялось окно выбора справочника
Константы очищать нельзя: там может содержаться значение, только внешне похожее на эту запись справочника. В реальности это может быть код записи совсем другого справочника или произвольное число.
В данном случае имелось ввиду, что при удалении нашей организации удаляются соответствующие строки табличной части констант, которые делятся по нашим организациям. Больше ничего.
Вещь действительно полезная, но хотелось бы чтобы можно было выбрать несколько записей из справочника и после выполнения удаления выдавался запрос "Хотите удалить записи из других справочников? Да/Нет" и если да, то снова появлялось
окно выбора справочника
Виталий, сценарий предусматривает в том числе и программный вызов. Напишите свой сценарий сверху, который будет вызывать этот сценарий - хоть циклично, хоть с мультивыбором, хоть как.
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"
Спасибо. Очень полезный сценарий. Есть еще одна хотелка))) Возможно добавить в сценарий функционал восстановления удаленных записей? Например, после удаления записи формируется
SQL– запрос, после выполнения которого, удаленные записи восстанавливаются.
Если запись не используется, то происходит ее удаление. В противном случае, просматриваются все объекты, и для записи справочника - функция рекурсивно вызывает сама себя, документы – удаляются, константы - очищаются.
Каким-нибудь образом решена проблема того, что рекурсивно функцию можно вызывать только 32 раза? После IS-Builder прервет выполнение сценария. Конечно, ситуация редкая, что у нас что-то где то используется 32 раза
Каким-нибудь образом решена проблема того, что рекурсивно функцию можно вызывать только 32 раза? После IS-Builder прервет выполнение сценария. Конечно, ситуация редкая, что у нас что-то где то используется 32 раза
К сожалению, нет. Остается надеяться как раз на редкость ситуации.
Есть еще одна хотелка))) Возможно добавить в сценарий функционал восстановления удаленных записей?
В принципе, возможно конечно все :) Но перед использованием лучше проанализировать что будет удалено через
Сбор информации, чтоб потом не пришлось восстанавливать.
В DIRECTUM 5.0 сценарий валится на попытке обработать несохраняемый реквизит - в ошибке пишет, что не удается обратится к полю NamaNS. Решил проблему добавлением в двух функциях, используемых сценарием, условие, чтобы обрабатывались только сохраняемые реквизиты.
Константы очищать нельзя: там может содержаться значение, только внешне похожее на эту запись справочника. В реальности это может быть код записи совсем другого справочника или произвольное число.
Отличная разработка.
Пожелание: После успешного удаления выводить список удаленных объектов. Не знаю насколько полезно, но интуитивно хочется знать полный результат работы сценария.
Вещь действительно полезная, но хотелось бы чтобы можно было выбрать несколько записей из справочника и после выполнения удаления выдавался запрос "Хотите удалить записи из других справочников? Да/Нет" и если да, то снова появлялось окно выбора справочника
Очень необходимая возможность! Жаль, что только для 4.9(
'Константа', '', '', con.OurFirm, '', con.Const
from
MBAnalit a, MBConst con
where
con.OurFirm = a.Analit
and a.Analit = "&Analit&"
order by
con.Const"
Спасибо. Очень полезный сценарий. Есть еще одна хотелка))) Возможно добавить в сценарий функционал восстановления удаленных записей? Например, после удаления записи формируется SQL – запрос, после выполнения которого, удаленные записи восстанавливаются.
А в целом сценарий очень полезен. Спасибо!
В DIRECTUM 5.0 сценарий валится на попытке обработать несохраняемый реквизит - в ошибке пишет, что не удается обратится к полю NamaNS. Решил проблему добавлением в двух функциях, используемых сценарием, условие, чтобы обрабатывались только сохраняемые реквизиты.
Авторизуйтесь, чтобы написать комментарий