|
Удаление строки табличной части документа из обработки | ☑ | ||
---|---|---|---|---|
0
kissolo
03.11.14
✎
19:55
|
Подскажите, плиз. Только начал изучать 8ку. Задание - выбрать в обработке документ, удалить из табличной части строки, подходящие по условию.
Написал код: ТекДтовары = Объект.ДокументРеализация.Товары; Для каждого ТекСтрТов из ТекДТовары цикл Если ТекСтрТов.Цена < 150 Тогда Сообщить("Строка Цена "+ТекСтрТов.Цена + ". Удаляем строку."); ТекДТовары.Удалить(ТекСтрТов.НомерСтроки); Иначе Сообщить("Строка Цена "+ТекСтрТов.Цена); КонецЕсли; КонецЦикла; Объект.ДокументРеализация.Записать(); Но строка не удаляется. "Объект недоступен для изменения." ЧЯДНТ? |
|||
1
ДенисЧ
03.11.14
✎
19:58
|
Я. Всегда. Буду. Получать. Объект. Для Изменения!
(с) Барт Симпсон |
|||
2
kissolo
03.11.14
✎
20:05
|
(1) А теперь по-русски? Говорю ж, только начал изучать :(
|
|||
3
Фокусник
03.11.14
✎
20:07
|
(9) Объект.ДокументРеализация - это ссылка, а работать нужно с объектом:
ДокОбхект = Объект.ДокументРеализация.ПолучитьОбъект() |
|||
4
kissolo
03.11.14
✎
20:09
|
(3) Спасибо большое, сейчас попробую!!!!
|
|||
5
Андрюха
03.11.14
✎
20:11
|
(0) Что такое "Объект.ДокументРеализация"? Где ты его берешь?
|
|||
6
Рэйв
03.11.14
✎
20:14
|
(0)НЕ слушай плохих дядей.
Почитай про .НайтиСтроки в СП Можешь не благодарить :-) |
|||
7
Рэйв
03.11.14
✎
20:15
|
Если условие одно, то можно просто .Найти
Там проще |
|||
8
ДенисЧ
03.11.14
✎
20:16
|
(6) А теперь удалим строку из ссылки. Это будет упражнением на дом, когда мы протрезвеем...
|
|||
9
Фокусник
03.11.14
✎
20:16
|
(7) и как условие Цена < 150 впихнуть в НайтиСтроки? ;)
|
|||
10
Рэйв
03.11.14
✎
20:17
|
А уж . Удалить что нужно аоди сам сможешь
|
|||
11
Рэйв
03.11.14
✎
20:17
|
(9)Да легко. Массив перебираем с условием. А есть другие предложения?:-)
|
|||
12
kissolo
08.11.14
✎
23:19
|
(5) Из реквизита обработки. Пользователь выбирает.
(8) Вот удалить и не получается :( |
|||
13
Chameleon1980
09.11.14
✎
00:16
|
Объект.ДокументРеализация.Товары кто это?
Тебе правильно говорили, что нужно получитьОбъект чтобы у него что-то менять. Если ты имеешь ссылку на документ получи объект вот так: ДокОбъект=СсылкаНаДок.ПолучитьОбъект() поработай с ним (именно с ДокОбъект) - поудаляй там. Потом сохраняй именно ДокОбъект как ты будешь удалять строки это уже второй вопрос, но первоначальный твой подход неверный. т.к. после удаления даже первой ненужной строки у тебя нарушается цикл для каждого. Есть разные способы. |
|||
14
Управление торговлей
09.11.14
✎
00:34
|
(13) никакой цикл не нарушается, это же не семерка
|
|||
15
Chameleon1980
09.11.14
✎
00:43
|
ну как считаете
|
|||
16
kissolo
09.11.14
✎
14:14
|
(13)
ДокументРеализация - это реквизит обработки, его тип - ДокументСсылка.РеализацияТоваровУслуг. Объект.ДокументРеализация.Товары - это соотв-нно табличная часть документа. (Наверное надо было сразу сказать, это типовая БП). |
|||
17
ДенисЧ
09.11.14
✎
14:18
|
"это реквизит обработки, его тип - ДокументСсылка"
Сколько дятла не корми, а у слона всё-равно толще.... |
|||
18
kissolo
09.11.14
✎
14:18
|
Тормознул. Сейчас поправил код, строка удалилась, док записался.
вот код: ТекРеализация = Объект.ДокументРеализация.ПолучитьОбъект(); Сообщить(ТекРеализация); ТекДтовары = ТекРеализация.Товары; Для каждого ТекСтрТов из ТекДтовары цикл Если ТекСтрТов.Цена < 150 Тогда Сообщить("Строка Цена "+ТекСтрТов.Цена + ". Удаляем строку."); ТекДТовары.Удалить(ТекСтрТов); Иначе Сообщить("Строка Цена "+ТекСтрТов.Цена); КонецЕсли; КонецЦикла; ТекРеализация.Записать(); Осталось проверить, как будет удалять строки в середине таблицы - не будет ли пропускать строки после удаления строки... |
|||
19
ДенисЧ
09.11.14
✎
14:19
|
(18) будет. Зуб даю. Последний...
|
|||
20
hhhh
09.11.14
✎
15:02
|
МассивУд = Новый Массив;
ТекДтовары = ТекРеализация.Товары; Для каждого ТекСтрТов из ТекДтовары цикл Если ТекСтрТов.Цена < 150 Тогда Сообщить("Строка Цена "+ТекСтрТов.Цена + ". Удаляем строку."); МассивУд.Добавить(ТекСтрТов); Иначе Сообщить("Строка Цена "+ТекСтрТов.Цена); КонецЕсли; КонецЦикла; Для КАждого ТекСтрТов Из МассивУд Цикл ТекДТовары.Удалить(ТекСтрТов); КонецЦикла; |
|||
21
kissolo
09.11.14
✎
23:04
|
(19) Ну, собссно, я и не сомневался, в 7ке так же пропускает следующую строку после удаленной.
(20) Спасибо, это рабочий вариант! :) Скажите, а если по моему варианту работать, но спозиционироваться после удаления на одну строку назад - такое возможно? Какой командой? |
|||
22
Управление торговлей
10.11.14
✎
12:45
|
Вот код:
д=Объект.Док.ПолучитьОбъект(); сообщить("Количество строк документа: "+д.товары.Количество()); Чет=Ложь; Для Каждого СтрокаДок из д.Товары цикл СтрокаДок.Количество=?(Чет,2,1); Чет=Не Чет; КонецЦикла; Д.Записать(); Для Каждого СтрокаДок из д.Товары цикл Если СтрокаДок.Количество=2 тогда д.Товары.Удалить(СтрокаДок); КонецЕсли; КонецЦикла; сообщить("Количество после удаления: "+д.товары.Количество()); ПропущеноСтрок=0; Для Каждого СтрокаДок из д.Товары цикл Если СтрокаДок.Количество=2 тогда ПропущеноСтрок=ПропущеноСтрок+1; КонецЕсли; КонецЦикла; Сообщить(?(ПропущеноСтрок=0,"Пропусков нет","Пропущено: "+ПропущеноСтрок)); Вот результат: Количество строк документа: 8 Количество после удаления: 4 Пропусков нет |
|||
23
kissolo
10.11.14
✎
21:16
|
(22) Угу. А если будет подряд две строки с Количеством=2? Или три?
Если они идут хотя бы через одну - то да, все нормально. А вот если подряд хотя бы две - то увы, облом. Тут, по идее, как вариант - множественное прохождение цикла по строкам, когда при хотя бы единственном удалении - включать флажок повторного прохождения, и опять крутить цикл... Но я хотел обойтись без этого, а просто после удаления строки спозиционироваться на текущейстроке - 1. как-то так. Просто синтаксис в 8ке не знаю еще, вот и спрашиваю - такое возможно?... |
|||
24
GreatOne
10.11.14
✎
22:29
|
Немного потерял суть вопроса, но думаю, что дело все еще в удалении строк из тч, удовлетворяющему некоему условию.
""Просто синтаксис в 8ке не знаю еще, вот и спрашиваю - такое возможно?... Для синтаксиса есть синтаксис помощник. Для много другого - глобальный поиск. Вот к примеру сочетание букв "удалитьстрок" в глобальном поиске открывает кучу методов, первый в списке найденных является решением вопроса.
|
|||
25
GreatOne
10.11.14
✎
22:30
|
Кстати недавно опять ей пользовался. Сокращенный вариант:
|
|||
26
Prog-AL
10.11.14
✎
22:34
|
(0) В Гринатом задание?
|
|||
27
Управление торговлей
10.11.14
✎
23:32
|
(23) Да хоть в порядке чисел Фибоначчи. При удалении строк выборка не сбивается.
|
|||
28
Управление торговлей
10.11.14
✎
23:45
|
(27) Опровергаю, был не прав. Затупил и имел в виду обработку результата .найтистроки()
|
|||
29
kissolo
11.11.14
✎
20:23
|
(24) Нет, как удалить строки, я уже понял, вопрос еще один задал - как спозиционироваться на конкретной строке в таблице (это если использовать мой вариант кода из (18))?
Вы уже на вопрос ответили в коде. про синтаксис помощник знаю, но как он поможет, если не знаю, как пишется команда? (Посмотрел на него, там иная совершенно структура, по сравнению с 7кой, к ней еще привыкнуть надо). Я про позиционирование на конкретной строке. За "глобальный поиск" спасибо - редко пользовался, забыл тут использовать. (24) и (25) Вопрос. Вот у вас Инд = 2. Вы удалили эту строку. Теперь на следующем шаге цикла, с Инд=3, у вас какая строка будет? ИМХО (исходя из опыта на 7ке), это уже не 4я оригинальная, а 5я, т.е. одну строку Вы пропустили из проверки. Я не прав? (26) Туда. Пытался сам справиться, но слишком мало знаю :( А что, Вы там работаете? (28) Вот то-то и оно :) Получается, что надо использовать счетчик, как в (24) или (25), и при удалении строки - уменьшать его на единицу. |
|||
30
Крошка Ру
11.11.14
✎
20:45
|
(29) >>Вот у вас Инд = 2. Вы удалили эту строку. Теперь на следующем шаге цикла, с Инд=3, у вас какая строка будет? ИМХО (исходя из опыта на 7ке), это уже не 4я оригинальная, а 5я, т.е. одну строку Вы пропустили из проверки. Я не прав?
Цикл перебирает строки с конца. Удалил 4-ю строку - цикл переходит на 3-ю и пофиг, что вместо удаленной 4-й встала 5-я. |
|||
31
Мимохожий Однако
11.11.14
✎
22:18
|
Выгрузить из ТЧ, Очистить, загрузить в ТЧ то, что отвечает условию.
|
|||
32
kissolo
11.11.14
✎
23:05
|
(30) Точно. В общем, еще один рабочий вариант.
В общем, всем спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |