Имя: Пароль:
1C
1С v8
Удаление организации
0 Gromov
 
14.08.13
09:50
УТ 11.1 редакции 11.1.1.13. Удаляю организацию, написал обработку, ниже код:

&НаСервере
Процедура ПереборСервер()
    
    МассивМой = Новый Массив;
    МассивМой.Добавить(Объект.СкладИОрганиз);
    ТЗ = НайтиПоСсылкам(МассивМой);
    Для Каждого Стр Из ТЗ Цикл
        Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Стр.Данные)) или Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Стр.Данные)) Тогда
            МетаданныеОбъекта = Стр.Данные.Метаданные();
            Если ТипЗнч(Объект.СкладИОрганиз) = Тип("СправочникСсылка.Организации") и МетаданныеОбъекта.Реквизиты.Найти("Организация")<> Неопределено Тогда
                Если Стр.Данные.Организация = Объект.СкладИОрганиз Тогда
                    Если Стр.Данные.ПометкаУдаления = Ложь Тогда                 
                        ПометкаНауДаление(Стр.Данные);
                    КонецЕсли;
                КонецЕсли;
            Иначе
                Если Стр.Данные.ПометкаУдаления = Ложь Тогда                 
                    ПометкаНауДаление(Стр.Данные);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    //Для Каждого Стр Из Метаданные.Документы Цикл
    //    
    //    Сообщить(Стр);
    //КонецЦикла;
    
КонецПроцедуры // ПереборСервер()


Процедура ПометкаНауДаление (ПолСсылку)
    
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ПолСсылку)) Тогда
        ПолОбъект = ПолСсылку.ПолучитьОбъект();
        ПолОбъект.УстановитьПометкуУдаления(Истина,Истина);
        ПолОбъект.Записать();
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ПолСсылку)) Тогда
        ПолОбъект = ПолСсылку.ПолучитьОбъект();
        МассивМой1 = Новый Массив;
        МассивМой1.Добавить(ПолСсылку);
        ТЗ1 = НайтиПоСсылкам(МассивМой1);                    
        Для Каждого Стр1 Из ТЗ1 Цикл
            Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Стр1.Данные)) Тогда
                Если Стр1.Данные.ПометкаУдаления = Ложь Тогда
                    ПолОбъект1 = Стр1.Данные.ПолучитьОбъект();    
                    ПолОбъект1.УстановитьПометкуУдаления(Истина);                      
                    ПолОбъект1.Записать();
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;                                                              
        Если ТЗ1.Количество() = 0 Тогда
            
            ПолОбъект.УстановитьПометкуУдаления(Истина);
            ПолОбъект.Записать();
            
        КонецЕсли;
    КонецЕсли;    
    
КонецПроцедуры



Проблема в том что есть документы на которые тоже есть ссылки, к примеру "ПеремещениеТоваров" на него ссылается документ "ПриходныйОрдерНаТовары" у которого нет реквизита организация, и для пометки этих документов на удаление я использую "НайтиПоСсылкам" в цикле, что довольно тормозит обработку. Прошу помочь оптимизировать код, или дать какие-нибудь идеи как это сделать, а то на помечение 40 тысяч объектов уходит часов 9-10
1 shuhard
 
14.08.13
09:52
(0) а ёще пришлите мне денег
2 craxx
 
14.08.13
09:54
(0) Оптимизаторы оптимизировали, оптимизировали, да не выоптимизировали.
3 DIvanmgn
 
15.08.13
11:49
(0) сначала собери все ссылки которые нужно пометить на удаление, а потом удаляй
4 DIvanmgn
 
15.08.13
11:49
(3) удаляй = помечай на удаление
5 Kurbash
 
15.08.13
12:33
это гемор страшный-в прошлом году удалял из базы организацию.
Есть два варианта-хороший и плохой, 1.- тупо удалить обработкой в конфигураторе органиизацию и прогнать тестирование и исправление БД, где если ссылок на объект не найдено-удалять объект.
Второй-как в (3)и (4), для облегчения пользуйся обработкой удаления опмеченных объектов с отбором по метаданным, сначала документы, потом справочники.
6 Gromov
 
15.08.13
14:33
Спасибо за помощь всем кто откликнулся, буду пробовать!!!
7 Kreont
 
15.08.13
14:43
(0) а зачем вообще удалять?
Скрой через РЛС (или как получится :) ) и пусть себе будут данные по ней.
8 skunk
 
15.08.13
14:53