Имя: Пароль:
1C
1С v8
Удаление проводок в цикле, удаление из коллекции.
, ,
0 12345Kostya
 
13.05.13
14:18
Для каждого ЗначПроводки Из Проводки Цикл
   Если ЗначПроводки.СчетКт=Счет10111 Тогда
   НайденнаяСтрока = ТаблЗначений.Найти(ЗначПроводки.СубконтоКт.Номенклатура);
   Если НайденнаяСтрока = Неопределено Тогда
       НоваяСтрока = ТаблЗначений.Добавить();
       НоваяСтрока.Номенклатура = ЗначПроводки.СубконтоКт.Номенклатура;
       Проводки.Удалить(ЗначПроводки);
       Проводки.Записать();
       КонецЕсли;
   КонецЕсли;    

КонецЦикла;

Получается что при каждом удалении проводки обход уменьшается на единицу, а как быть иначе?
1 Лефмихалыч
 
13.05.13
14:20
(0) два варианта:
1. Удалять в обратном порядке
2. Выгрузить в ТЗ, в обходе по строкам в массив запомнить строки (не номера, а именно строки), потом в обходе массива грохнуть строки и загрузить все, что останется в набор
2 Лефмихалыч
 
13.05.13
14:20
и третий вариант - запросом выбрать только нужные проводки и заменить ими набор записей
3 Defender aka LINN
 
13.05.13
14:23
Ну и перезаписывать набор после всякого чиха - это тоже сильно.
4 samozvanec
 
13.05.13
14:25
(0) не валится?
5 12345Kostya
 
13.05.13
14:38
(1) и (2) не понял, можно более подробнее?
Да и еще, я удаляю задвоенную проводку. Изначально я знаю что проводки задвоенные поэтому я ТЗ добавляю строку номенклатуры
НоваяСтрока = ТаблЗначений.Добавить();
НоваяСтрока.Номенклатура = ЗначПроводки.СубконтоКт.Номенклатура;
И при следующем проходе если указанная в текущей проводке номенклатура из ТЗ найдена то не удаляю проводку
НайденнаяСтрока = ТаблЗначений.Найти(ЗначПроводки.СубконтоКт.Номенклатура);
В конечном итоге дубли должны пропасть.
6 12345Kostya
 
13.05.13
14:51
up
7 12345Kostya
 
13.05.13
14:55
(4) не валится, просто количество обходов уменьшается
8 hhhh
 
13.05.13
15:05
(7) тогда читайте (1)
9 12345Kostya
 
13.05.13
15:10
(8)
в (5) написал про (1)
)
10 hhhh
 
13.05.13
15:18
(9) ну миллион раз объясняли, если удаляешь запись, то весь список сдвигается вверх. Чего непонятного. Поэтому делайте то же самое, но начиная с последней строчки и идите вверх. И закончите первой строкой.
11 Лефмихалыч
 
13.05.13
15:21
(5)  подробнее - только за тебя все сделать. см вариант (2), он самый наиболее правильный
12 12345Kostya
 
13.05.13
15:28
(10) (11) Спокойнее, спокойнее!! я чет не пойму как мне обход делать с конца? Ну хоть пару строчек кода это же не значит что все за меня сделать.
13 Trier
 
13.05.13
15:45
Мне лично в обратно порядке не нравится, лучше всего как в (2) делать, либо второй вариант из (1).

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

КонецЦикла;
14 12345Kostya
 
13.05.13
16:16
(13) А как мне обращаться к текущей проводке?
Ведь я же в
НайденнаяСтрока = ТаблЗначений.Найти(ЗначПроводки.СубконтоКт.Номенклатура);

обращаюсь к текущей проводке.
15 Лефмихалыч
 
13.05.13
16:18
(12)  Для СчЦ=0 по КоличествоСтрок Цикл
   Набор.УдалитьКЪебеням(КоличествоСтрок-СчЦ)
16 12345Kostya
 
13.05.13
16:35
(15) А как обратиться к текущей строке в теле цикла?
17 samozvanec
 
13.05.13
16:43
давно ли у нас в цикле Для Каждого разрешили менять коллекцию?
18 12345Kostya
 
13.05.13
16:46
(17) ну так вроде всегда так было
19 samozvanec
 
13.05.13
16:48
(18) у вас это где?
20 samozvanec
 
13.05.13
16:50
(19) виноват. 1сникам можно, спутал с шарпами.
21 12345Kostya
 
13.05.13
16:52
кто такие шарпы?
22 12345Kostya
 
13.05.13
17:00
(16) ОЧЕНЬ АКТУАЛЬНО
23 12345Kostya
 
13.05.13
17:04
UP
24 Лефмихалыч
 
13.05.13
17:05
(22) у тебя уже три готовых решения есть. Подробности - в синтаксис-помощнике.
25 Maxus43
 
13.05.13
17:08
(20) всякие делфи и т.д. тоже позволяют, 1с не виновата, это нормально
26 12345Kostya
 
13.05.13
17:12
Ну как же три готовых решения это просто варианты (идеи). Нужна помощь в (16) написано. Я бы не писал этот пост, если бы мог обойтись СП.
27 12345Kostya
 
13.05.13
17:15
(24) ------> (26)
28 hhhh
 
13.05.13
17:19
(27) ну в (13) же написали.
29 samozvanec
 
13.05.13
17:20
(26) КоличествоСтрок-СчЦ

вот так обратись.
30 samozvanec
 
13.05.13
17:21
элемент = коллекция[индекс];

на всякий пожарный
31 12345Kostya
 
13.05.13
17:48
(15) Почему КоличествоСтрок-СчЦ? Логики не улавливаю.
32 hhhh
 
13.05.13
17:56
(31) ряд чисел й = 0,1,2,3,4,5,6,7,8,9

преобразуешь в ряд

индекс проводки = 9,8,7,6,5,4,3,2,1,0