Имя: Пароль:
1C
1С v8
проблема с запросом
,
0 vip67
 
25.07.13
12:04
Всем привет! помогите разобраться с запросом:
текст запроса:
        ЗапросПрихМатТекМес = Новый Запрос;
        ЗапросПрихМатТекМес.Текст =
            "ВЫБРАТЬ
            |    ПОДСТРОКА(ПриходМатТекМес.СубконтоДт1.Код, 1, 2) КАК ГрМат,
            |    СУММА(ПриходМатТекМес.СуммаОборот) КАК Сумма20,
            |    ПриходМатТекМес.СубконтоКт3 КАК Сделка,
            |    ПриходМатТекМес.Регистратор.Номер КАК НомерАкта
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПериода, &КонПериода, Запись, СчетДт В ИЕРАРХИИ (&Счет20), , , , ) КАК ПриходМатТекМес
            |ГДЕ
            |    ПриходМатТекМес.СубконтоКт3 = &Сделка
            |
            |СГРУППИРОВАТЬ ПО
            |    ПриходМатТекМес.СубконтоКт3,
            |    ПриходМатТекМес.Регистратор.Номер,
            |    ПОДСТРОКА(ПриходМатТекМес.СубконтоДт1.Код, 1, 2)";

        ЗапросПрихМатТекМес.УстановитьПараметр("КонПериода", КонПериода);
        ЗапросПрихМатТекМес.УстановитьПараметр("НачПериода", НачПериода);
        ЗапросПрихМатТекМес.УстановитьПараметр("Сделка", Сделка);
        ЗапросПрихМатТекМес.УстановитьПараметр("Счет20", Счет20);
        
//        сообщить(Сделка);

        РезультатПрихМатТекМес = ЗапросПрихМатТекМес.Выполнить();
    
//        ВыборкаПрих = РезультатПрихМатТекМес.Выбрать();
//        Пока ВыборкаПрих.Следующий() Цикл
//            СтрокаТаб = Таблица.Добавить();
//            СтрокаТаб.Контрагент = ВыборкаПлатежа.Контрагент;
//            СтрокаТаб.НомерСчета = ВыборкаПлатежа.Сделка.НомерВходящегоДокумента;
//            СтрокаТаб.НомерАкта = ВыборкаПрих.НомерАкта;
//            СтрокаТаб.ГруппаМатериала = ВыборкаПрих.ГрМат;
//            СтрокаТаб.Сумма20 = ВыборкаПрих.Сумма20;
////            СтрокаТаб.Сумма631 = ВыборкаПрих.Сумма631;
//        
//            
//        КонецЦикла;    
        
        ВыборкаСделка = РезультатПрихМатТекМес.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

        Пока ВыборкаСделка.Следующий() Цикл
        //    СтрокаТаб = Таблица.Добавить();
        //    СтрокаТаб.Контрагент = ВыборкаПлатежа.Контрагент;
        //    СтрокаТаб.НомерСчета = ВыборкаПлатежа.Сделка.НомерВходящегоДокумента;
            ВыборкаРегистратор = ВыборкаСделка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаРегистратор.Следующий() Цикл
        //        СтрокаТаб.НомерАкта = ВыборкаРегистратор.Регистратор.Номер;
        //    
                ВыборкаГрМат = ВыборкаРегистратор.Выбрать();
                Пока ВыборкаГрМат.Следующий() Цикл
                    СтрокаТаб = Таблица.Добавить();
                    СтрокаТаб.Контрагент = ВыборкаПлатежа.Контрагент;
                    СтрокаТаб.НомерСчета = ВыборкаПлатежа.Сделка.НомерВходящегоДокумента;
                    СтрокаТаб.НомерАкта = ВыборкаГрМат.НомерАкта;
                КонецЦикла;
            КонецЦикла;
        //    
        КонецЦикла;

если обход запроса без группировки - то таблицу заполняет (заремленная часть). А вот в текущем варианте - с обходом группровки - не заполняет - не проваливается даже во второй уровень
где ошибка?
1 Капитан О
 
25.07.13
12:05
а где итоги?
2 vip67
 
25.07.13
12:08
а они обязательны?
3 Ненавижу 1С
 
гуру
25.07.13
12:09
(2) обход по группировкам это и есть обход по ИТОГИ
просто у 1С путаница в терминологиях
4 vip67
 
25.07.13
12:10
счас попробую!
5 cw014
 
25.07.13
12:11
Прих мат
6 vip67
 
25.07.13
12:22
с итогами - работает! а что тогда прихмат? - (5)
7 cw014
 
25.07.13
12:23
(6) ЗапросПрихМатТекМес
Прих мат текс мекс брякс
8 Капитан О
 
25.07.13
12:25
(7) тссс.. сейчас вызовешь Нуралиева
9 vip67
 
25.07.13
12:26
еще одна загвозкда: вот полный текст:

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

    РезультатПлатеж = ЗапросПлатеж.Выполнить();


    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    
    ВыборкаПлатежа = РезультатПлатеж.Выбрать();

    Пока ВыборкаПлатежа.Следующий() Цикл
            
        Сделка = ВыборкаПлатежа.Сделка;
             //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

        ЗапросПрихМатТекМес.УстановитьПараметр("КонПериода", КонПериода);
        ЗапросПрихМатТекМес.УстановитьПараметр("НачПериода", НачПериода);
        ЗапросПрихМатТекМес.УстановитьПараметр("Сделка", Сделка);
        ЗапросПрихМатТекМес.УстановитьПараметр("Счет20", Счет20);
        
        сообщить(Сделка);

        РезультатПрихМатТекМес = ЗапросПрихМатТекМес.Выполнить();
    
        
        ВыборкаСделка = РезультатПрихМатТекМес.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

        Пока ВыборкаСделка.Следующий() Цикл
        //    СтрокаТаб = Таблица.Добавить();
        //    СтрокаТаб.Контрагент = ВыборкаПлатежа.Контрагент;
        //    СтрокаТаб.НомерСчета = ВыборкаПлатежа.Сделка.НомерВходящегоДокумента;
            ВыборкаРегистратор = ВыборкаСделка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаРегистратор.Следующий() Цикл
        //        СтрокаТаб.НомерАкта = ВыборкаРегистратор.Регистратор.Номер;
        //    
                ВыборкаГрМат = ВыборкаРегистратор.Выбрать();
                Пока ВыборкаГрМат.Следующий() Цикл
                    СтрокаТаб = Таблица.Добавить();
                    СтрокаТаб.Контрагент = ВыборкаПлатежа.Контрагент;
                    СтрокаТаб.НомерСчета = ВыборкаПлатежа.Сделка.НомерВходящегоДокумента;
                    СтрокаТаб.НомерАкта = ВыборкаГрМат.НомерАкта;
                    СтрокаТаб.ГруппаМатериала = ВыборкаГрМат.ГрМат;
                    СтрокаТаб.Сумма20 = ВыборкаГрМат.Сумма20;
                КонецЦикла;
            КонецЦикла;
        //    
        КонецЦикла;

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

        
    КонецЦикла;

    
обратите внимание на первый запрос: там есть уловие по контрагенту - если контрагент есть (передаю ссылку) - то отрабатывает все - данные вижу, когда контрагента нет, по идее долно показать данные по все контрагентам  - опять пусто.
10 vip67
 
25.07.13
12:27
при этом, когда контрагент не указываю, т.е ВыбКонтрагент - пустая ссылка, то сделки перечилсяет через Сообщить(сделка)
11 exwill
 
25.07.13
12:27
(7) Хорошее имя для запроса. Звучное.
12 cw014
 
25.07.13
12:27
(9) Условие в виртуальную таблицу вставляй
13 Капитан О
 
25.07.13
12:29
(11) видал имя для списка документов - СписДок
14 cw014
 
25.07.13
12:31
(13) До меня только сейчас дошло )))))
15 cw014
 
25.07.13
12:31
(13) Надо букву "С" первую убрать
16 cw014
 
25.07.13
12:32
(13) и вторую заменить на "з"
17 vip67
 
25.07.13
12:33
(12) не понял? ксати - прошелся отладчиком - все-таки внутренний цикл при переборе вторго запроса отрабатывает, Таблица добавляется и данные есть - а вот не отображаются... это как?
18 exwill
 
25.07.13
12:33
(9) Если "контрагента нет". Это еще не значит, что ВыбКонтрагент=ПустаяСсылка()
19 vip67
 
25.07.13
12:34
какая-то бяка - после отладяика - отбразилось! да шо ж это такое!!!
20 exwill
 
25.07.13
12:36
(19) бывает
21 cw014
 
25.07.13
12:36
(19) Чудеса...
22 vip67
 
25.07.13
12:36
(18) почему не значит? я выбконтрагент выбираю на форме, если не выбрал - значит это поле - пустая ссылка. или не так?
23 cw014
 
25.07.13
12:38
(22) 1. Если ВыбКонтрагент <> справочники.Контрагенты.ПустаяСсылка() тогда
замени хотя бы на
Если НЕ ВыбКонтрагент.Пустая() тогда

2.         |            СчетДт В ИЕРАРХИИ (&Счет631)
        |                ИЛИ СчетДт В ИЕРАРХИИ (&Счет371),
        |            ,
        |            ,
        |            ,
        |            ) КАК ПлатежТекМес

Видишь куча запятушек? Так вот там где то параметры виртуальной таблицы кроются
24 exwill
 
25.07.13
12:41
(22) В таком случае, да. Пустая ссылка. Если тип поля не составной.
25 vip67
 
25.07.13
12:41
тип поле не составной - счас пробовал в разных комбинациях ситуации - рабоатет. чудеса...
26 hhhh
 
25.07.13
12:58
(25) еще возможна ситуация, что контрагент не первое субконто. Как-то вы лихо решили, что первое. На самом деле, если типовая конфа, то там когда делают настройки учета, могут быть разные ситуации. Лучше перестраховаться и задавать параметр &Субконто
27 vip67
 
25.07.13
12:59
теперь - двоятся строки - как убрать задвоение?
28 Капитан О
 
25.07.13
13:07
(27) понять, что есть ещё измерения, применить полученные знания