7.7 Очистка справочника номенклатура от неиспользуемых элементов

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем GuitaristNSK, 13 дек 2011.

  1. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    http://disk.tom.ru/x7l86xb
    вот пример...
    Пометит на удаление элементы группы, у которой дата создания меньше выбранной.
    Иные подчиненные справочники не тронет - делайте сами.

    Мне все-таки кажется что вы напрасно тратите время. Здесь нужен иной подход.
    На те элементы, которые будут помечены на удаление наверняка есть ссылки в документах (если вы не сворачивали базу).
    Как следствие - 1с удалить их не даст.
    Если вы попытаетесь удалить их программно - база рухнет.
  2. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Остановился на таком варианте:
    Код:
    Процедура Сформировать()
       
        Номенклатура=СоздатьОбъект("Справочник.Номенклатура");
        Связи = СоздатьОБъект("Справочник.Связи");
       
        НачатьТранзакцию(); // существенное ускорение на больших объемах справочников и документов.
       
        Номенклатура.ВыбратьЭлементы();
        Пока Номенклатура.ПолучитьЭлемент()=1 Цикл
           
            Если Номенклатура.ПринадлежитГруппе(ВыбРодитель)=0 Тогда // "ВыбРодитель" - элемент экранной формы, 
                Продолжить;
            КонецЕсли;
           Состояние("Обработка номенклатуры - "+ Номенклатура.Наименование);
            Если Номенклатура.ЭтоГруппа()=1 Тогда
                Продолжить;
            КонецЕсли;
            Связи.ИспользоватьВладельца(Номенклатура.ТекущийЭлемент());
            Связи.ВыбратьЭлементы();
            Пока Связи.ПолучитьЭлемент()=1 Цикл 
                Если Связи.ДатаСоздания>=ВыбДатаСоздания Тогда // "ВыбДатаСоздания" - реквизит экранной формы
                          Продолжить;
                КонецЕсли;
                Если Связи.ЭтоГруппа()=1 Тогда
                    Продолжить;
                Иначе
                   Номенклатура.Удалить(0);
                КонецЕсли;
            КонецЦикла;
        Конеццикла;
       
        ЗафиксироватьТранзакцию();
    КонецПроцедуры
    
    Свертку базы делали недавно, так что обойдемся стандартной обработкой на целостность. Но подсказали вариант с проверкой связей:
    Код:
    Связи.ИспользоватьВладельца(Номенклатура.ТекущийЭлемент());
            УдаляемыеСвязи = 0;
            ОставляемыеСвязи = 0;
            Связи.ВыбратьЭлементы();
            Пока Связи.ПолучитьЭлемент()=1 Цикл 
                Если Связи.ДатаСоздания>=ВыбДатаСоздания Тогда // "ВыбДатаСоздания" - реквизит экранной формы
                          Продолжить;
                КонецЕсли;
                Если Связи.ЭтоГруппа()=1 Тогда
                    ОставляемыеСвязи = ОставляемыеСвязи+1;
                    Продолжить;
                 Иначе
                    Связи.Удалить(0);
                    УдаляемыеСвязи = УдаляемыеСвязи+1;
                 КонецЦикла;
              
                 Если (ОставляемыеСвязи=0) и (УдаляемыеСвязи>0) Тогда
                        Номенклатура.Удалить(0);
                  КонецЕсли;
            КонецЦикла
    
  3. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    1)В выложенной мною обработке код намного короче и быстрее отрабатывает
    2)Вы рассмотрели только подчиненный справочник связей... А остальные так и будут болтаться? Цены, НоменклатураВСловаре и т.д