Имя: Пароль:
1C
1С v8
Удаление записей из регистра сведений
0 Gossar1C
 
05.08.13
12:47
Здравствуйте. Появилась задача удалять неиспользуемую номенклатуру за 2012 год. Не получается с номенклатурой удалить и записи в регистре ЦеныНоменклатуры, пишет поле объекта не обнаружено Номенклатура, подскажите пожалуйста в чем дело?

&НаСервере
Процедура УдалитьНеиспользуемые()
    
    Для Каждого Элем из Объект.НайденнаяНоменклатура Цикл
        Если Элем.Используется = Ложь Тогда
            УдалитьЦенуНоменклатуры(Элем.Номенклатура);
            ОбъектДляУдаления = Элем.Номенклатура.ПолучитьОбъект();
            ОбъектДляУдаления.Удалить();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Процедура УдалитьЦенуНоменклатуры(НомЦена)
    
    Цены = Неопределено;
    
    Цены = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    Цены.Отбор.Номенклатура.Установить(НомЦена);
    Цены.Прочитать();
    
    Для Каждого ЦеныУд ИЗ Цены Цикл
        Цены.Удалить(ЦеныУд);
    КонецЦикла;
    
    Цены.Записать();
    
КонецПроцедуры
1 Godofsin
 
05.08.13
12:55
на какую строчку ошибка?
2 Gossar1C
 
05.08.13
12:57
(1) Цены.Отбор.Номенклатура.Установить(НомЦена);
3 salvator
 
05.08.13
13:02
(2) А по ней отбор включен?
4 Gossar1C
 
05.08.13
13:03
(2) тоесть?
5 Gossar1C
 
05.08.13
13:04
регистр переодический, подчинение регистратору
6 Gossar1C
 
05.08.13
13:12
=\
7 Maxus43
 
05.08.13
13:13
(5) ну если подчинён регистратору - то отбор возможен только по регистратору
8 Gossar1C
 
05.08.13
13:14
(7) стоп стоп стоп) отбор по регистратору, а по номенклатуре потом как отобрать?
9 Maxus43
 
05.08.13
13:15
(8) выгружай набор в ТЗ, там меняй как надо и загружай в набор обратно
10 Gossar1C
 
05.08.13
13:17
(9) мне по сути этот набор нафиг надо удалить, потому что если я удаляю номенклатуру мне бы и желательно все что связано с этой номенклатурой в регистре тоже удалить
11 Михаил Козлов
 
05.08.13
13:18
(0) Удаление записей из набора не вполне коррктно: нужно удалять строки в документе УстановкаЦенНоменклатуры. Иначе при перепроведении возникнут снова. Да и полностью удалить номенклатуру не удастся, пока есть ссылка в документе установки цен.
12 Vitamax3
 
05.08.13
13:20
А к "Ссылка не найдена" в строках документа как относишься?

(11) Кто сказал что не удастся?
13 m-serg74
 
05.08.13
13:20
(10) распроведи документы УстановкаЦенНоменклатуры за 2012 год и все
14 Maxus43
 
05.08.13
13:21
(10) откуда вобще идея удалить записи из регистра родилась? это ж неправильно, удали из ТЧ документа просто, потом опять его проведи
15 Gossar1C
 
05.08.13
13:22
(13) некоторая номенклатура 2012г использовалась в недавних документах 2013г, следовательно распроводить не вариант
16 m-serg74
 
05.08.13
13:24
(15) на номенклатуру наверное есть не только УстановкаЦенНоменклатуры, но и еще куча всяких документов, поэтому лучший вариант, сделать Папочку типа Неиспользуемая номенклатура и просто перекидывать туда чтоб при набивке документов не мешалась
17 Godofsin
 
05.08.13
13:30
(15) Почему не вариант? Распровел, удалил нужные позиции, провел. В чем проблема?
18 Gossar1C
 
05.08.13
13:32
(16) вариант уже превысел более 50000 позиций)
19 George Wheels
 
05.08.13
13:32
(17) А что делать со средней ценой (если она используется конечно)?
20 Gossar1C
 
05.08.13
13:33
(17) буду пробовать сейчас так делать, просто когда мы по прайсу заливали номенклатуру то почему то установка цен не проводилась хотя программно установлена
21 Maxus43
 
05.08.13
13:33
(18) документ надо менять всё равно, зачем тебе там в итоге битые ссылки? удаляй записи из документа сначала
22 Godofsin
 
05.08.13
13:35
(19) хз, ни о какой средней цене автор не упоминал. Даже конфы не знаем, но предполагаю, что УТ. А чо там за средняя цена?
23 Godofsin
 
05.08.13
13:36
(18) Да и пох... Можно ваще сделать эту папку не видимой
24 Gossar1C
 
05.08.13
13:39
(23) у нас стал очень сильно зависать полнотекстовый поиск, даже обновление индекса каждый 5 минут по регламентному не очень помогает
25 George Wheels
 
05.08.13
13:45
(22) Туплю. Был в другой теме про регистр бухгалтерии.
26 m-serg74
 
05.08.13
13:50
(24) а зачем вам полнотекстовый поиск?
27 Godofsin
 
05.08.13
13:50
(24) Короче, самый верный способ - удалять позиции из документов и проводить доки.
28 Сти
 
