Имя: Пароль:
1C
1C 7.7
v7: Удаление строк ТЧ документа!
,
0 Aleksei_Pro
 
21.01.12
18:12
Ребят , подскажите, если почему цикл по строкам не переберает все строки..( т.е 3 строки переберет , а остальные не перебирает и вылетает из цикла..)

   док = СоздатьОбъект("Документ.Соглашение");
   док.ВыбратьДокументы(НачДата,КонДата);
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   Пока док.ПолучитьДокумент() = 1 Цикл
       Если Док.ПометкаУдаления() = 1 Тогда
           Продолжить;
       КонецЕсли;
       
       Док.ВыгрузитьТабличнуюЧасть(ТЗ);
   
       ТЗ.ВыбратьСтроки();
       Пока ТЗ.ПолучитьСтроку() = 1 Цикл
           Если (ДатаГод(ТЗ.ДКон)<=ДатаГод(ТекущаяДата())) Тогда
               ТЗ.УдалитьСтроку();
           КонецЕсли;
       КонецЦикла;
       Док.ЗагрузитьТабличнуюЧасть(ТЗ);
       
       Док.Записать();
       Док.Провести();
       Сообщить("Проведен документ " + Док);
   КонецЦикла;
1 Рэйв
 
21.01.12
18:13
Учись удалять строку в выборке.
В поиск.
2 Aleksei_Pro
 
21.01.12
18:14
(1) что в поиск, удаляется текущая строка ТЗ.
3 Rie
 
21.01.12
18:14
(0) Потому что удалением строк ты ему думать мешаешь.
Удаляй строки с конца. Или по списку.
4 Rie
 
21.01.12
18:14
(2) Угу. А выборке об этом кто-нибудь сказал? В поиск - за решением, это такой баянище...
5 Фокусник
 
21.01.12
18:15
(0) выборка сбивается. Делай перебор с конца.
6 Aleksei_Pro
 
21.01.12
18:17
Даже так пробовал, не катит:
   док = СоздатьОбъект("Документ.Соглашение");
   док.ВыбратьДокументы(НачДата,КонДата);
   Пока док.ПолучитьДокумент() = 1 Цикл
       Если Док.ПометкаУдаления() = 1 Тогда
           Продолжить;
       КонецЕсли;
       
       Док.ВыбратьСтроки();
       Док.ОбратныйПорядок(1);
       Пока Док.ПолучитьСтроку() = 1 Цикл
           Если (ДатаГод(Док.ДКон)<=ДатаГод(ТекущаяДата())) Тогда
               Док.УдалитьСтроку();
           КонецЕсли;
       КонецЦикла;
       Док.Записать();
       Док.Провести();
       Сообщить("Проведен документ " + Док);
   КонецЦикла;
7 Фокусник
 
21.01.12
18:19
(6) обратный порядок - это для выборки документов. Сделай в коде в (0) перебор строк ТЗ с конца
8 Рэйв
 
21.01.12
18:19
о сколько нам открытий чудных готовит просвященбя дух!:-)
(С)А.С.Пушкин
9 Rie
 
21.01.12
18:20
(6) Разумеется, если не читать документацию - то бред и получится.
ОбратныйПорядок для совсем другого - для выборки _документов_, а НЕ строк табличной части документа.

Hint: ПолучитьСтрокуПоНомеру и цикл по номерам строк - от конца к началу.
10 Aleksei_Pro
 
21.01.12
18:25
(7) один документ за период, зачем обрабный порядок, так тоже не взлетает:
   док = СоздатьОбъект("Документ.Соглашение");
   док.ВыбратьДокументы(НачДата,КонДата);
   Док.ОбратныйПорядок(0);
   Пока док.ПолучитьДокумент() = 1 Цикл
       Если Док.ПометкаУдаления() = 1 Тогда
           Продолжить;
       КонецЕсли;
       
       Док.ВыбратьСтроки();
       Пока Док.ПолучитьСтроку() = 1 Цикл
           Если (ДатаГод(Док.ДКон)<=ДатаГод(ТекущаяДата())) Тогда
               Док.УдалитьСтроку();
           КонецЕсли;
       КонецЦикла;
       Док.Записать();
       Док.Провести();
       Сообщить("Проведен документ " + Док);
   КонецЦикла;
11 Rie
 
21.01.12
18:27
(10) Перечитай Hint в (9). Ну а на досуге - документацию.
12 Фокусник
 
21.01.12
18:30
(10) Если не хочешь ТЗ в с конца перебирать, поставь после Док.УдалитьСтроку()
Док.ВыбратьСтроки();
13 Рэйв
 
21.01.12
18:34
+(8)...И опыт, сын ошибок трудных,
И гений -парадоксов другю
14 Рэйв
 
21.01.12
18:35
*друг.
:-)
15 Эльниньо
 
21.01.12
18:37
док = СоздатьОбъект("Документ.Соглашение");
   док.ВыбратьДокументы(НачДата,КонДата);
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   Пока док.ПолучитьДокумент() = 1 Цикл
       Если Док.ПометкаУдаления() = 1 Тогда
           Продолжить;
       КонецЕсли;
       
       Док.ВыгрузитьТабличнуюЧасть(ТЗ);
   
       ТЗ.ВыбратьСтроки();
       Пока ТЗ.ПолучитьСтроку() = 1 Цикл
//обрати внимание
           Пока (ТЗ.НомерСтроки > 0) И (ДатаГод(ТЗ.ДКон)<=ДатаГод(ТекущаяДата())) Цикл
               ТЗ.УдалитьСтроку();
           КонецЦикла;
       КонецЦикла;
       Док.ЗагрузитьТабличнуюЧасть(ТЗ);
       
       Док.Записать();
       Док.Провести();
       Сообщить("Проведен документ " + Док);
   КонецЦикла;
16 DES
 
21.01.12
18:56
(0) Смотри.
Ты удаляешь пусть 3-ю строку. удалил.
4-я стала третьей.
счетчик строк увеличивается на 1
ты уже проверяешь 4 строку, а это бывшая 5-я, а 4-я, ставшая 3-й, проскочила без фейсконтроля.
17 Bww_
 
21.01.12
19:01
Ты попробуй обрубить себе второе яйцо два раза и все будет ясно.
18 Bww_
 
21.01.12
19:02
Из цикла точно вылетишь.
19 Рэйв
 
21.01.12
19:03
(17)нормальный програмер поймет , что только второе нельзя:-)
Ты наверное бухгалтер,нет?:-)
20 Рэйв
 
21.01.12
19:04
9..а с первым все будет в порядке:-))
21 Bww_
 
21.01.12
19:19
(19) не понял
22 Рэйв
 
21.01.12
19:24
(21)Я так и умал:-)..Ладно  проехали.
23 Bww_
 
21.01.12
19:40
Вот текст писанный мной в 199х году
   R# = RECORDS(DIRTBL)              
   LOOP R# > 0                      
     GET(DIRTBL,R#)               !    GET ENTRY FROM TABLE
     IF TBL:PORS
       DELETE(DIRTBL)               !    DELETE TABLE ENTRY
       R# -= 1                   !    INCREMENT POSITION
   . .
Это в тему о втором яйце...
Язык узнаешь?
24 Bww_
 
21.01.12
19:41
...а лажу видишь?