Фоновое Задание "Удаление помеченных объектов" (не монопольно)

Публикация № 196449

Администрирование - Администрирование данных 1С - Чистка базы

Подробное описание немонопольного удаления помеченных объектов, реализованное как Фоновое Задание.

Вот я, наконец, добрался до давно мучившей меня проблемы - как реализовать Удаление помеченных объектов следующим образом:

а) не монопольно - многие пользователи и Склад работают допоздна, так что выгнать их нет никакой возможности;

б) автоматически, чтобы запустилось Фоновое Задание и удалило весь накопившийся "мусор".

Перелопатив большое количество материала, который нашел на Инфостарте и в сети, пришел к неутешительным выводам - эти варианты мне не подходят, придется обходиться своими силами....

Да и радости не прибавлял тот факт, что в 18-ой платформе была всё таки исправлена древняя ошибка № 20013012, теперь установить Монопольный режим при запуске Удаления помеченных объектов стало практически невозможно.....

Возник вопрос - что удалить, а что оставить? Решили, если есть ссылки на Справочники или Документы - оставляем, а Регистрами Сведений решили пожертвовать (даже если будет урон, то незначительный).

Вот что в результате получилось:

Процедура УдалениеПомеченныхОбъектов() Экспорт

   
УстановитьПривилегированныйРежим(Истина);

    Попытка

       
ПомеченныеОбъекты = НайтиПомеченныеНаУдаление();
       
ТабСсылок = НайтиПоСсылкам(ПомеченныеОбъекты);

       
МассивКУдалению = Новый Массив;
       
ТабНеУдаляемых = ТабСсылок.СкопироватьКолонки();

        Для Каждого
Элемент из ПомеченныеОбъекты Цикл
           
СтрокиСсылки = ТабСсылок.НайтиСтроки(Новый Структура("Ссылка", Элемент));
            Если
СтрокиСсылки.Количество() > 0 Тогда
                Если
СтрокиСсылки.Количество() = 1 Тогда

                    Если Лев(СтрокиСсылки[0].Метаданные.ПолноеИмя(),15) = "РегистрСведений" Тогда
                       
МассивКУдалению.Добавить(Элемент); // Если ссылка на РегистрСведений, то удалять
                       
Продолжить;
                    КонецЕсли;
                    Если
СтрокиСсылки[0].Данные <> Элемент Тогда

                        НоваяСтрока = ТабНеУдаляемых.Добавить();
                       
НоваяСтрока.Ссылка = СтрокиСсылки[0].Ссылка;
                       
НоваяСтрока.Данные = СтрокиСсылки[0].Данные;
                       
НоваяСтрока.Метаданные = СтрокиСсылки[0].Метаданные;
                        Продолжить;
                    Иначе
                       
МассивКУдалению.Добавить(Элемент);
                        Продолжить;
                    КонецЕсли;
                КонецЕсли;
                Если
СтрокиСсылки.Количество() > 1 Тогда // Надо проверить!!!
                    // Может там ссылка на справочник, или документ, или регистр сведений???
                   
НеУдалять = Ложь;
                    Для
й = 0 По СтрокиСсылки.Количество()-1 Цикл
                       
// Проверим метаданные, если ссылка на РегистрСведений, тогда удалять
                       
Если Лев(СтрокиСсылки[й].Метаданные.ПолноеИмя(),15) = "РегистрСведений" Тогда
                            Продолжить;
                        КонецЕсли;
                        Если
СтрокиСсылки[й].Данные <> Элемент Тогда
                           
НеУдалять = Истина; Прервать;
                        КонецЕсли;
                    КонецЦикла;
                   
й = ?(й = Неопределено, 0, й);
                    Если
НеУдалять Тогда
                       
НоваяСтрока = ТабНеУдаляемых.Добавить();
                       
НоваяСтрока.Ссылка = СтрокиСсылки[й].Ссылка;
                       
НоваяСтрока.Данные = СтрокиСсылки[й].Данные;
                       
НоваяСтрока.Метаданные = СтрокиСсылки[й].Метаданные;
                    Иначе
                       
МассивКУдалению.Добавить(Элемент);
                    КонецЕсли;
                КонецЕсли;
            Иначе
               
МассивКУдалению.Добавить(Элемент); // Ссылка вообще не найдена....
           
КонецЕсли;
        КонецЦикла;

        Для Каждого
Элемент из МассивКУдалению Цикл
           
Ссылка = Элемент.Ссылка;
           
Объект = Ссылка.ПолучитьОбъект();
            Попытка
                Если Не
Объект = Неопределено Тогда
                   
