• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы lira89
  • Дата начала
L

lira89

Есть оборотный регистр с измерением Назначение и ресурсом Сумма. Надо вытащить из него данные включая информацию о документе, который сделал движение по данному регистру. Документ имеет табличную часть. Получив данные из регистра, надо обратиться к этому документу и если его табл. часть не пуста, то пройти по строкам и записать данные.
Проблема в том, что я точно знаю что у меня в документе есть 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.ВыбратьСтроку();
КонецЕсли;
 
L

lira89

тема случайно продублировалась.
 
P

puh14

А точно не на второй группировке зависает?

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

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

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

unknown181538

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

Hryv

Предлагаю

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

...


Код:
Пока Запрос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.СуммаПост;
КонецЕсли;
КонецЦикла;
 
L

lira89

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

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

unknown181538

Группировку по строке документа задала?
 
L

lira89

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

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

unknown181538

В запросе надо получать реквизит НеСтудент, а потом обращаться Запрос.НеСтудент
 
H

Hryv

В запросе надо получать реквизит НеСтудент, а потом обращаться Запрос.НеСтудент

так не получится

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

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

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

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

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

lira89

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

vbs

Не надо ее объявлять, группировка встроенная
 
H

Hryv

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

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

Странно, обычно запросы - это и есть самые тормоза
 
L

lira89

спасибо за советы. Решение нашлось благодаря всем советам))) Еще раз спасибо. Я просто сделала Д=Запр.Док; и цикл по строкам сделала по используя переменную Д.
 
Д

Дайнеко

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!