Имя: Пароль:
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
та я просёк твою мыслю, даже если вынесу пометку удаления в колонку, у нескольких доументов значение пометки меняется в процессе работы. И каждый раз при смене значения искать этот дкоумент в таблице и менять значение в колонке с пометкой на удаление? Да ну это тоже оптимальности не прибавит же.



Ресет давай дружить?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn