Имя: Пароль:
1C
 
Как программно удалить строку в табличной части документа?
0 svchernova
 
25.01.10
06:39
Корифеи, помогите кто может.
Казалось бы, простая задча - удалить строчки. но в 1С - невыполнимая просто! Что я делаю неправильно, посмотрите код, пожалуйста.

   // Ссылка - это ссылка на нужный документ в базе
   Док = Ссылка.ПолучитьОбъект();
   
   Попытка
       Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
   Исключение
   КонецПопытки;
   
   // Пробовала так :
   ТаблЧастьРазделы = ДокументОбъект.Разделы;
   Разделы_Корр = ТаблЧастьРазделы.НайтиСтроки(новый Структура("Контрагент,ДоговорКонтрагента",СтрокаРаз.Контрагент,СтрокаРаз.Основание));
   Для каждого СтрокаРаз_Корр из  Разделы_Корр цикл
       ТаблЧастьРазделы.Удалить(СтрокаРаз_Корр);
   конеццикла;

   // И так :
   ТаблЧастьРазделы = Док.Разделы;
   Разделы_Корр = ТаблЧастьРазделы.НайтиСтроки(новый Структура("Контрагент,ДоговорКонтрагента",СтрокаРаз.Контрагент,СтрокаРаз.Основание));
   Для каждого СтрокаРаз_Корр из Разделы_Корр Цикл
       НомерРаздела = СтрокаРаз_Корр.НомерРаздела;
       КолВо = Разделы_Корр.Количество();
       СтрокаРаз_Корр.УДалить();
       Инд=0;
       Пока Инд<КолВо Цикл
           //Строка  = Разделы_Корр[Инд];
           Разделы_Корр.УдалитьСтроку(Инд);
           Инд=Инд+1;
       КонецЦикла;
   КонецЦикла;
   
   // И так :
   мас = новый массив;
   Для каждого СтрокаРаз_Корр из Разделы_Корр цикл
       НомерРаздела = СтрокаРаз_Корр.НомерРаздела;
       мас.Добавить(СтрокаРаз_Корр);
   КонецЦикла;
   Для каждого Строка_Корр из мас цикл
       Разделы_Корр.Удалить(Строка_Корр);
   КонецЦикла;
   
   //Попытка
   //    Док.Записать(РежимЗаписиДокумента.Запись);
   //Исключение
   //КонецПопытки;
1 svchernova
 
25.01.10
06:44
СтрокаРаз получена как параметр процедуры (СтрокаРаз.Контрагент,СтрокаРаз.Основание), т.е. в табличной части я нахожу строчки с нужным контрагентом и основанием и пытаюсь удалить эти строчки
2 AmoreMe
 
25.01.10
07:04
когда мне нужно было удалить строки в табличной части кроме выбранных я делал так (под себя переделать не проблема)

Процедура ОсновныеДействияФормыВыполнить(Кнопка)
   
   ЧислоСтрок = ДокументОбъект.ДанныеПоставщика.Количество();
   
Пока ЧислоСтрок > 0 Цикл
   ЧислоСтрок = ЧислоСтрок -1;
   Для Каждого ТекСтрока Из ДокументОбъект.ДанныеПоставщика Цикл
       
       Удалить = Истина;
       Для Каждого СтрокаТаблицыМест Из ВыбранныеМеста Цикл
           
           Если ТекСтрока.НомерМеста = СтрокаТаблицыМест.НомерМеста Тогда
               Удалить = Ложь;
               Прервать;                    
           КонецЕсли;
       КонецЦикла;
       
       Если Удалить Тогда            
           ДокументОбъект.ДанныеПоставщика.Удалить(ТекСтрока);            
       КонецЕсли;
       
   КонецЦикла;
КонецЦикла;
   Форма = ДокументОбъект.ПолучитьФорму("ФормаДокумента");
   Форма.ЗаполнениеПрописей();
   Модифицированность = Ложь;
КонецПроцедуры
3 svchernova
 
25.01.10
07:10
Сейчас попробую разобрать твой код, AmoreMe.. Спасибо
4 svchernova
 
25.01.10
08:13
Получилось! Спасибо, AmoreMe!!!!!!!!!!!!
5 ASU_Diamond
 
25.01.10
08:42
(2)
Пока ЧислоСтрок > 0 Цикл
   ЧислоСтрок = ЧислоСтрок -1;
   Для Каждого ТекСтрока Из ДокументОбъект.ДанныеПоставщика Цикл
       Удалить = Истина;
       Для Каждого СтрокаТаблицыМест Из ВыбранныеМеста Цикл
           Если ТекСтрока.НомерМеста = СтрокаТаблицыМест.НомерМеста Тогда
               Удалить = Ложь;
               Прервать;                    
           КонецЕсли;
       КонецЦикла;
       Если Удалить Тогда            
           ДокументОбъект.ДанныеПоставщика.Удалить(ТекСтрока);            
       КонецЕсли;
   КонецЦикла;
КонецЦикла;

А для чего нужно такое количество раз проходить табличную часть? за один раз не прокатит?
(0)
   ТаблЧастьРазделы = ДокументОбъект.Разделы;
   Разделы_Корр = ТаблЧастьРазделы.НайтиСтроки(новый Структура("Контрагент,ДоговорКонтрагента",СтрокаРаз.Контрагент,СтрокаРаз.Основание));
   Для каждого СтрокаРаз_Корр из  Разделы_Корр цикл
       ТаблЧастьРазделы.Удалить(СтрокаРаз_Корр);
   конеццикла;

это должно работать, что не получается?
6 Mitriy
 
25.01.10
08:48
(5) присоединяюсь к вопросу - через НайтиСтроки самый удобный вариант...
7 svchernova
 
25.01.10
08:52
Для бриллианта:
Сделала вот так:


   Док = Ссылка.ПолучитьОбъект();
   Для каждого ТекСтрока из Док.Разделы  Цикл
        Если ТекСтрока.Контрагент = СтрокаРаз.Контрагент И ТекСтрока.ДоговорКонтрагента = СтрокаРаз.Основание Тогда
             Док.Разделы.Удалить(ТекСтрока);
         КонецЕсли;
   КонецЦикла;      

Получилось.

Сейчас твой вариант попробую, тем более что с него примерно и начала
8 svchernova
 
25.01.10
08:56
Прокатило!!!!!!!!!!!!!!!!
9 ASU_Diamond
 
25.01.10
08:56
(7) 1. Вопрос был не к тебе :)
2. Это не мой вариант, а твой, я скопипастил :)
10 svchernova
 
25.01.10
08:56
спасибо, парни :)
11 ASU_Diamond
 
25.01.10
08:56
(8) ты издеваешься? что тогда не получилось в первый раз?
12 svchernova
 
25.01.10
08:56
странно.. сейчас сравню
13 svchernova
 
25.01.10
08:58
Слушай, а ведь действительно это мой вариант.. это я в 12 ночи делала, видать совсем загомырилась.. Работает!
14 Злобный Йожег
 
25.01.10
08:59
(0) Здравствуй, Света!
15 Mitriy
 
25.01.10
08:59
(7) не пойдет... в корзину...
16 ASU_Diamond
 
25.01.10
09:00
(15) +1, при первом же удалении слетает выборка
17 Злобный Йожег
 
25.01.10
09:01
(15) Интересно, она где-то работает? :)))
18 Stim
 
25.01.10
09:01
(16)+1
только через структуру
19 ASU_Diamond
 
25.01.10
09:03
кстати (0), следующий раз задавай такие вопросы после 8 по Москве, результативность ответов будет выше
20 svchernova
 
25.01.10
09:03
Привет, Ёж. Забанят сейчас
21 svchernova
 
25.01.10
09:04
Диамонду - не терпелось вопрос задать
22 svchernova
 
25.01.10
09:05
Митрию- вроде всё работает.. какая выборка должна слететь?
23 ASU_Diamond
 
25.01.10
09:07
(22) проверь вариант когда нужно удалить 2 строки подряд
24 svchernova
 
25.01.10
09:08
Сейчас проверю. скажу
25 Mitriy
 
25.01.10
09:09
(22) вроде - не значит правильно... просто пока тебе везло...
26 Mitriy
 
25.01.10
09:10
(25) после каждого удаления количество строк уменьшается, индексы сдвигаются - одна строка пропускается...
27 ASU_Diamond
 
25.01.10
09:13
Для агу=1-Док.Разделы.Количество() По 0 Цикл
  ТекСтрока = Док.Разделы[-агу];
        Если ТекСтрока.Контрагент = СтрокаРаз.Контрагент И  ТекСтрока.ДоговорКонтрагента = СтрокаРаз.Основание Тогда
             Док.Разделы.Удалить(ТекСтрока);
         КонецЕсли;
   КонецЦикла;
28 Stim
 
25.01.10
09:16
СтруктураДляПоиска = Новый Структура("Количество", 0);

ОбъектДок = СсылкаДок.ПолучитьОбъект();
ТабличнаяЧастьДок = ОбъектДок.Товары;

МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);

Для каждого Строка Из МассивПустыхСтрок Цикл
   ТабличнаяЧастьДок.Удалить(Строка);
   
КонецЦикла;
29 svchernova
 
25.01.10
09:22
я проверила.
Тот мой вариант, который как будто не работал - работает для двух строк, все удалились
30 svchernova
 
