gifts2017

Пример использования механизма выполнения произвольного кода обработки "Универсальный подбор и обработка объектов" для удаления объектов с контролем ссылочной целостности

Опубликовал Даниил Матвеев (cargobird) в раздел Программирование - Практика программирования

Если обходиться штатными средствами для удаления объектов, то под рукой имеются два: встроенный в платформу механизм "Удаление помеченных на удаление объектов" и "Универсальный подбор и обработка объектов". Первый неудобен в использовании (по крайней мере в обычном приложении на платформе 8.2), второй - не позволяет осуществлять нормальный контроль ссылочной целостности. Попробуем скрестить их без доработок.

Для этого воспользуемся механизмом выполнения произвольного кода.

1. Выбираем тип объекта для удаления, задаем отбор (можно сразу установить отбор ПометкаУдаления Равно Да).

Отбор по типу объекта

2. Получаем объекты по отбору.

Найденные объекты

3. Создаем новый произвольный алгоритм. Вставляем туда нижеописанный код. Фишка в проверке на имеющиеся ссылки при помощи встроенной функции НайтиПоСсылкам.

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

Произвольный алгоритм

 

Преимущество подобного подхода: объекты удаляются последовательно; те, которые не могут быть удалены, пропускаются с сообщением, и код двигается дальше. Кроме того, обошлись без доработок.

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

ВНИМАНИЕ!!! Важное дополнение кода в комментарии, спасибо V.Nikonov (http://infostart.ru/profile/54105/)

P.S. Еще один интересный, но уже программный пример: http://infostart.ru/public/414206/

P.P.S. И еще несколько простых и полезных приемов: http://infostart.ru/public/399922/

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей Карпов (karpik666) 02.11.15 04:21
Что то не пойму, а разве обработка удаления помеченных объектов не выполняет тоже самое, и про какие галочки вы говорите? Сколько раз пользовался и ни разу не приходилось где то дополнительно их расставлять. И ваш код не обрабатывает помеченные объекты, ссылающиеся на помеченные объекты, например Номенклатура и единица измерения, обе помечены на удаление, но у вас удаляться не будут.
2. Даниил Матвеев (cargobird) 02.11.15 07:12
(1) karpik666, речь идет о стандартной обработке: Операции - Удаление помеченных объектов в случае, когда надо выбрать определенный тип объектов, например, только помеченные на удаление договоры. Тогда приходится снимать все флаги с уже отмеченных объектов и проставлять нужные. Зачастую это долгая долбежка.
Приведенный код - да, не отрабатывает поиск зависимых объектов, есть над чем подумать, спасибо.
3. Андрей Карпов (karpik666) 02.11.15 07:20
(2) cargobird, понял, что имеете ввиду, ну конечно это геморой, есть уже доработанные обработки, которые даже работают без монопольного режима, проще их добавить и скорость повыше и бухам удобней.
4. Сергей Старых (tormozit) 02.11.15 08:57
Такое уже сделано в инструментах разработчика. Подбор и обработка объектов / обработка "Удалить с контролем ссылок".
5. Даниил Матвеев (cargobird) 02.11.15 09:13
(4) tormozit, приведенный в статье прием скорее для типовой конфигурации, без дополнительных доработок и внешних инструментов, только штатные.
6. Вадим Никонов (V.Nikonov) 05.11.15 13:06
Согласно приведенному фрагменту кода: Если к помеченному элементу "Номенклатура" найдется помеченная на удаление ссылка "ЕдиницаИзмерения" то элемент Номенклатуры удалять нельзя!!!???
На самом деле требуется анализировать полученные ссылки на пометку удаления... далее рекурсивно убеждаться в том, что нет дальнейших препятствий к удалению. Рассмотренный частный случай элемента без связей на практике мало применим!
7. Даниил Матвеев (cargobird) 05.11.15 17:22
(6) V.Nikonov, да вы правы. Но рекурсию не сделать, так как это выполнение произвольного кода, где нет возможности писать процедуры и функции (насколько я знаю).
Поэтому можно пройтись по найденным ссылкам, и если все помечены на удаление, то все-таки удалить.
    СписокСсылок = Новый Массив;
	СписокСсылок.Добавить(Объект.Ссылка);
	МассивСсылок = НайтиПоСсылкам(СписокСсылок);
	Если МассивСсылок.Количество() = 0 Тогда
	    Сообщить(Строка(ТекущаяДата()) + ": удаляется " + Строка(Объект));
	    Объект.ОбменДанными.Загрузка = Истина;
	    Объект.Удалить();
	Иначе
		КоличествоПомеченныхНаУдаление = 0;
		Для каждого СтрокаМассивСсылок Из МассивСсылок Цикл
			Если СтрокаМассивСсылок.Данные.ПометкаУдаления Тогда
				КоличествоПомеченныхНаУдаление = КоличествоПомеченныхНаУдаление + 1;
			КонецЕсли; 
		КонецЦикла;
		Если КоличествоПомеченныхНаУдаление = МассивСсылок.Количество() Тогда
		    Объект.ОбменДанными.Загрузка = Истина;
			Сообщить(Строка(ТекущаяДата()) +" есть ссылки, все помечены на удаление, удаляется " + Строка(Объект));
			Объект.Удалить();
		Иначе 
			Сообщить(Строка(Объект) + ": есть ссылки, пропущен.");
		КонецЕсли;
	КонецЕсли;
...Показать Скрыть
8. Андрей Карпов (karpik666) 05.11.15 19:02
(7) cargobird, вы не обижайтесь, но по мне практического применения в данной статье Ноль, не могу представить себе бухгалтера использующую такую возможность, при том пока не работающую как надо, имхо это как программировать на Ассемблере, вроде круто, но многого не накодишь.
9. Даниил Матвеев (cargobird) 05.11.15 19:25
(8) karpik666, не всё, что тут выкладывается пригодится продвинутому прогеру, это да.
Этим может воспользоваться не бухгалтер, а например администратор базы данных, который не силен в кодинге, но вполне разбирается в матчасти. Или начинающему прогеру, у которого нет соответствующего инструмента.
Мне про подобную возможность в Инструментах разработчика стало известно только после написания статьи, качать и проверять другие разработки пока недосуг.
Самому же возможность пригодилась и пригодится в будущем, так как надо очень выборочное удаление объектов с контролем ссылочной целостности. Благодаря комментарию (6) буду использовать с большей эффективностью.
Бухи, кстати, у нас удалением не занимаются...
10. Андрей Карпов (karpik666) 05.11.15 19:34
(9) cargobird, по мне человек должен немного разбираться, что он делает прежде, чем пытаться что-то сделать в базе. Тем более удаление помеченных объектов. Пока предложенный вами вариант ни кому не подходит, так как по факту он не работает. Сам пользуюсь вот такой обработкой для удаления помеченных объектов. полностью устраивает, работает без монопольного режима, и можно выбирать какие объекты удалять. Кто ее написал, тому большое спасибо
Прикрепленные файлы:
УдалениеПомеченныхОбъектов(Без Монопольного режима).epf
11. Даниил Матвеев (cargobird) 05.11.15 20:11
(10) karpik666, спасибо, посмотрю...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа