|   |   | 
| 
 | Удаление строки табличной части документа из обработки | ☑ | ||
|---|---|---|---|---|
| 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) Точно. В общем, еще один рабочий вариант.
 В общем, всем спасибо. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |