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

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С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    31554    TitanLuchs    108    

149

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    17273    bayselonarrend    127    

68

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

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    21085    user2122906    9    

66

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    36823    user2122906    12    

62

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    32187    dsdred    106    

148

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    28246    bayselonarrend    22    

177

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

13.03.2024    15334    dsdred    22    

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