Объект.Удалить();
                КонецЕсли;
            Исключение
               
ЗаписьЖурналаРегистрации("Удаление помеченных объектов.",
               
УровеньЖурналаРегистрации.Информация, , ,
               
"Не могу удалить объект " + Объект);
            КонецПопытки;
        КонецЦикла;

       
// Информацию о неудаляемых ссылках сбросим в текстовый файл
       
ТекстДок = Новый ТекстовыйДокумент;
        Для каждого
Ссылка из ТабНеУдаляемых Цикл
           
СтрСообщения = "Объект не удален: " + СокрЛП(Ссылка[0]);
           
СтрСсылка = ", используется в " + СокрЛП(Ссылка[1]);
           
ТекстДок.ДобавитьСтроку(СтрСообщения + СтрСсылка);
        КонецЦикла;
       
ТекстДок.Записать(КаталогВременныхФайлов() + "Undelete.txt");

    Исключение
       
ЗаписьЖурналаРегистрации("Удаление помеченных объектов.",
           
УровеньЖурналаРегистрации.Информация, , , "Не могу удалить выбранные объекты: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

КонецПроцедуры

Не забывайте важные нюансы:

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

б) запускаться Фоновое задание должно под Полными правами (ну можно ещё сделать Роль "Программист" и наделить её всеми возможными галками);

в) желательно не ограничивать Фоновое Задание временем выполнения, если большая база, то поиск ссылок на удаляемый объект займет большое количество времени.

Пробуйте, ищите и у вас обязательно всё получится.....


Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. V.Nikonov 119 07.08.13 12:25 Сейчас в теме
Однако, не нравится запуск Контроля/Удаления сразу всех Помеченных объектов...
Может реализовать отбор пакетов по N (например 100 объектов)?
2. popro 19.08.13 11:24 Сейчас в теме
я сделал по очереди, мне кажется так удобнее
3. Finder_S 41 17.09.13 16:51 Сейчас в теме
А если ссылка тоже помечена на удаление?
По правильному конечно нужно рекурсией до самого верха добраться и проверить все ссылки и ссылки ссылок на пометку на удаление. Если все помечены, то можно всю ветку удалять.
Но по времени исполнения будет не быстро.
4. buzzzard 51 26.03.14 18:27 Сейчас в теме
(3) Finder_S, мне кажется, если эта зачистка работает по расписанию, то в конце концов любая ветка помеченных объектов удалится. Просто это будет выполнено в несколько проходов. Но по любому это лучше, чем вообще не чистить ;)
5. pyrkin_vanya 376 31.07.14 16:28 Сейчас в теме
Времени нет самому писать. Чувак, выручил. От души )))))))
6. klel 27.01.15 09:34 Сейчас в теме
Большое спасибо за статью, воспользуюсь только наверно переделаю, по отдельному объекту, будет работать в фоне и по ночам
7. s.matyukin_visma 30 31.01.16 21:58 Сейчас в теме
Посмотрел код, вроде грамотно. Универсальность обработки удаления помеченных на удаление не работает пока не удалишь ссылки на регистры сведений. Попробую у себя сделать.
8. ekaterinaeon 28 14.09.16 08:55 Сейчас в теме
:) Спасибо, очень пригодилось!!!
9. WinnerBoy 25.11.16 11:47 Сейчас в теме
Век живи - век учись. Спасибо за статью.
Оставьте свое сообщение

См. также

Хранилище версий объектов в условиях массовых изменений

Чистка базы Конфигурирование 1С v8 1cv8.cf Бесплатно (free)

Проблема хранения версий объектов при огромном количестве изменений.

08.11.2020    594    Punisher_1C    4    

Быстрый способ удаления записей из журнала регистрации 1С

Журнал регистрации Чистка базы v8 Бесплатно (free)

Возникают ситуации, когда необходимо выборочно удалить из журнала регистрации определенные записи. Например, размер файлов журнала неконтролируемо вырос из-за неправильно сконфигурированного регламентного задания. С помощью Perl журнал можно очистить от лишних записей всего одной строкой.

06.08.2020    1858    DataReducer    4    

Подсистема учета характеристик. Стремление к совершенству

Чистка базы Практика программирования v8 v8::ОУ v8::ПВХ УТ10 УУ Бесплатно (free)

Цель - почистить задвоенность характеристик и предотвратить дальнейшее ее появление.

16.12.2019    4163    Rustig    0    

Хранение файлов - как уменьшить размер базы данных

Чистка базы Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Бесплатно (free)

Хранение файлов в базе 1С можно оптимизировать для уменьшения размера хранимых данных.

