Сделано на основе публикации //infostart.ru/public/119419/
Цитирую «Обработка на тот случай, когда в базе слишком много помеченных объектов и стандартная процедура удаления виснет.Удаляет объекты по отдельности (по одному). Объекты, на которые имеются ссылки, удалены не будут. Можно запустить несколько раз, а остальное удалить стандартной обработкой.«
Обработке сделана для платформы 8.1.
Добавлен показ в строке состояния количество удалённых и обработанных объектов.
Также в цикле добавлена ОбработкаПрерыванияПользователя().
Неужели в стандартной это сделано сложнее чем использование 2-х функций гл. контекста?
Показать
(1) Obscurus, В какой «стандартной» ?
(2) в ЗУПе это Операции -> Удаление помеченых объектов. Я ошибся, это не обработка в её обычном виде. Код взят из Синтакс-помощника. Даже не скачивая, могу предположить, что у вас реальзовано также. Добавлена обработкаПрерывание и красивый индикатор, но в остальном это тот же медленный процесс поиска. Вопрос был в том, как же сделано в той операции или как вы написали:
(3) Obscurus, А если скачать и посмотреть, то увидите, что сделано совсем не так, как штатное действие «Удаление помеченых объектов».
Штатное выбирает все помеченные на удаление объекты и ДЛЯ ВСЕХ ИХ СРАЗУ производит контроль возможности удаления.
Именно на этом удаление часто и виснет при большом количестве помеченных объектов.
А в этой обработке контроль возможности удаления и затем удаление делается ДЛЯ КАЖДОГО помеченного объекта по очереди.
Вы совсем не правы, видимо, плохо прочитали код исходной обработки (да и типовой — тоже).
И в вашей обработке, и FullMoon — нет контроля ссылочной целостности.
Это первое, и самое главное. На этом можно было бы закончить, т.к. данная обработка сразу и однозначно переходит только в разряд «примеры кода». Ссылочная целостность есть только в типовой.
Далее.
Проблема удаления помеченных в больших базах не в
И у вас, и в типовой (не знаю, как у FullMoon — видимо, у него-то как раз все сразу удаляется) — удаление идет поочередно. В цикле, с перебором каждого элемента, допущенного к удалению (у вас — в единственной процедуре, в типовой — в процедуре «вУдалить».
Проблема как раз в инструкциях 1С:
«УдалитьОбъекты»
«НайтиПомеченныеНаУдаление»
(«УдалитьОбъекты» используете и вы) — они виснут на большом количестве элементов, а «влезть» внутрь функций невозможно, нет даже параметров их поднастройки (например, на удаление/поиска блоками/определенного количества).
Основное зависание — на «НайтиПомеченныеНаУдаление», на «УдалитьОбъекты» — в меньшей степени.
Именно эти функции и нужно заменить аналогами, и искать ссылки/удалять блоками.
(0) Кстати, в обработкеУдаление помеченных объектов от FullMoon в описании сказано ясно:
Видимо, и у вас, и у FullMoon — контроль ссылочной целостности возложен на функцию удаления «УдалитьОбъекты», что неверно.
Также обработка требует монопольный доступ.