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

02.11.15

Разработка - Механизмы платформы 1С

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7459    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5947    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17674    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11227    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23763    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18835    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14735    YA_418728146    7    

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