Имя: Пароль:
1C
1С v8
Удаление ненужных элементов номенклатуры
0 eazarkin
 
19.11.12
11:41
Доброе время суток
Возникла необхождимость почистить справочник номенклатуры от элементов на которые нет ссылок ни в одном документе.
Написал несложный код.
<code>
   МассивСсылок = Новый Массив;
   Отбор = Новый Структура("ЭтоГруппа");
   Отбор.ЭтоГруппа = Ложь;
   Выборка = Справочники.Номенклатура.Выбрать(,,Отбор,);        
   Пока Выборка.Следующий() Цикл
       ЕстьДокументы = Ложь;
       МассивСсылок.Добавить (Выборка.Ссылка);
       ТабСсылок = НайтиПоСсылкам(МассивСсылок);
       Для каждого СтрокаТабСсылок Из ТабСсылок Цикл
           Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрокаТабСсылок.Данные)) Тогда
               ЕстьДокументы = Истина;
               Прервать;    
           КонецЕсли;                
       КонецЦикла;
       Если НЕ ЕстьДокументы Тогда
           ЭлементСправочника = Выборка.Ссылка.ПолучитьОбъект() ;
           ЭлементСправочника.УстановитьПометкуУдаления(Истина,Истина);
           Сообщить (Выборка.Ссылка);
       КонецЕсли;
       МассивСсылок.Очистить();
   КонецЦикла;
</code>
Проблема: уж очень медленно работает.
Хотелось бы решить задачу в соответствии с рекомендациями 1с , а именно убрать запрос в цикле. Есть идеи ?
1 vmv
 
19.11.12
11:43
ТабСсылок = НайтиПоСсылкам(МассивСсылок);

это в цикле и очень тяжелое

Погугли типовое обработки и не лепи самокат, хотя гарантии, что там быстрее нет
2 Нуф-Нуф
 
19.11.12
11:44
запросом получи массив номенклатуры и сунь один раз в НайтиПоСсылкам
3 Нуф-Нуф
 
19.11.12
11:44
а потом уже перебирай ТабСсылок и удаляй необходимое
4 floody
 
19.11.12
11:50
пометить все, удалить помеченные, разметить все.. ну.. вы поняли
5 НЕА123
 
19.11.12
11:57
>        МассивСсылок.Добавить (Выборка.Ссылка);
>        ТабСсылок = НайтиПоСсылкам(МассивСсылок);

это в цикле!? или я брежу?
6 НЕА123
 
19.11.12
11:58
(5)+ а, есть оказывается
>МассивСсылок.Очистить();
7 НЕА123
 
19.11.12
12:02
присоединяюсь к (4).
8 Balabass
 
19.11.12
12:02
Шаг первый - пометить всю номенклатуру на удаление.
шаг второй - сделать удаление всех помеченных объектов
шаг третий - снять пометку удаления с номенклатуры
шаг четвертый - профит
9 Balabass
 
19.11.12
12:02
млять..на увидел (4) (((
10 sidalexsandr
 
19.11.12
12:25
УдалитьОбъекты (DeleteObjects)  

Синтаксис:  

УдалитьОбъекты(<Список ссылок>, <Найденные данные>, <Проверять>)  

Параметры:  

<Список ссылок> обязательный  

Тип: Массив. Список ссылок на объекты, которые нужно удалить.  

<Найденные данные> необязательный  

Тип: ТаблицаЗначений. Таблица значений, в которую помещаются найденные ссылки на объект, содержит колонки с индексами:  

    0 - искомая ссылка;  

    1 - ссылка на объект, который содержит искомую ссылку;  

    2 - объект метаданных, которому соответствуют данные, в которых найдена ссылка.  

<Проверять> необязательный  

Тип: Булево. Параметр определяет, выполнять ли контроль ссылочной целостности при выполнении процедуры. Истина - перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <Найденные данные>. Ложь - проверка не выполняется.  

Значение по умолчанию: Ложь.  

Описание:  

Удаляет объекты.  

// удаление помеченных объектов с контролем ссылочной целостности  

Помеченные = НайтиПомеченныеНаУдаление();  

Найденные = 0;  

УдалитьОбъекты(Помеченные,Найденные, Истина);  

Для Каждого Ссылка Из Найденные Цикл  

   СтрНеУдален = "Объект не удален:" + Сокр(Ссылка(0));  

   СтрСсылка = ", используется в " + Сокр(Ссылка(1));  

   Сообщить (СтрНеУдален + СтрСсылка);  

КонецЦикла ;
11 Klesk
 
19.11.12
12:28
(4) еще запомнить те, которые были помечены, и после удаления еще раз пометить их
12 floody
 
19.11.12
12:31
(11) не надо их запоминать, а просто инвертировать пометку, потом обратно
13 Нуф-Нуф
 
19.11.12
12:31
(12) а что делать с помеченными ранее?
14 floody
 
19.11.12
12:32
ну хотя да, прав