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

Тема в разделе "1C и всё что с ней связано", создана пользователем lira89, 14 фев 2011.

  1. lira89

    lira89 Well-Known Member

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

    Код (Text):
    Запрос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.ВыбратьСтроку();
    КонецЕсли;
     
  2. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    тема случайно продублировалась.
     
  3. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    А точно не на второй группировке зависает?

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Мне кажется стоит делать так:
    ТекДок = Запрос1.Док.ВыбратьСтроки();
    Пока текдок.ПолучитьСТроку()=1 ...
     
  5. Hryv

    Hryv Гость

    Предлагаю

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

    ...


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

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Теперь не зацикливает, но я не получаю данные табличной части документа (они просто пустые), хотя реквизиты шапки нормально отрабатывают(
     
  7. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Группировку по строке документа задала?
     
  8. lira89

    lira89 Well-Known Member

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    В запросе надо получать реквизит НеСтудент, а потом обращаться Запрос.НеСтудент
     
  10. Hryv

    Hryv Гость

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

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

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

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

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

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

    lira89 Well-Known Member

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Не надо ее объявлять, группировка встроенная
     
  13. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    спасибо
     
  14. Hryv

    Hryv Гость

    Ну вот уже ошибка в запросе
    внутри цикла
    Пока Запрос1.Док.ПолучитьСтроку()=1 Цикл
    даже если он будет работать, то по каждой строке будет одна и та же сумма

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

    lira89 Well-Known Member

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

    Дайнеко Well-Known Member
    1C Team

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

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

Поделиться этой страницей