25.01.10
09:22
ТаблЧастьРазделы = ДокументОбъект.Разделы;
   Разделы_Корр = ТаблЧастьРазделы.НайтиСтроки(новый Структура("Контрагент,ДоговорКонтрагента",СтрокаРаз.Контрагент,СтрокаРаз.Основание));
   Для каждого СтрокаРаз_Корр из  Разделы_Корр цикл
       ТаблЧастьРазделы.Удалить(СтрокаРаз_Корр);
   конеццикла; ------------этот вариант
31 svchernova
 
25.01.10
09:24
вот этот тоже работает - тут нет выборки
   //работающий вариант
   Для каждого ТекСтрока из Док.Разделы  Цикл
        Если ТекСтрока.Контрагент = СтрокаРаз.Контрагент И ТекСтрока.ДоговорКонтрагента = СтрокаРаз.Основание Тогда
             Док.Разделы.Удалить(ТекСтрока);
         КонецЕсли;
   КонецЦикла;
32 Stim
 
25.01.10
09:24
(29) спать надо больше просто:)
33 svchernova
 
25.01.10
09:24
(32)Да :)
34 Stim
 
25.01.10
09:25
(31) это некорректный вариант.когда удаляшь строки, то удаляешь индексы строк, и нарушается обход
35 Mitriy
 
25.01.10
09:26
(29) потом не жалуйся...
36 Aprobator
 
25.01.10
09:27
(29) видно эти 2 строки не подряд просто были, а как минимум через одну.
37 Mitriy
 
25.01.10
09:27
(35) к (31)
38 ASU_Diamond
 
25.01.10
09:29
(31) после (8) я не удивлюсь что все варианты теперь работают :)
39 svchernova
 
25.01.10
09:30
елки..
совсем вразброд у меня всё в голове..
строки подряд были!
сейчас  поработаю, проверю, вы мне кодов кучу дали. разные документы возьму, хорошие примеры отработаю
40 Mitriy
 
25.01.10
09:32
(39) сделай свой вариант через НайтиСтроки и не парься...
41 ASU_Diamond
 
25.01.10
09:32
(28) не рабочий код оказывается в простых примерах
Строка - зарезервированное слово, нельзя так переменную называть
42 Stim
 
25.01.10
09:34
(41) со всеми вопросами к Габецу и Гончарову :)
43 svchernova
 
25.01.10
09:40
Я благодарна всем, спасибо.
Я без этого форума не смогла бы работать, всё новое.. Инструмент тяжёлый в 1С.
45 palpetrovich
 
25.01.10
09:51
(43)  "Инструмент тяжёлый в 1С" - че за инструмент-то? ;))
46 svchernova
 
25.01.10
09:56
Я имею ввиду конструкцию языка. множество типов данных и объектов со своими методами.
просто так if-else-endif не получится. У меня очень маленький опыт в 1С, и могу быть неправа, но думаю, что именно из-за такого тяжелого инструмента так много всевозможных 1С сайтов и форумов.
47 svchernova
 
25.01.10
10:01
Осановилась на варианте ASU_Diamond.
индексы учтены.. работает. спасибо
Для агу=1-Док.Разделы.Количество() По 0 Цикл
  ТекСтрока = Док.Разделы[-агу];
        Если ТекСтрока.Контрагент = СтрокаРаз.Контрагент И  ТекСтрока.ДоговорКонтрагента = СтрокаРаз.Основание Тогда
             Док.Разделы.Удалить(ТекСтрока);
         КонецЕсли;
   КонецЦикла;
48 Злобный Йожег
 
25.01.10
10:03
(20) Кого? Тебя за тупые вопросы? Меня-то точно нет...
49 Stepa86
 
25.01.10
10:06
(47) через НайтиСтроки() уже предлагали?
50 svchernova
 
25.01.10
10:17
(49) НайтиСтроки() был мой вариант изначально
Ёжик, у меня действительно тупые вопросы. Может быть, я тупая? Но я работала и начальником отдела, и главным специалистом в ERP. Недавно пришлось уйти в 1С и мне сложно. всё другое, здесь сектантство какое-то. Пусть тупые, но я всё равно их буду задавать и постигать всю эту кухню. Разве ты не начинал когда-то? Не будь таким колючим. А забанят за off
51 ASU_Diamond
 
25.01.10
12:48
(47) что за индексы? О_о
52 Злобный Йожег
 
25.01.10
13:55
(50) Ну я, допустим, для начала кое-какие специальные курсы закончил...
53 svchernova
 
25.01.10
14:34
Мы все хорошо знаем, что дают курсы. Общее представление, пинка для рывка. А вот когда реально начинается работа, тогда выплывает много чего. И я заканчивала, и два сертификата от ibm имею, и знаю, что такое курсы.
54 svchernova
 
25.01.10
14:43
(51) Имела ввиду, что не соскочит выборка.