05.08.13
13:50
(8) а потом только проверку...
Кстати, в "для каждого" удалять нельзя - куча строк может быть пропущена.

СЗ = Новый СписокЗначений;
Для Каждого ЦеныУд ИЗ Цены Цикл
  Если ЦеныУд.Номенклатура = НомЦена Тогда
   СЗ.Добавить(ЦеныУд);
  КонецЕсли;
КонецЦикла;

Для каждого Стр из СЗ Цикл
  Цены.Удалить(СЗ.Значение);
КонецЦикла;


Но напрямую удалять записи из регистра, подчиненного регистратору все же как-то не так как-то...
29 m-serg74
 
05.08.13
13:50
(27) из всех видов доков, закрытом периоде, супер)))
30 Gossar1C
 
05.08.13
13:56
кароч делаю так)

&НаСервере
Процедура УдалитьНеиспользуемые()
    
    Для Каждого Элем из Объект.НайденнаяНоменклатура Цикл
        Если Элем.Используется = Ложь Тогда
            УдалитьЦенуНоменклатуры(Элем.Номенклатура);
            ОбъектДляУдаления = Элем.Номенклатура.ПолучитьОбъект();
            ОбъектДляУдаления.Удалить();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Процедура УдалитьЦенуНоменклатуры(НомЦена)
    
    Результат = Неопределено;
    
    ЗапросЦена = Новый Запрос;
    ЗапросЦена.УстановитьПараметр("Номенклатура",НомЦена);
    ЗапросЦена.Текст =  
    "ВЫБРАТЬ
    |    УстановкаЦенНоменклатуры.Ссылка
    |ИЗ
    |    Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры
    |ГДЕ
    |    &Номенклатура В (УстановкаЦенНоменклатуры.Товары.Номенклатура)";
    
    Результат = ЗапросЦена.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        ДокументУстановкиЦен = Результат.Ссылка.ПолучитьОбъект();
        Для Каждого Элем ИЗ ДокументУстановкиЦен.Товары Цикл
            Если Элем.Номенклатура = НомЦена Тогда
                ДокументУстановкиЦен.Товары.Удалить(Элем);
            КонецЕсли;
        КонецЦикла;
        ДокументУстановкиЦен.Записать(РежимЗаписиДокумента.Проведение);
    КонецЦикла;
    
    
КонецПроцедуры


незнаю что получится =\
31 Сти
 
05.08.13
13:56
(24) Если так уж надо почистить справочник номенклатуры, без мульона "объект не найден", лучше создать справочник НенужнаяНоменклатура, куда скопировать данные ненужных позиций из Номенклатуры, выкрутить из древней обработки с ИТС "Поиск и замена значений" куски кода в свою обработку, которая тихо и мирно (но медленно) перепропишет все ненужное на новый справочник и удалит номенклатуру из живого справочника.
32 Godofsin
 
05.08.13
13:59
(29) Сомневаюсь, что они там чо то закрывают в УТ
33 Godofsin
 
05.08.13
13:59
(30) Главное не забудь, что тестировать надо на рабочей базе
34 m-serg74
 
05.08.13
14:01
(32) т.е. долги с покупателями не нужно считать?
35 Godofsin
 
05.08.13
14:03
(34) Если только задеты будут торговые операции. Но тогда и удалять нельзя элемент. А установка цен номенклатуры как влияет на взаиморасчеты?
36 m-serg74
 
05.08.13
14:04
(35) а что 50000 номенклатуры в справочнике и по ней ни одной реализации, поступления, перемещения???
37 m-serg74
 
05.08.13
14:05
(33) [Главное не забудь, что тестировать надо на рабочей базе]
))) Это злая шутка? или хотел сказать на копии?
38 Сти
 
05.08.13
14:07
(30) Еще раз: внутри "Для каждого" удалять нельзя - меняются индексы, и следующая после удаленной строка будет пропущена при обходе цикла. Хорошо, в этом документе удаляемая номенклатура будет встречаться скорее всего один раз, так что это будет незаметно, но вообще - это неправильно.
Кстати, согласно приведенному коду один и тот же документ может открывать и перепроводиться хз сколько раз, раз бежим по номенклатуре, а не по докам... Время некритично, наверное?
39 m-serg74
 
05.08.13
14:08
(38) а ху.и думать прыгать надо)))
40 Gossar1C
 
05.08.13
14:14
(38) в течении недели успею) да таки так неправильно, но это я по быстрому накатал код =\
41 Vitamax3
 
05.08.13
14:16
(0) Есть такой древний обряд - обрезание.
Используем периодически для больших баз.
42 m-serg74
 
05.08.13
14:17
(40) так что кроме установки цен, других доков по этой номенклатуре нету?
43 m-serg74
 
05.08.13
14:17
(41) каждый год что ли?
44 Gossar1C
 
05.08.13
14:18
(41) свертку не разрешили)
45 Gossar1C
 
05.08.13
14:19
(42) насколько знаю нету, ну кроме индивидуального набора упаковок
46 m-serg74
 
05.08.13
14:20
а ну тогда никаких трудностей, установки почистить и перепровести, а потом грохнуть номенклатуру, только с проверкой на существование ссылок все таки лучше
47 Vitamax3
 
05.08.13
14:26
(43) Как только >"22".
Примерно раз в три года.

(46) Лучше сначала проверить: есть ли доки кроме установки цены, а то всё будет зря ((
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн