HighLoad ›
Удаление данных с отбором и построением дерева ссылок в базах 1С 8.1-8.3 УТ 10.3./11, БП 2/3, ЗУП 2.5/3, КА 1.1/2, УНФ 1.6/3.0 ›
#25
09.05.13 13:45
Поправил, для файловой версии работает. Ошибка в Ссылке(22) fuser,
Процедура ОсновнаяПанельУдалитьОбъекты(Кнопка)
Если ПоказатьВопросСНастройками() Тогда
Возврат;
КонецЕсли;
ВсегоУдалено=0;
ТекВРемя=ТекущаяДата();
Сообщить(Строка(ТекущаяДата())+" Начат процесс удаления выбранных объектов...");
Если ВыполнятьВТранзакции Тогда
НачатьТранзакцию();
КонецЕсли;
Для каждого Стр Из ДеревоОбъектов.Строки Цикл
Для каждого СтрокаДерево Из Стр.Строки Цикл
Если СтрокаДерево.Пометка И СтрокаДерево.Родитель<>Неопределено Тогда
ОбработкаПрерыванияПользователя();
ИмяОбъекта=СтрокаДерево.ИмяОбъекта;
ИмяСКД=СтрокаДерево.ИмяДляСКД;
ПолноеИмя=СтрокаДерево.Тип+"."+ИмяОбъекта;
НайденныеСсылки=Новый ТаблицаЗначений;
Если ПолностьюОчищатьРегистрыСведений И Найти(ПолноеИмя,"РегистрСведений")>0 Тогда
Набор=РегистрыСведений[ИмяОбъекта].СоздатьНаборЗаписей();
попытка
Набор.Записать();
Исключение КонецПопытки;
Сообщить(Строка(ТекущаяДата())+" Обработан "+ПолноеИмя);
Продолжить;
КонецЕсли;
ТЗ=СформироватьТЗпоСКД(СтруктураСКД[ИмяСКД]);
Сообщить(Строка(ТекущаяДата())+" Отобрано объектов: "+Строка(ТЗ.Количество())+" "+ПолноеИмя+" Удаление...");
Если Найти(ПолноеИмя,"РегистрСведений")>0 Тогда
ОчиститьРегистрСведений(ТЗ,ПолноеИмя);
Сообщить(Строка(ТекущаяДата())+" Обработан "+ПолноеИмя);
Продолжить;
КонецЕсли;
Если ПроверкаСсылочности Тогда
попытка
НайденныеСсылки=НайтиПоСсылкам(ТЗ.ВыгрузитьКолонку("Ref"));
Исключение КонецПопытки;
КонецЕсли;
Кол=0;
Удалено=0;
Если ОчищатьСсылки ИЛИ ОчищатьСвязанныеРегистрыСведений Тогда
Попытка
МассивСсылок=ТЗ.ВыгрузитьКолонку("Ref");
Исключение КонецПопытки;
ФлагОчистки=ОчиститьСсылки(МассивСсылок);
Если НЕ ФлагОчистки Тогда
Сообщить(Строка(ТекущаяДата())+" Процесс удаления прерван из-за ошибки очистки реквизитов!");
Продолжить;
КонецЕсли;
КонецЕсли;
Попытка
Для каждого СтрокаТЗ Из ТЗ Цикл
ОбработкаПрерыванияПользователя();
Кол=Кол+1;
Если ПроверкаСсылочности Тогда
Отбор=Новый Структура("Ссылка",СтрокаТЗ.Ref);
КолСсылок=НайденныеСсылки.НайтиСтроки(Отбор).Количество();
Отбор=Новый Структура("Данные",СтрокаТЗ.Ref);
КолСсылок=КолСсылок-НайденныеСсылки.НайтиСтроки(Отбор).Количество();
Если КолСсылок=0 Тогда
УдалитьВыбранныеОбъекты(СтрокаТЗ.Ref);
Удалено=Удалено+1;
ВсегоУдалено=ВсегоУдалено+1;
КонецЕсли;
Иначе
УдалитьВыбранныеОбъекты(СтрокаТЗ.Ref);
Удалено=Удалено+1;
ВсегоУдалено=ВсегоУдалено+1;
КонецЕсли;
Состояние("Обработано "+Строка(Кол)+" из "+Строка(ТЗ.Количество())+" Удалено: "+Строка(Удалено));
КонецЦикла;
Сообщить(Строка(ТекущаяДата())+" Обработан "+ПолноеИмя+" Удалено: "+Строка(Удалено));
Исключение
Сообщить(ИнформацияОбОшибке().Описание);
Если ВыполнятьВТранзакции Тогда
ОтменитьТранзакцию();
КонецЕсли;
Возврат;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ВыполнятьВТранзакции Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Сообщить(Строка(ТекущаяДата())+" Процесс удаления завершен! Всего удалено объектов: "+Строка(ВсегоУдалено)+" Затраченное время: "+ОпределитьВремяРег(ТекВРемя));
КонецПроцедуры