PDA

Просмотр полной версии : Чистка справочника "Номенклатура"



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

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


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


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

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

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

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

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

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

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

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

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

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



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

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

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

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


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

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

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

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

koka278
13.05.2014, 11:40
Проще перебрать в цикле все элементы справочника с проверкой условия. Если условие выполняется - удалить.
Дело в том, что удалить нужно по полю ДатаСоздания, а его нет в Номенклатуре, поэтому запрос приходится делать

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

koka278
13.05.2014, 11:50
Свяжи со справочником, где это поле есть и перебирай.
Еще загвоздка, что дата не одна, а для разных групп своя. Есть такой вариант, но он игнорирует дату и удаляет всю группу

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

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

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

Пока Запрос.Группировка()=1 Цикл

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

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