8.х Обход детальных записей в запросе

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Максим, 12 июл 2011.

  1. TopicStarter Overlay
    Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    688
    Симпатии:
    8
    Баллы:
    29
    Здравствуйте.
    Есть запрос:

    Код:
    Запр = новый  Запрос("ВЫБРАТЬ
    |	ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК Контрагент,
    |	ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК Номенклатура,
    |	ХозрасчетныйОборотыДтКт.КоличествоОборотДт КАК Количество,
    |	ХозрасчетныйОборотыДтКт.Период КАК Период
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт (&ДатаНач, &ДатаКон, МЕСЯЦ, СчетДт = &Счет41, , СчетКт =&Счет60) КАК ХозрасчетныйОборотыДтКт
    |ИТОГИ
    |	СУММА(Количество)
    |ПО
    |	ОБЩИЕ,
    |	Контрагент КАК Контрагент,
    |	Номенклатура ТОЛЬКО ИЕРАРХИЯ КАК Номенклатура");
    
    Если обхожу группировки последовательно, тогда все в порядке, все выводится как надо:

    Код:
    	 в1 = Запр.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //общие итоги
    Пока в1.Следующий() Цикл
    Сообщить(в1.Количество);
    
    в2 = в1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //итоги по контрагенту
    
    Пока в2.Следующий() Цикл
    Сообщить(в2.Количество);
    
    в3 = в2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);//итоги по иерархии номенклатуры
    
    Пока в3.Следующий() Цикл
    Сообщить(в3.Количество);
    
    в4 = в3.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);//детальные записи по номенклатуре
    Пока в4.Следующий() Цикл
    Сообщить(Строка(в4.Количество)+в4.Номенклатура);
    
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
    НОООООО, Если я обхожу записи, начиная с группировки Контрагент:

    Код:
    			 в2 = Запр.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Контрагент");
    Пока в2.Следующий() Цикл
    Сообщить("в2 ном = "+в2.Номенклатура+"  кво = "+в2.Количество);
    в3 = в2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока в3.Следующий() Цикл
    Сообщить("    в3 ном = "+в3.Номенклатура+"  кво = "+в3.Количество);
    
    в4 = в3.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,,"все");
    
    Пока в4.Следующий() Цикл
    Сообщить("        в4 ном = "+в4.Номенклатура+"  кво = "+в4.Количество,СтатусСообщения.ОченьВажное);
    
    
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
    То возникают проблемы с детальными записями по номенклатуре, в место них
    Код:
    Сообщить("        в4 ном = "+в4.Номенклатура+"  кво = "+в4.Количество,СтатусСообщения.ОченьВажное);
    
    Выводит ближайшего родителя для детальной записи (НО ведь все «родители» номенклатуры уже выведены предыдущей группировкой). Я попробовал добавить еще одну группировку


    Код:
    в5 = в4.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,,"все");
    
    Пока в5.Следующий() Цикл
    Сообщить("        в5 ном = "+в5.Номенклатура+"  кво = "+в5.Количество,СтатусСообщения.ОченьВажное);
    КонецЦикла;
    
    Тогда выводится вообще, что попало, где – то как надо детальные записи , а где-то в месте с деталями выводится опять родители (которые уже выводились).

    Подскажите как мне правильно добраться до детальных записей, если я начинаю обход с группировки «Контрагент»
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Ммм...А почему Вы начинаете с группировки по контрагентам?
    Сначала надо произвести выборку из результата запроса, а потом уже выборку из выборки.
    Нет, ну можно, конечно, сразу контрагентов перебирать... но тогда из запроса уберите ОБЩИЕ итоги.
    Но если общие итоги Вам нужны, тогда придется оставить и начинать именно с общего итога.
    Кстати, первый и самый большой цикл не нужен (общий итог - там же одна запись).
    Т.е. можно так:
    Код:
    в1 = Запр.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //общие итоги
    в1.Следующий();
    
    И дальше сразу контрагентов выбирать
    Код:
    в2 = в1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //итоги по контрагенту
    Пока в2.Следующий() Цикл
    ...
    
  3. TopicStarter Overlay
    Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    688
    Симпатии:
    8
    Баллы:
    29
    Да да да, я ждал такого ответа. Просто поверьте мне на слово так надо

    Ну а если не убирать, тогда как? (В общем-то в этом и есть вопрос).
    Не ужели с этим никто не сталкивался? :angry:
  4. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Нее, всё правильно. Я ошибся...Можно сразу по контрагентам делать выборку. У Вас, вроде, всё правильно.
    Думаю, проблема в строке:
    Код:
    "|	Номенклатура ТОЛЬКО ИЕРАРХИЯ КАК Номенклатура"
    
    Слово "ТОЛЬКО" попробуйте убрать.
    Код:
    "|	Номенклатура ИЕРАРХИЯ КАК Номенклатура"
    
  5. TopicStarter Overlay
    Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    688
    Симпатии:
    8
    Баллы:
    29
    Попробовал. Появилась еще одно значение группировки с наименованием номенклатуры - это вполне ожидаемый результат. и это не пойдет...Мне нужно
    Родитель1
    -Родитель2
    --Номенклатура1
    --Номенклатура2
    --Номенклатура3
    ....

    ,а вы посоветовали получется
    Родитель1
    -Родитель2
    -Номенклатура1
    --Номенклатура1
    -Номенклатура2
    --Номенклатура2
    -Номенклатура3
    --Номенклатура3
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Мне кажется "в4" - это лишнее.

    Я попробовал убрать "в4".
    По номенклатуре и количеству, вроде, все нормально выводится. Проблема с периодом (период я чё-та не смог вывести).
  7. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104

    Вложения:

  8. TopicStarter Overlay
    Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    688
    Симпатии:
    8
    Баллы:
    29
    Спасибо.
    Вот только она не открывается. :))))))))
    Обработка на 8.2? У меня 8.1 :((((
    Можно код?
  9. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104

    Вложения:

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