Имя: Пароль:
1C
1С v8
программное удаление записи из РС
0 puasson
 
06.03.13
11:11
Сабж, делаю отбор же, но почему то удаляются все записи! вместо тех, что я выделил обором, что не так в коде??


СписокДокументовБУ - документы записи с которыми нужно удалить


НаборЗаписей = РегистрыСведений.ТакойтоРегистр.СоздатьНаборЗаписей();
       НаборЗаписей.Прочитать();
       
       Для Каждого Стр Из СписокДокументовБУ Цикл
           Если Стр.ДокБУ.ПометкаУдаления = Ложь Тогда
               СписокДокументовБУ.Удалить(Стр);
           КонецЕсли;
       КонецЦикла;
       
       Для каждого стр из СписокДокументовБУ Цикл
           НаборЗаписей.Отбор.ДокументБУ.Установить(Стр.ДокБУ);
           НаборЗаписей.Записать();
       КонецЦикла;
1 Reset
 
06.03.13
11:15
Закоментарить строку НаборЗаписей.Прочитать();

И первый цикл ошибочен, но это уже другой вопрос
2 pessok
 
06.03.13
11:17
вообще не понятно как на стадии первого цикл в превышение индекса не падает... видимо нет помеченных на удаление документов.

по делу - читать надо УЖЕ с отбором
3 Alexaha
 
06.03.13
11:18
(0) сначала делай отбор на те записи ктр надо удалить, потом читай набор , очищай его и записывай
4 Reset
 
06.03.13
11:22
(3) Зачем читать и очищать?
5 puasson
 
06.03.13
11:23
(1) спс бро.


По поводу 1 цикла
по удалению: так параметр строка ТЧ же вот из СП
Параметры:

<Строка> (обязательный)

Тип: СтрокаТаблицыЗначений.
Удаляемая строка таблицы значений.


Я же не по индексу передаю
6 puasson
 
06.03.13
11:25
другое дело что 2 цикла тут вовсе не нужны))) ну это другая история
7 pessok
 
06.03.13
11:26
(5) потому что в цикле так нельзя, ты удаляешь элемент, а потом продолжаешь с него итерировать, а его, как бы, нет.
на вот
v8: Удаление строки из таблицы значений
8 Defender aka LINN
 
06.03.13
11:26
(4) За сервер бабло уплочено. Пусть работает, сцуко железное!
9 cw014
 
06.03.13
11:29
Криво, но все же решение:

Для Каждого Стр Из СписокДокументовБУ Цикл
   Если Стр.ДокБУ.ПометкаУдаления Тогда
       НаборЗаписей = РегистрыСведений.ТакойтоРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДокументБУ.Установить(Стр.ДокБУ);
       НаборЗаписей.Записать();
   КонецЕсли;
КонецЦикла;
10 Мыш
 
06.03.13
11:29
(4) Присоединяюсь к вопросу )
11 Reset
 
06.03.13
11:29
(5) "спс бро."
Это в в каком смысле?

По поводу 1 цикла: Удаление элементов коллекции при обходе коллекции требует явной корректировки индекса "текущего" элемента (что невозможно в цикле foreach) - иначе некотрые значения просто будут в цикле пропущены. Это типичная ошибка начинающих. Нужно или использовать цикл "Для" (начиная с отрицательного счетчика), или "Пока" с самостоятельным изменением счетчика. Или не делать удаление в этом цикле, сохраняя ссылки на нужные элементы во временном массиве, который обходить потом отдельно.
12 Alexaha
 
06.03.13
11:46
(4) (10) да увлекся я ))
13 puasson
 
06.03.13
11:53
(11) то бишь после удаления  iй строки i+1 строка переместится на место iй. и когда цикл шагнет на следующую строчку, он попадет на строку которая была на i+2 месте до удаления. Я так понял??

Прост долго получается. 3 цикла. 1 - найти помеченные на удаление. 2 - удаление собстно. 3 - удаление из регистра.

Не слишком то оптимально. По шустрее возможно сделать??
14 Reset
 
06.03.13
12:03
(13) Не там ишещь оптимальность. Если хочешь оптимальности, избавься от получения пометки удаления через точку в цикле.
15 pessok
 
06.03.13
12:03
(13) я тебе в (7) дал ссылку, как правильно в цикле удалять. издеваешься?
16 puasson
 
06.03.13
12:04
та не, прост удалять вообще не было смысла. сразу проверяем на пометку, и если помечен, то и удаляем запись из регистра. Оптимально же
17 Reset
 
06.03.13
12:06
(16) Можно записать одним циклом, только оптимальности это не особо прибавит
       
Для каждого стр из СписокДокументовБУ Цикл
   Если Стр.ДокБУ.ПометкаУдаления Тогда // вот здесь косяк
       НаборЗаписей.Отбор.ДокументБУ.Установить(Стр.ДокБУ);
       НаборЗаписей.Записать();
   КонецЕсли;
КонецЦикла;
18 puasson
 
06.03.13
12:23
та я просёк твою мыслю, даже если вынесу пометку удаления в колонку, у нескольких доументов значение пометки меняется в процессе работы. И каждый раз при смене значения искать этот дкоумент в таблице и менять значение в колонке с пометкой на удаление? Да ну это тоже оптимальности не прибавит же.



Ресет давай дружить?