Имя: Пароль:
1C
1С v8
Как удалить строку в табличной части документа?
0 ded20ded
 
16.08.13
13:16
Процедура КнопкаВыполнитьНажатие(Кнопка)
    //Услуги=Объект.Услуги;
    
    ВыборкаДокументов = Документы.РеализацияТоваровУслуг.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока ВыборкаДокументов.Следующий() Цикл
    Объект = ВыборкаДокументов.ПолучитьОбъект();
    
    Товары = Объект.Товары;
    Услуги=Объект.Услуги;

    Для каждого строка из Услуги Цикл
    Если Строка.Номенклатура.Услуга = 0 Тогда
    НоваяСтрока=Товары.Добавить();
    НоваяСтрока.Номенклатура=Строка.Номенклатура;
    НоваяСтрока.Количество=Строка.Количество;
    НоваяСтрока.ЕдиницаИзмерения=Строка.Номенклатура.БазоваяЕдиницаИзмерения;
    НоваяСтрока.Цена=Строка.Цена;
    НоваяСтрока.Сумма=Строка.Сумма;
    НоваяСтрока.СтавкаНДС=Строка.СтавкаНДС;
    НоваяСтрока.СуммаНДС=Строка.СуммаНДС;
    НоваяСтрока.СчетУчета=ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
    НоваяСтрока.СчетДоходов=ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД;
    НоваяСтрока.СчетРасходов=ПланыСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД;
    НоваяСтрока.СчетУчетаНДСПоРеализации=ПланыСчетов.Хозрасчетный.Продажи_НДС;

//Как правильно удалить перенесенную строку из одной табличной части в другую?
    //Строка.Удалить();
     Сообщить("Товар - "+Строка.Номенклатура);
    КонецЕсли;
     Сообщить("Услуга - "+Строка.Номенклатура);
КонецЦикла;    
   Сообщить(" Док - "+ВыборкаДокументов);
Объект.Записать();
КонецЦикла;    



КонецПроцедуры
1 Wobland
 
16.08.13
13:17
ТЧ.Удалить(СтрокаТЧ)
2 RomaH
 
naïve
16.08.13
13:17
добавить строки к удалению в массив
потом удалить обходом массива
3 Besometr
 
16.08.13
13:40
(2) Или обходить табличную часть с конца:

КолВо = Услуги.Количество();

Для i = 1 По КолВо Цикл
   Если Услуги[Колво - i].Номенклатура.Услуга = 0 Тогда

      Услуги.Удалить(Услуги[Колво - i])

   КонецЕсли;
КонецЦикла
4 Kvitok8320
 
27.08.13
11:24
(3) Подскажите пожалуйста, а в примере в квадратных скобках это индекс строки?
5 Wobland
 
27.08.13
11:26
(4) да
6 olegves
 
27.08.13
11:32
(2) это верняк
7 Kvitok8320
 
27.08.13
13:50
Пробую сделать вот так

&НаСервере
Процедура УдалитьЛишнееСервер()
    NNN=объект.ТабличнаяЧасть1.Количество();
    Для й=1 по NNN цикл
        строка=объект.ТабличнаяЧасть1[й];
        если значениезаполнено(строка.счет)=ложь тогда
                 объект.ТабличнаяЧасть1.Удалить(объект.ТабличнаяЧасть1[й]);
                  й=й-1;
             конецесли;
             NNN=объект.ТабличнаяЧасть1.Количество();
    конеццикла;
КонецПроцедуры

почему то на последней строке ругается: Индекс находится за границами массива!

никак не могу понять - вроде номер последней строки равен количеству строк в последнем варианте табличной части - что не так-то?
8 Starhan
 
27.08.13
13:52
(7)>>вроде номер последней строки равен количеству строк

не вроде... совсем нет.
9 Maxus43
 
27.08.13
13:52
Найди отличия...

(3) Услуги.Удалить(Услуги[Колво - i])

(7) объект.ТабличнаяЧасть1.Удалить(объект.ТабличнаяЧасть1[й]);
10 Maxus43
 
27.08.13
13:53
+ в условии также, (колво - й)
11 Kvitok8320
 
27.08.13
14:03
(8) Изначально в документе было 1069 строк - постепенно оно становится меньше - в последнем варианте у меня 453 строки и на таком же индексе вылетает....
(9) я так понял - что там обратный обход идет - поэтому и схема слегка разная. Если не разберусь, почему мой вариант не работает - конечно этим воспользуюсь
хотя да - не буду терять время
12 Starhan
 
27.08.13
14:05
(11)>> я так понял - что там обратный обход идет - поэтому и схема слегка разная. Если не разберусь,

Сразу видно 1с твой первый язык...

Индекс (номер строки) Начинаетя с ноля. Поэтому строчек 1на а номер строки = 0, то есть никогда не будут они одинаковыми.
13 Wobland
 
27.08.13
14:05
(11) ты уже сам понял, почему твой вариант не работает
14 Kvitok8320
 
27.08.13
14:08
(12) ну да, я слегка аудитор по профессии ....
15 Maxus43
 
27.08.13
14:22
(14) логику никто не отменял. При удалении строк надо идти с конца, а не сначала. Ибо когда удалишь одну строку, то их будет не 10, а 9, и идя сначала ты сбиваешь нумерацию строк, в итоге удалишь не то + выйдешь за границы
16 Kvitok8320
 
27.08.13
17:24
ну да, вот поэтому я и назначил переменную NNN и изменял ее по мере удаления строк .... правда при достижении ее значения процесс не остановился ....
хотя и так все работает .... сообщили что индекс превышен, нажал ОК и все довольны :)
но в целом я вас понял, спасибо!
17 Kvitok8320
 
27.08.13
17:45
а вот это работает без вопросов (и без обратного порядка) - ну вдруг кому любопытно ...

&НаСервере
Процедура УдалитьЛишнееСервер()
    ~заново:
    NNN=объект.ТабличнаяЧасть1.Количество();
    NNNN=NNN-1;
    Для й=0 по (NNNN) цикл
        строка=объект.ТабличнаяЧасть1[й];
        если значениезаполнено(строка.счет)=ложь тогда
                 объект.ТабличнаяЧасть1.Удалить(объект.ТабличнаяЧасть1[й]);
                  й=й-1;
                  перейти ~заново;
        конецесли;
    конеццикла;
        
КонецПроцедуры
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн