|
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
|
Но (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), за количество наколбашеных в код строк.
Хотя, да - "работает не трожь" |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |