Зацикливание табл. части док-та

lira89

Well-known member
12.03.2010
154
0
#1
Есть оборотный регистр с измерением Назначение и ресурсом Сумма. Надо вытащить из него данные включая информацию о документе, который сделал движение по данному регистру. Документ имеет табличную часть. Получив данные из регистра, надо обратиться к этому документу и если его табл. часть не пуста, то пройти по строкам и записать данные.
Проблема в том, что я точно знаю что у меня в документе есть 1 строка, а когда я делаю цикл по строкам Пока Запрос1.Док.ПолучитьСтроку()=1 Цикл то у меня зацикливается на этой строке т.е бесконечно показывает что строка есть и не переходит на следующий док-т. Метод КоличествоСтрок показывает наличие одной строки. В чем может быть проблема??? Код приведен ниже, 1С77.

Код:
Запрос1 = СоздатьОбъект("Запрос");
Текст1 = "//{{Запрос1()
|Период с ДатаР по ДатаК;
|Назн = Регистр.РазовыеПлатежи.Назначение;
|Сумма = Регистр.РазовыеПлатежи.Сумма;
|Док = Регистр.РазовыеПлатежи.ТекущийДокумент.ОплатаОбщаяПоНазначению.ТекущийДокумент;
|Функция СуммаПост = Сумма(Сумма);
|Группировка Назн;
|Группировка Док;
|"//
;
ТЗ111 = СоздатьОбъект("ТаблицаЗначений");
ТЗ111.НоваяКолонка("Эл","Справочник.Назначения"); 
ТЗ111.НоваяКолонка("Док","Документ.ОплатаОбщаяПоНазначению"); 
ТЗ111.НоваяКолонка("Сумма","Число",10,0,"Сумма",10); 
ТЗ111.НоваяКолонка("ФИО","Строка",80,,"ФИО",30); 	
Если Запрос1.Выполнить(Текст1) = 1 Тогда
Пока Запрос1.Группировка(1)=1 Цикл 
Пока Запрос1.Группировка(2)=1 Цикл
Если Запрос1.Док.ВыбратьСтроки()=1 тогда
Запрос1.Док.ВыбратьСтроки();
Пока Запрос1.Док.ПолучитьСтроку()=1 Цикл //здесь зацикливание, ПолучитьСтроку всегда показывает = 1
ТЗ111.НоваяСтрока(); 
ТЗ111.Эл = Запрос1.Назн;
ТЗ111.Док = Запрос1.Док;
ТЗ111.Сумма = Запрос1.СуммаПост;
Если ПустоеЗначение(Запрос1.Док.НеСтудент)=1 Тогда
ТЗ111.ФИО = СокрЛП(Запрос1.Док.Студент);
Иначе
ТЗ111.ФИО = СокрЛП(Запрос1.Док.НеСтудент);
КонецЕсли;		
КонецЦикла;
Иначе
ТЗ111.НоваяСтрока(); 
ТЗ111.Эл = Запрос1.Назн;
ТЗ111.Док = Запрос1.Док;
ТЗ111.Сумма = Запрос1.СуммаПост;
КонецЕсли;
КонецЦикла;
КонецЦикла; 
ТЗ111.ВыбратьСтроку();
КонецЕсли;
 

puh14

Well-known member
11.07.2008
1 412
0
#3
А точно не на второй группировке зависает?

Как вариант можно использовать кончтрукцию

Для ааа = 1 по Запрос1.Док.КоличествоСтрок() Цикл
Если Запрос1.Док.ПолучитьСтрокуПоНомеру(ааа) = 1 Тогда

КонецЕсли;
КонецЦикла;
 

unknown181538

НеГуру
28.12.2008
1 417
0
#4
Мне кажется стоит делать так:
ТекДок = Запрос1.Док.ВыбратьСтроки();
Пока текдок.ПолучитьСТроку()=1 ...
 
H

Hryv

#5
Предлагаю

|Группировка Док;
|Группировка СтрокаДокумента;
|"//

...


Код:
Пока Запрос1.Группировка(2)=1 Цикл
ЕстьСтроки = 0;
Пока Запрос1.Группировка(3)=1 Цикл
ЕстьСтроки = 1;
ТЗ111.НоваяСтрока(); 
ТЗ111.Эл = Запрос1.Назн;
ТЗ111.Док = Запрос1.Док;
ТЗ111.Сумма = Запрос1.СуммаПост;
Если ПустоеЗначение(Запрос1.СтрокаДокумента.НеСтудент)=1 Тогда
ТЗ111.ФИО = СокрЛП(Запрос1.СтрокаДокумента.Студент);
Иначе
ТЗ111.ФИО = СокрЛП(Запрос1.СтрокаДокумента.НеСтудент);
КонецЕсли;		
КонецЦикла;
Если ЕстьСтроки = 0 Тогда
ТЗ111.НоваяСтрока(); 
ТЗ111.Эл = Запрос1.Назн;
ТЗ111.Док = Запрос1.Док;
ТЗ111.Сумма = Запрос1.СуммаПост;
КонецЕсли;
КонецЦикла;
 

lira89

Well-known member
12.03.2010
154
0
#6
Для ааа = 1 по Запрос1.Док.КоличествоСтрок() Цикл
Если Запрос1.Док.ПолучитьСтрокуПоНомеру(ааа) = 1 Тогда

КонецЕсли;
КонецЦикла;
Теперь не зацикливает, но я не получаю данные табличной части документа (они просто пустые), хотя реквизиты шапки нормально отрабатывают(
 

lira89

Well-known member
12.03.2010
154
0
#8
Задала, но выдает ошибку:
Если ПустоеЗначение(Запрос1.СтрокаДокумента.НеСтудент)=1 Тогда
{Отчет.ОплатыЗаПериод.Форма.Модуль(174)}: Значение не представляет агрегатный объект (НеСтудент)

Реквизит НеСтудент находится в табличной части.
 

unknown181538

НеГуру
28.12.2008
1 417
0
#9
В запросе надо получать реквизит НеСтудент, а потом обращаться Запрос.НеСтудент
 
H
#10
В запросе надо получать реквизит НеСтудент, а потом обращаться Запрос.НеСтудент
так не получится

вообще алгоритм какой-то странный

Зачем выбирать строки если их всегда одна или не одной?
А если бывает больше, то вообще бред

Не проще ли вместо запроса выбрать документы и обходить их в цикле?

даже если
|Назн = Регистр.РазовыеПлатежи.Назначение;
|Сумма = Регистр.РазовыеПлатежи.Сумма;
невозможно взять из документа, то всегда можно попользоваться ВыбратьДвиженияДокумента()

наверное можно и запрос переделать, чтобы он правильно работал
только непонятно вообще что и зачем происходит: какие доки и что пишут в рег, сколько и каких записей в рег делает ОплатаОбщаяПоНазначению
соответственног сложно советовать
 

lira89

Well-known member
12.03.2010
154
0
#11
Количество строк может быть и больше одной. Вот например ситуация. Люди платят за кикие-то курсы (курсы - это есть назначение), сумма оплаты (общая) попадает в регистр. В табличной части документа можно расписать подробно фио людей, которые заплатили и сумму, которую каждый заплатил. Этого можно и не расписывать (на усмотрение пользователя). Для формирования подробного отчета об оплатах нужно как можно больше информации: если в табличную часть документа занесли какие-то ФИО и суммы, то надо их показать в отчете, если не занесли, то просто показываем общую сумму и назначение.
Метод ВыбратьДвиженияДокумента() я уже использовала и все работало хорошо, но медленно. Вот решила через запрос попробовать и так намного быстрее получается(если конечно не считать небольшие проблемки)).
 

vbs

Well-known member
18.02.2007
1 708
1
#12
Не надо ее объявлять, группировка встроенная
 
H
#13
Количество строк может быть и больше одной. Вот например ситуация. Люди платят за кикие-то курсы (курсы - это есть назначение), сумма оплаты (общая) попадает в регистр. В табличной части документа можно расписать подробно фио людей, которые заплатили и сумму, которую каждый заплатил. Этого можно и не расписывать (на усмотрение пользователя). Для формирования подробного отчета об оплатах нужно как можно больше информации: если в табличную часть документа занесли какие-то ФИО и суммы, то надо их показать в отчете, если не занесли, то просто показываем общую сумму и назначение.
Ну вот уже ошибка в запросе
внутри цикла
Пока Запрос1.Док.ПолучитьСтроку()=1 Цикл
даже если он будет работать, то по каждой строке будет одна и та же сумма

Метод ВыбратьДвиженияДокумента() я уже использовала и все работало хорошо, но медленно. Вот решила через запрос попробовать
Странно, обычно запросы - это и есть самые тормоза
 

lira89

Well-known member
12.03.2010
154
0
#14
спасибо за советы. Решение нашлось благодаря всем советам))) Еще раз спасибо. Я просто сделала Д=Запр.Док; и цикл по строкам сделала по используя переменную Д.
 

Дайнеко

Well-known member
19.11.2009
951
0
#15
Все рады, но робко замечу, что я бы своим программерам ручки за такое решение оторвал.
Я проповедую принцип красоты: делаешь Запрос, так добивайся всего результата запросом. Тяжко сделать группировку по строкам?
Решил, что Объектом лучше - значит все задачу так.

P.S.
На мой взгляд изначально некрасивость была вот в чем (2 раза вызов метода):
Код:
Если Запрос1.Док.ВыбратьСтроки()=1 тогда
Запрос1.Док.ВыбратьСтроки();
Пока Запрос1.Док.ПолучитьСтроку()=1 Цикл //здесь зацикливание, ПолучитьСтроку всегда показывает = 1