# Форум 1С > Общие вопросы по 1С - Предприятие > 1С - Предприятие 7.7 >  Чистка справочника "Номенклатура"

## koka278

Здравствуйте, суть проблемы в следующем. База стала избыточной и тянет за собой кучу устаревших и снятых с производства позиций. Нужно ее почистить, как вариант я предполагаю только отобрать из базы по заданным критериям устаревшие позиции и удалить. Из атрибутов есть артикул код позиции (S*******), код группы товаров (S*******) или ее название и дата создания позиции в справочнике "Прайсы поставщиков". 
На псевдокоде представляю примерно так:

ВЫБРАТЬ ИЗ Справочник.Номенклатура ГДЕ 
Группа такая-то && ДатаСоздания.Справочник.Пр айсы Поставщиков < Даты такой то
ИЛИ Группа такая-то и свои условия
Дать команду на удаление


Или в цикле по коду перебрать все позиции и по условию удалять или оставлять.


Сильно не бейте, человек я вообще далекий от 1С но задание дали, подскажите хотя бы в каком направление копать

----------


## arccos6pi

если на эти позиции есть ссылки,то вы их не удалите

----------


## koka278

Цель - пометить позиции на удаление, и потом стандартной обработкой с проверкой целостности базы удалить

----------


## arccos6pi

> Цель - пометить позиции на удаление, и потом стандартной обработкой с проверкой целостности базы удалить


тогда мой совет - помечайте всю номенклатуру и удаляйте стандартной обработкой

```
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
	Ном = Выборка.ПолучитьОбъект();
	Ном.ПометкаУдаления = Истина
	Попытка
		Ном.Записать();
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецЦикла;
```

как-то так..

----------


## arccos6pi

пардон,это 7.7..,а я для 8.Х написал
хотя я думаю смысл понятен

----------


## koka278

Примерно так получилось, только не срабатывает условие из запроса о дате создания, т.е. выбираются позиции не младше определенной даты, а все позиции. Подскажите как решить


```
//*******************************************
Процедура Сформировать() 

   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса = 
   "//{{ЗАПРОС(Сформировать)
   |Номенклатура = Справочник.Связи.Владелец;
   |ТекущийЭлемент = Справочник.Связи.ТекущийЭлемент;
   |ДатаСоздания = Справочник.Связи.ДатаСоздания;
   |Группировка Номенклатура;
   |Группировка ТекущийЭлемент;
   |Группировка ДатаСоздания;
   |Условие(ДатаСоздания<ВыбДатаСоздания);
   |"//}}ЗАПРОС
   ;
// Если ошибка в запросе, то выход из процедуры

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
   КонецЕсли; 



// Подготовка к заполнению выходных форм данными запроса

   Таб = СоздатьОбъект("ТаблицаЗначений");
   Запрос.Выгрузить(Таб);

   Спр=СоздатьОбъект("Справочник.Номенклатура");

//Перебор элементов группы
   Спр.НайтиПоКоду("a0000001");
   a0000001=Спр.ТекущийЭлемент();
   Спр.ИспользоватьРодителя(a0000001);
   Спр.ВыбратьЭлементы();


   Пока Спр.ПолучитьЭлемент()=1 Цикл
      Если Спр.ЭтоГруппа()=1 Тогда
         Продолжить;
      КонецЕсли;

     Спр.Удалить(1);
   КонецЦикла; 

КонецПроцедуры
```

----------


## Alex_7_7_7

Проще перебрать в цикле все элементы справочника с проверкой условия. Если условие выполняется - удалить.

----------


## koka278

> Проще перебрать в цикле все элементы справочника с проверкой условия. Если условие выполняется - удалить.


Дело в том, что удалить нужно по полю ДатаСоздания, а его нет в Номенклатуре, поэтому запрос приходится делать

----------


## Alex_7_7_7

Свяжи со справочником, где это поле есть и перебирай.

----------


## koka278

> Свяжи со справочником, где это поле есть и перебирай.


Еще загвоздка, что дата не одна, а для разных групп своя. Есть такой вариант, но он игнорирует дату и удаляет всю группу


```
Процедура Сформировать()

   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Номенклатура= Справочник.Связи.Владелец;
   |ДатаСоздания = Справочник.Связи.ДатаСоздания;
   |Группировка Номенклатура;
   |Условие(ДатаСоздания<ВыбДатаСоздания);
   |Без Итогов;
   |";
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
    КонецЕсли;
   Спр = СоздатьОбъект("Справочник.Номенклатура"); 
   
   Пока Запрос.Группировка()=1 Цикл  

        Если Спр.НайтиЭлемент(Запрос.Номенклатура)=1 Тогда
            Если Спр.ПринадлежитГруппе(выбРодитель)=1 Тогда 
              Спр.Удалить(0);
            КонецЕсли;
        КонецЕсли;
   КонецЦикла;
КонецПроцедуры
```

----------


## Alex_7_7_7

1. Какая у Вас версия базы? (DBF или SQL)?
2. Как у Вас связаны номенклатура и поле ДатаСоздания?

----------

