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

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 Бесплатно (free)

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

14.01.2025    5860    dsdred    42    

91

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

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

23.06.2024    10054    bayselonarrend    21    

161

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

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

13.03.2024    7212    dsdred    18    

81

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

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

24.01.2024    23344    YA_418728146    30    

73

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

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

06.10.2023    25373    SeiOkami    48    

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