Имя: Пароль:
1C
 
v8: Как получить детальные записи в запросе
0 rajas
 
12.07.11
07:24
Здравствуйте.
Есть запрос:

Код

Запр = новый  Запрос("ВЫБРАТЬ
                        |    ХозрасчетныйОборотыДтКт.СубконтоКт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.Количество,СтатусСообщения.ОченьВажное);
КонецЦикла;



Тогда выводится вообще, что попало, где – то как надо детальные записи , а где-то в месте с деталями выводится опять родители (которые уже выводились).

Подскажите как мне правильно добраться до детальных записей, если я начинаю обход с группировки «Контрагент»?
1 rajas
 
12.07.11
08:28
?
2 rajas
 
12.07.11
09:02
help!!!!!!!!!!
3 Рэйв
 
12.07.11
09:05
>>Если обхожу группировки последовательно, тогда все в порядке, все выводится как надо

Работает? Не трожь!
4 rajas
 
12.07.11
09:11
(3) так мне не надо последовательно, мне надо начинать с группировки "контрагент" (в определенной ситуации).
5 hhhh
 
12.07.11
09:14
(4) группировка "общие" имеет ровно обну строчку. Поэтому просто при обходе пропусти ее и не парь людям мозг.
6 rajas
 
12.07.11
09:18
(5) Я знаю, что так можно сделать, мне просто интересно, почаму, если начинать с группировки "Контрагент", то появляются проблемы при получении детальных записей.
7 hhhh
 
12.07.11
09:22
(6) ну ты же написал "все". Значит, должны попасть все группировки. С чего ты взял, что детальные записи там должны быть?
8 rajas
 
12.07.11
09:29
(7) Тогда так Как мне получить детальные записи после получения иерархической группировки по номенклатуре (попробовал без "все", все равно не получилось :(( )

 [code]     в2 = Запр.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Контрагент");//итоги по контрагенту

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

                           Пока в3.Следующий() Цикл
                                Сообщить("    в3 ном = "+в3.Номенклатура+"  кво = "+в3.Количество);
                                ///????????????????????????? Как тут получить детальные  записи
                           КонецЦикла;
                        КонецЦикла;
[/code]
9 unregistered
 
12.07.11
09:30
(0) >> НО ведь все «родители» номенклатуры уже выведены предыдущей группировкой

Ну а как бы чего ты хотел? Ты ведь попросил вывести все группировки, указав третий параметр "все".....
10 rajas
 
12.07.11
09:32
(9) убрал параметр "все" не помогло
11 unregistered
 
12.07.11
09:35
///????????????????????????? Как тут получить детальные  записи
ВыборкаДетальныеЗаписи = в3.Выбрать();
12 rajas
 
12.07.11
09:39
(11) Выводит ближайшего родителя для детальной записи и детальную запись
13 unregistered
 
12.07.11
09:52
//????????????????????????? Как тут получить детальные  записи

ВыборкаДетальныеЗаписи = в3.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующи() Цикл
  Если ВыборкаДетальныеЗаписи.ТипЗаписи() = ТипзаписиЗапроса.ИтогПоИерархии Тогда
     Продолжить();
  КонецЕсли;
  // работаем с детальной записью
КонецЦикла;
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн