Имя: Пароль:
1C
1С v8
Удаление строки табличной части документа из обработки
,
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ке не знаю еще, вот и спрашиваю - такое возможно?...

Для синтаксиса есть синтаксис помощник. Для много другого - глобальный поиск. Вот к примеру сочетание букв "удалитьстрок" в глобальном поиске открывает кучу методов, первый в списке найденных является решением вопроса.


// Процедура удаляет строки с пустыми значениями из структуры таблиц документа
//    Параметры:
//        - ТаблицыДляДвиженийПоЗаказам - структура таблиц документа
//        - ИмяПоля - имя поля, значение которого проверяет на пустое значение.
//
Процедура УдалитьСтрокиИзТаблицДокумента(ТаблицыДляДвиженийПоЗаказам, ИмяПоля) Экспорт

    Для Каждого ТабЧасть Из ТаблицыДляДвиженийПоЗаказам Цикл
        КолвоСтрок = ТабЧасть.Значение.Количество();
        Для Инд = 1 По КолвоСтрок Цикл
             ТекСтрока = ТабЧасть.Значение[КолвоСтрок - Инд];

             Если НЕ ЗначениеЗаполнено(ТекСтрока[ИмяПоля]) Тогда
                  ТабЧасть.Значение.Удалить(ТекСтрока);
             КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
КонецПроцедуры // УдалитьСтрокиИзТаблицДокумента()

25 GreatOne
 
10.11.14
22:30
Кстати недавно опять ей пользовался. Сокращенный вариант:

    КолвоСтрок = Товары.Количество();
    Для Инд = 1 По КолвоСтрок Цикл
         ТекСтрока = Товары[КолвоСтрок - Инд];
         Если НЕ ЗначениеЗаполнено(ТекСтрока["Количество"]) Тогда
              Товары.Удалить(ТекСтрока);
         КонецЕсли;
    КонецЦикла;

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) Точно. В общем, еще один рабочий вариант.

В общем, всем спасибо.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан