Имя: Пароль:
1C
1C 7.7
v7: Как правильно удалить часть строк из документа?
,
0 Double_Medved
 
13.05.14
11:37
Добрый день! Простая задача - нужно чтобы в один документ из другого не попадала часть строк, а именно из заявки в реализацию не попадали работы и услуги, для них есть акт выполненных работ. Речь про ввод на основании. Я решил не морочиться с внесением изменений в стандартную процедуру, и решил методом поручика Ржевского после заполнения и всяких стандартных проверок и пересчетов просто удалить то что мне не нужно.
Написал простенький код
Если (ДокОснование.Вид()="ЗаявкаПокупателя") Тогда
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
            Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга) или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа) Тогда
                УдалитьСтроку();  
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
Но оказалась собака зарыта! После УдалитьСтроку() как бы мы попадаем на следующую стоку, потом происходит ПолучитьСтроку(), и мы попадаем на еще следующую строку. В итоге если УдалитьСтроку() то шаг 2, а не 1, и половина работ попадает куда не надо. Собственно в данном случае можно и просто на входе отсекать то что не нужно, но у меня философский вопрос: как правильно перебирать строки и удалять некоторые?
1 Chum
 
13.05.14
11:40
1. Обратным перебором строк
2. выгрузить в ТЗ, отсортировать, удалить лишнее, загрузить в ТЧ
2 Chum
 
13.05.14
11:41
ну или методом тупых студентов:

УдалитьСтроку();
ВыбратьСтроки(); // <<<- добавить это
3 Double_Medved
 
13.05.14
11:43
(2)О, ну это прям не в бровь, а в глаз!
4 SleepyHead
 
гуру
13.05.14
11:50
Выгрузить табличную часть в таблицу значений, удалить лишние строки, загрузить обратно. Примерно так:

// получаем табличную часть в виде таблицы значений
ТЗ = ПолучитьпустоеЗначение(); // или описать переменную в модуле

Док.ВыгрузитьТабличнуюЧасть(ТЗ);

// помечаем строки на удаление, для этого добавляем в ТЗ колонку числового типа, значение по умолчанию ноль
ТЗ.НоваяКолонка("Удалить","Число");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
  // читаем значение реквизита объекта
  ТекВидНоменклатуры = ТЗ.Номенклатура.ВидНоменклатуры;
  Если (ТекВидНоменклатуры  = Перечисление.ВидыНоменклатуры.Услуга) или (ТекВидНоменклатуры  = Перечисление.ВидыНоменклатуры.Работа) Тогда
   ТЗ.Удалить=1;
  КонецЕсли;
КонецЦикла;

// удаление помеченных строк из ТЗ
Пока 1=1 Цикл
   Найден = ПолучитьпустоеЗначение();
    Если ТЗ.найтиЗначение(1,Найден,"Удалить")=0 Тогда
      ТЗ.УдалитьСтроку(Найден)
    Иначе
       Прервать
    КонецЕсли
КонецЦикла;

// загружаем обратно в документ
Док.ЗагрузитьтабличнуюЧасть(ТЗ);
5 Duke1C
 
13.05.14
11:57
(1) (4) все бы вам гланды удалять через одно место, не надо никуда выгружать

КС=КоличествоСтрок();
Для Л=-КС по -1 Цикл
    ПолучитьСтрокуПоНомеру(-Л);
    Если ..твое условие.. Тогда
        УладитьСтроку(-Л);
    КонецЕсли;
КонецЦикла;
6 Chum
 
13.05.14
12:01
шинимахюйняу

Могу ошибаться, но за все время, что я на мисте, было только одно роскошное решение, вошедшее в учебники. Кто именно предложил не помню:

ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
  Пока (ТЗ.НомерСтроки>0) И (ТутУсловие) Цикл
    ТЗ.УдалитьСтроку();
  КонецЦикла
КонецЦикла
7 PR
 
13.05.14
12:02
После первого предложения в (1) ветку можно закрывать.
8 1dvd
 
13.05.14
12:08

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


Но (6) мне понравилось
9 SleepyHead
 
гуру
13.05.14
13:10
(5) Сразу видно, на реальных предприятиях с 1с77 не работал.
10 DexterMorgan
 
13.05.14
13:21
(9) сразу видно пенсионера-семерочника =)
11 Duke1C
 
13.05.14
13:43
(9) И откуда сей вердикт?
Вместо того, чтобы делать голословные выводы, попробовал бы сначала.
единственная опечатка, вместо: УладитьСтроку(-Л);
надо: УдалитьСтроку();
12 Duke1C
 
13.05.14
14:18
+11 а на твоих "реальных предприятиях", видно, никогда не ищут лёгких путей, и оплата у тебя, судя по всему и глядя на (4), за количество наколбашеных в код строк.
Хотя, да - "работает не трожь"
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший