Найти элементы справочника, на которые нет ссылок

  1. 10 г. назад

    Я вижу только один вариант - перебор всех элементов и поиск ссылок НайтиПоСсылкам(...). ООООчень медленно. Есть другие варианты?

  2. а что за справочник?

  3. Номенклатура, база нетленка.

    Ответы: (6)
  4. Перебор то зачем?
    НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
    !!!СписокСсылок!!!

    Ответы: (4)
  5. (3) и я найду всю номенклатуру, у которой есть ссылки. Мне надо наоборот

    Ответы: (5)
  6. (4) ну и вычтите одно множество из другого

    Ответы: (7)
  7. (2) ну, тогда кол-во реквизитов, где можно встретить значения данного типа, наверняка конечно.
    перебираешь все доки и справочники, составляешь список используемых значений, а дальше тривиально

  8. Возвращаемое значение:
    Тип: ТаблицаЗначений.
    Возвращает ссылки на найденные объекты в виде ТаблицаЗначений.
    Загоняешь потом в запрос и делаешь (5)

    Ответы: (9)
  9. запрос ?

  10. Fynjy Возвращает ссылки на найденные объекты в виде ТаблицаЗначений.

    ему вернёт список объектов, где встречаются заданные ссылки. но ему не это надо

    Ответы: (11)
  11. так, стоп. я слепошарый, думал, речь про 7-ку, а тут 8-ка

  12. (9) Ну и - есть массив элементов с ссылками - Выбрать Ссылка Из Справочник Где Ссылка Не В &Список

  13. там неправильно делалась загрузка, каждый раз создавались новые элементы. Я их уже исправил, теперь на каждую правильную номенклатуру приходится по 300 неправильных, без ссылок. В общей сложности сейчас несколько сот тысяч номенклатуры. Если их все подсунуть в НайтиПоСсылкам(), то можно на несколько дней пойти чай пить, я думаю

    Ответы: (14)
  14. Манагеры сделали просто - пометили всю номенклатуру на удаление, а потом сделали удаление. :)

    Ответы: (15) (16)
  15. (12) Да ну - если база SQL - минут на 5 покурить ...

  16. (13) Я тоже так иногда делаю )

  17. (13) ну, вот тоже вариант. попробовать чтоли

    Ответы: (17) (20)
  18. (16) что там пробовать, вариант рабочий.

  19. 943 802 номенклатуры

    Ответы: (22)
  20. + только потом прогнать Поиск и удаление задвоенных элементов.
    Можно с ИТС, можно и поискать,
    link text

  21. (16)самый простой вариант )
    если тебе реально нужны ссылки, то делаешь копию, удаляешь, сравниваешь

    Ответы: (39)
  22. твой справочник полное соединение с тем, где должен быть реквизит
    с условием is null

    Ответы: (23)
  23. (18) Группами номенклатуры удаляй последовательно, иначе может мозгов на сервере не хватить.

  24. zak555 полное соединение с тем, где должен быть реквизит

    видов доков может быть очень много

    Ответы: (28)
  25. не удаляй штатной обработкой, будешь неделю удалять

    Ответы: (25)
  26. (24) есть нештатная с контролем ссылочной целостности?

    Ответы: (26)
  27. (25) есть.

  28. +
    http://its.1c.ru/db/metod8dev/content/1648/hdoc/_top/удаление объектов
    Универсальная обработка "Удаление помеченных объектов" предназначена для удаления помеченных объектов информационной базы без установки монопольного режима работы с инфомационной базой.

    Обработка УдалениеПомеченныхОбъектов.epf находится в каталоге \1CITS\EXE\ExtReps\Unireps81\DeleteMarkedObjects\

    ВЫ МОЖЕТЕ ПРЯМО СЕЙЧАС СКОПИРОВАТЬ ОБРАБОТКУ
    НА ЖЕСТКИЙ ДИСК ВАШЕГО КОМПЬЮТЕРА

    Ответы: (41)
  29. (23) ты про количество ?

    Ответы: (31)
  30. ++ реальная обработка. там, где раньше штатная удаляла целый день данные и сваливалась с дампом, эта - удаляет за 20 минут.
    с контролем ссылочной целостности, разумеется

  31. я только помечать их час буду

    Ответы: (33)
  32. (28) про виды

    Ответы: (32)
  33. (31) это когда в одном реквизите больше одного значения ?

  34. (30)а что там помечать, вручную чтоле будешь?

    вот код, который удаляет ВСЕ организации и связанные с ними объекты, кроме одной организации на форме обработки:

    Процедура КнопкаВыполнитьНажатие(Кнопка)
        // Вставить содержимое обработчика.
        
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |	Организации.Ссылка
        |ИЗ
        |	Справочник.Организации КАК Организации
        |ГДЕ
        |	Организации.ссылка <> &орг
        |
        |УПОРЯДОЧИТЬ ПО
        |	Организации.Наименование";
        Запрос.УстановитьПараметр("орг",орг);
        
        Выборка = Запрос.Выполнить().Выбрать();
        Всего = Выборка.Количество();
        
        счетчик = 1;
        Пока Выборка.Следующий() цикл
            
            Состояние(Строка(Счетчик)+"/"+Строка(Всего)+" - "+Строка(выборка.ссылка));
            ОбработкаПрерыванияПользователя();
            массив = Новый Массив;
            Массив.Добавить(Выборка.Ссылка);
            //
            ТЗССылок = НайтиПоСсылкам(Массив);
            Сообщить("Начало"+Строка(текущаяДата()));
            ПомеченоДокументов = 0;
            ПомеченоСправочников = 0;
            Для каждого СтрокаСсылки ИЗ ТЗСсылок цикл
                
                Попытка
                    //справочник
                    Наим = СТрокаСсылки.Данные.Наименование;
                    Если НЕ СТрокаСсылки.Данные.пометкаУдаления Тогда
                        Объект = СТрокаСсылки.Данные.ПолучитьОбъект();
                        Объект.ПометкаУдаления = Истина;
                        Объект.ОбменДанными.Загрузка = ИСТИНА;
                        Объект.Записать();
                        ПомеченоСправочников = ПомеченоСправочников + 1;
                    КонецЕсли;
                    Продолжить;
                Исключение
                КонецПопытки;
                
                Попытка
                    //документ
                    Наим = СТрокаСсылки.Данные.Дата;
                    Если НЕ СТрокаСсылки.Данные.пометкаУдаления Тогда
                        Объект = СТрокаСсылки.Данные.ПолучитьОбъект();
                        Объект.ПометкаУдаления = Истина;
                        Если СТрокаСсылки.Метаданные.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить  Тогда //например, для доков Регл отчет движения запрещены
                            Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
                        Иначе
                            Объект.записать();
                        КОнецЕсли;
                        
                        ПомеченоДокументов = ПомеченоДокументов + 1;
                    КонецЕсли;
                    Продолжить;
                Исключение
                КонецПопытки;
                
                
            КонецЦикла;
            
            Сообщить(Строка(выборка.ссылка)+ " найденных объектов:"+Строка(ТЗСсылок.Количество())+" из них помечено справочников: "+Строка(ПОмеченоСправочников)+" помечено документов: "+Строка(ПомеченоДокументов));
            Сообщить("Окончание"+Строка(текущаяДата()));
            
            счетчик = счетчик + 1;
            
            обр=Справочники.ВнешниеОбработки.НайтиПоНаименованию("Удаление помеченных объектов");
            ИмяФайла = ПолучитьИмяВременногоФайла();
            ДвоичныеДанные = обр.ХранилищеВнешнейОбработки.Получить();
            ДвоичныеДанные.Записать(ИмяФайла);
            Обработка =  внешниеобработки.Создать(ИмяФайла,ЛОЖЬ);
            Форма = Обработка.ПолучитьФорму();
            Форма.Открыть();
            Форма.закрыть();
            Сообщить("Удаление завершено");
            
            
            
        КонецЦикла;
    КонецПроцедуры
    
    Ответы: (34) (36)
  35. (33) А что делать с неподчинеными РС? Ну типа настройки пользователя

    Ответы: (35)
  36. (34) их немного, их можно удалить руками

  37. (33) Долго-долго фигачит:

    НачатьТранзакцию();
    
    НомерЗаписи = 0;
    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий()  Цикл
        Если Не Выборка.ПометкаУдаления Тогда
            СправочникОбъект = Выборка.ПолучитьОбъект();
            СправочникОбъект.ПометкаУдаления = Истина;
            СправочникОбъект.Записать();
            НомерЗаписи = НомерЗаписи + 1;
            Если НомерЗаписи % ЗаписейВтранзакции = 0 Тогда
                Состояние("""" + НомерЗаписи);
                ЗафиксироватьТранзакцию();
                НачатьТранзакцию();
            КонецЕсли
        КонецЕсли;
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();
    
    Ответы: (39) (43)
  38. А зачем в транзакции? Если вылетит, запустишь еще раз

    Ответы: (38)
  39. (37) чтобы быстрее

  40. (36) правильный ответ в (20), моментом выдаст. Обычный select с условием на null, не мудри.

    Ответы: (40)
  41. (39) дык, я так и делаю же

  42. (27) у меня штатная быстрее фигачит

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

  44. (36)Типовая?
    ОбменДанными.Загрузка = Истина нужно было поставить

    Ответы: (44)
  45. (43) нетленка. нет смысла в этом

  46. пол дня удаляю элементы. удалил 300 000, осталось 700 000

или зарегистрируйтесь чтобы ответить!