09.09.2019    8730    2tvad    17    

Удаление записей регистров и пересчет итогов в условиях нехватки места на диске

Чистка базы v8 1cv8.cf Россия Бесплатно (free)

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

17.04.2019    4068    semensemenbi4    8    

Как быстро "удалить все документы и движения" в базе (Альтернатива)

Чистка базы v8 Бесплатно (free)

Очень часто задают вопрос - как удалить все документы из базы, оставить только номенклатуру и настройки. Есть много различных вариантов (групповая обработка документов и справочников - да, работает, но медленно, у клиента в базе 460 000 документов проведенных - неделю будет удалять). Перенос данных - через ВыгрузкаЗагрузкаДанныхXML82.epf - можно, но тоже долго и требует определенных навыков.

06.03.2018    22394    Tatitutu    24    

Реально быстрая очистка документов через SQL

Чистка базы v8 УТ10 Россия Бесплатно (free)

Как делать нельзя, но если очень нужно, то можно!

21.02.2018    8456    Roman_SE    24    

Если при рассылке закончилось место

Чистка базы v8 Россия Бесплатно (free)

С некоторого релиза, не могу сказать точно с какого, при проведении массовой рассылки писем с вложениями стало быстро заканчиваться место. Как я это обнаружил и что с этим сделал, напишу ниже. Очень приветствуются другие варианты решения в комментариях.

23.03.2017    8759    hydro2588_2015    19    

Удаление лишних данных

Чистка базы v8 Бесплатно (free)

Настало то время, когда на SSD винчестерах размером 120 Гб начало заканчиваться место.  В связи с этим, было принято решение проанализиривать возможность уменьшения занимаемого места БД. Без веского обоснования у нас никакие работы не производятся, просто так оптимизацией никто заниматься не даст. 1. Выявление таблиц БД, занимающих много места. 2. Очистка записей регистров накопления. 3. Тестирование.

25.11.2016    14704    HAMMER_59    10    

Версионирование объектов в 1С УПП 1.3. Фикс дублей

Чистка базы Производительность и оптимизация (HighLoad) v8 УПП1 Россия Бесплатно (free)

В 1С УПП 1.3 есть такой замечательный механизм "версионирование объектов", который позволяет узнать: кто, когда и что изменил в документах и справочниках. Но есть недочеты в этой системе, программа не проверяет, является ли текущая записываемая версия объекта дублем (аналогична предыдущей версии), что в итоге захламляет базу и существенно увеличивает её объем.

1 стартмани

16.11.2015    13621    tehas    4    

БГУ 1.0. Чистим отчётность

Чистка базы v8 БГУ Государственные, бюджетные структуры Россия БУ Бесплатно (free)

Временами встречается проблема с заполнением бюджетной (бухгалтерской) отчётности в БГУ 1.0. По разным причинам отчётность может заполняться неправильно или не заполняться совсем. В данной статье приведена методика быстрой «чистки» отчётности.

29.09.2015    16748    Sergey123321    8    

Задвоение элементов плана счетов в базе на SQL.

Чистка базы v8 Бесплатно (free)

Иногда приходится разбираться с "грехами отцов", когда приходишь к клиенту, а до тебя наделали делов. Вот, собственно, проблема: Настраивали когда-то план обмена, все работало штатно. Потом обмен пошел не как надо и в справочниках появились задвоенные предопределенные элементы. В общем, на Инфостарте нашел кучу обработок, которые помогут. Но тут оказалось, что если работать с элементом "ПланСчетов", эти обработки бесполезны.

27.08.2015    8724    vasyalisk88    17    

Как свертывать большую базу 1C 8 в максимально короткие сроки (1С 8.1, 8.2)

Производительность и оптимизация (HighLoad) Чистка базы Свертка базы v8 УТ10 Бесплатно (free)

Как свертывать большую базу 1C 8 в максимально короткие сроки (1С 8.1, 8.2). Любая база данных со временем разрастается до огромных размеров, что делает его более медлительным и работать в нем порой бывает очень тяжело. По этому периодически базу свертывают, т.е. до определенной даты все документы и движения удаляются и вводятся начальные остатки. Соответственно всегда есть архивная база за прошлые периоды. Пример свертки базы 1С на SQL приведен здесь.

14.06.2013    62047    setrak    21    

Шринк лога транзакций MS SQL 2008/2012 в экстренном случае или боремся с ошибкой HRESULT=80040E14

Чистка базы v8 Бесплатно (free)

Пошаговая инструкция по уменьшению лога транзакций (*.ldf) MS SQL 2008/2012.

15.01.2013    301571    Kserken    41