Имя: Пароль:
1C
1C 7.7
v7: Почему зацикливается?
0 HandMade
 
06.02.12
12:06
Есть следующий код
Док = СоздатьОбъект("Документ.тб_ОснованиеРЛ");
УдалитьСтроки();
Док.ВыбратьДокументы(НачалоПериода,КонецПериода);
Пока Док.ПолучитьДокумент()>0  Цикл
ТекДок = Док.ТекущийДокумент();
Если ТекДок.Проект = Проект Тогда
 НоваяСтрока();
 НомерДокумента = ТекДок.НомерДок;
 НаименованиеОрг = ТекДок.Контрагент;
 ТекДок.ДокумОснование.ВыбратьСтроки();
 Пока ТекДок.ДокумОснование.ПолучитьСтроку()>0 Цикл
   Если ТекДок.ДокумОснование.Номенклатура.Свойство2 =    
     Перечисление.тбит_ВидыСвойствНоменклатуры.Автоуслуги Тогда
    А = А + ТекДок.ДокумОснование.Сумма;
   КонецЕсли;
 КонецЦикла;
КонецЕсли;
КонецЦикла;

в этом месте

Пока ТекДок.ДокумОснование.ПолучитьСтроку()>0 Цикл
   Если ТекДок.ДокумОснование.Номенклатура.Свойство2 =    
     Перечисление.тбит_ВидыСвойствНоменклатуры.Автоуслуги Тогда
    А = А + ТекДок.ДокумОснование.Сумма;
   КонецЕсли;
 КонецЦикла;
Идет зацикливание. Хотя в документе одна строка.В отладчике получаю следующее:
ТекДок.ДокумОснование.количествострок() = 1
ТекДок.ДокумОснование.ПолучитьСтроку() = 1
ТекДок.ДокумОснование = Реализация  СТ00000005 (24.01.12)
В чем может быть ошибка?
1 aleks-id
 
06.02.12
12:08
потому что не переходишь на следующий элемент.
2 HandMade
 
06.02.12
12:09
Разве цикл не предусматривает переход?
3 HandMade
 
06.02.12
12:09
как перейти?
4 Vakhrin
 
06.02.12
12:11
(1) ???

(0) сделай черным запросом - красивее, быстрее... без глюков со сбоем выборок )
5 ale-sarin
 
06.02.12
12:11
Может "ДокумОснование" в отдельную переменную выделить?
Вдруг поможет?
6 1Сергей
 
06.02.12
12:12
ВыбратьСтроки через две точки не очень красиво, имхо
7 МастерВопросов
 
06.02.12
12:12
а у тебя точно  ТекДок.ДокумОснование<>ТекДок ??
8 Vakhrin
 
06.02.12
12:12
(5) +
9 МастерВопросов
 
06.02.12
12:12
(5)+1
10 HandMade
 
06.02.12
12:14
ДокументОснование = СоздатьОбъект("Реализация");
ДокументОснование = ТекДок.ДокумОснование;
так?
11 Godofsin
 
06.02.12
12:15
ДокОс = ТекДок.ДокумОснование;
12 1Сергей
 
06.02.12
12:15
(10)
 ДокОсн = ТекДок.ДокумОснование;
 ДокОсн.ВыбратьСтроки();
 Пока ДокОсн.ПолучитьСтроку()>0 Цикл
   Если ДокОсн.Номенклатура.Свойство2 =    
     Перечисление.тбит_ВидыСвойствНоменклатуры.Автоуслуги Тогда
    А = А + ДокОсн.Сумма;
   КонецЕсли;
 КонецЦикла;
13 Simod
 
06.02.12
12:16
Выборка строк из документа-основания без проверки наличия документа-основания может привести к падению с ошибкой. А то, что обращение идет через две точки - не влияет.

Уверен, что есть зацикливание?
14 HandMade
 
06.02.12
12:16
да
, в документе одна строка, а он идет по циклу, получает эту одну строку и дальше в цикл
15 Simod
 
06.02.12
12:20
(14) В отладчике проверял?
16 HandMade
 
06.02.12
12:21
да
17 Godofsin
 
06.02.12
12:21
пробуй (12)
18 Simod
 
06.02.12
12:22
(16) А у документов из переменной "Док" не одно и тоже основание?
19 МастерВопросов
 
06.02.12
12:25
(13) попробовал такой код - исправду зацикливает:
//*******************************************
Процедура Сформировать()
   
   НачалоПериода=Дата("01.01.2012");
   КонецПериода=Дата("02.01.2012");
   
   Док = СоздатьОбъект("Документ.Реализация");
   Док.ВыбратьДокументы(НачалоПериода,КонецПериода);
   Пока Док.ПолучитьДокумент()>0  Цикл
       Сообщить("*********"+СокрЛ(Док.ТекущийДокумент())+"*********");
       Если ПустоеЗначение(Док.ДокОснование)=0 Тогда
           ТекДок = Док.ТекущийДокумент();
           ТекДок.ДокОснование.ВыбратьСтроки();
           Пока ТекДок.ДокОснование.ПолучитьСтроку()>0 Цикл
               Сообщить("--"+СокрЛ(ТекДок.ДокОснование.Номенклатура));
           КонецЦикла;
       КонецЕсли;    
   КонецЦикла;
   
КонецПроцедуры
20 МастерВопросов
 
06.02.12
12:26
+(19) а такой работает на Ура:

//*******************************************
Процедура Сформировать()
   
   НачалоПериода=Дата("01.01.2012");
   КонецПериода=Дата("02.01.2012");
   
   Док = СоздатьОбъект("Документ.Реализация");
   Док.ВыбратьДокументы(НачалоПериода,КонецПериода);
   Пока Док.ПолучитьДокумент()>0  Цикл
       Сообщить("*********"+СокрЛ(Док.ТекущийДокумент())+"*********");
       Если ПустоеЗначение(Док.ДокОснование)=0 Тогда
           ТекДок = Док.ДокОснование;
           ТекДок.ВыбратьСтроки();
           Пока ТекДок.ПолучитьСтроку()>0 Цикл
               Сообщить("--"+СокрЛ(ТекДок.Номенклатура));
           КонецЦикла;
       КонецЕсли;    
   КонецЦикла;
   
КонецПроцедуры
21 1Сергей
 
06.02.12
12:26
(20) ч.т.д.
22 МастерВопросов
 
06.02.12
12:27
(21) разница в "ТекДок = Док.ДокОснование;", см.(5)
23 HandMade
 
06.02.12
12:29
помогло через переменную
24 HandMade
 
06.02.12
12:32
спасибо за помощь!
25 1Сергей
 
06.02.12
14:10
(22) чтд = что и требовалось доказать. см (6), (12)
26 МастерВопросов
 
07.02.12
08:43
(25) чтд = что я делаю не так?
я расшифровал именно так