Имя: Пароль:
1C
1С v8
Обход результата запроса
, , ,
0 treor
 
31.08.18
17:00
Здравствуйте.
Подскажите в чем может быть проблема.
Делаю запрос с итогами по контрагентам и договорам. На уровне детальных записей вывожу документы. Все работает нормально. Но если перед контрагентами добавляю еще итоги по регионам, то в детальных записях по каждому договору добавляется пустая строка(((
1 igork1966
 
31.08.18
17:02
(0) не хватает вложенной выборки
2 treor
 
31.08.18
17:04
(1) поясните, пожалуйста
3 treor
 
31.08.18
17:07
(1) у меня три выборки с обходом результата ПоГруппировкам для региона, контрагента и договора (группировки указываю) и выборка для детальных записей без указания вида обхода
4 Franchiser
 
гуру
31.08.18
17:09
Сколько в Секции "Итоги По" полей столько и нужно делать выборок с типом ПоГруппировкам
5 igork1966
 
31.08.18
17:09
(3) Может ты итоги с иерархией сделал, может общие итоги стоит еще. ТЫж хочешь чтобы погадали?
6 treor
 
31.08.18
17:13
(5)"я не мастер, я только учусь"... не судите строго

ВЫБРАТЬ
    ВложенныйЗапрос.КонтрагентРегион КАК КонтрагентРегион,
    ВложенныйЗапрос.Контрагент КАК Контрагент,
    ВложенныйЗапрос.Договор КАК Договор,
    ВложенныйЗапрос.ДокументПоставки,
    ВложенныйЗапрос.ПроцентАванса,
    ВложенныйЗапрос.ВидОтсрочкиОплаты,
    ВЫБОР
        КОГДА ВложенныйЗапрос.ВидОтсрочкиОплаты = ЗНАЧЕНИЕ(Перечисление.ЮИ_ВидыОтсрочки.БанковскихДней)
            ТОГДА "б.д."
        ИНАЧЕ "к.д."
    КОНЕЦ КАК ВидОтсрочкиСтрока,
    ВложенныйЗапрос.СрокОплаты,
    ВложенныйЗапрос.КалендарныхДней,
    СУММА(ЗП_РегламентированныйПроизводственныйКалендарь.КалендарныеДни) КАК БанковскихДней,
    ВЫБОР
        КОГДА ВложенныйЗапрос.ВидОтсрочкиОплаты = ЗНАЧЕНИЕ(Перечисление.ЮИ_ВидыОтсрочки.БанковскихДней)
            ТОГДА СУММА(ЗП_РегламентированныйПроизводственныйКалендарь.КалендарныеДни)
        ИНАЧЕ ВложенныйЗапрос.КалендарныхДней
    КОНЕЦ КАК ПрошлоДней,
    ВложенныйЗапрос.СуммаОстаток КАК СуммаОстаток,
    ВложенныйЗапрос.КонтрагентКодКраткий
ИЗ
    (ВЫБРАТЬ
        ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
        ХозрасчетныйОстатки.Субконто2 КАК Договор,
        ХозрасчетныйОстатки.Субконто3 КАК ДокументПоставки,
        ЕСТЬNULL(ХозрасчетныйОстатки.Субконто2.ЮИ_Соглашение.ПроцентАванса, 0) КАК ПроцентАванса,
        ХозрасчетныйОстатки.Субконто2.ЮИ_Соглашение.ВидОтсрочкиОплаты КАК ВидОтсрочкиОплаты,
        ЕСТЬNULL(ХозрасчетныйОстатки.Субконто2.ЮИ_Соглашение.СрокОплаты, 0) КАК СрокОплаты,
        РАЗНОСТЬДАТ(ХозрасчетныйОстатки.Субконто3.Дата, &ДатаОтчета, ДЕНЬ) КАК КалендарныхДней,
        ВЫБОР
            КОГДА ХозрасчетныйОстатки.Валюта ЕСТЬ NULL
                ТОГДА ХозрасчетныйОстатки.СуммаОстатокДт
            ИНАЧЕ ХозрасчетныйОстатки.ВалютнаяСуммаОстатокДт
        КОНЕЦ КАК СуммаОстаток,
        ХозрасчетныйОстатки.Субконто1.ЮИ_КодКраткий КАК КонтрагентКодКраткий,
        ХозрасчетныйОстатки.Субконто1.ЮИ_Регион КАК КонтрагентРегион
    ИЗ
        РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаПолученияОстатков, Счет В (&Счет), &ВидыСубконто, ) КАК ХозрасчетныйОстатки
    ГДЕ
        ХозрасчетныйОстатки.СуммаОстатокДт > 0) КАК ВложенныйЗапрос,
    РегистрСведений.ЗП_РегламентированныйПроизводственныйКалендарь КАК ЗП_РегламентированныйПроизводственныйКалендарь
ГДЕ
    ЗП_РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ВложенныйЗапрос.ДокументПоставки.Дата И &ДатаОтчета
    И ЗП_РегламентированныйПроизводственныйКалендарь.Пятидневка = 1
    И ЗП_РегламентированныйПроизводственныйКалендарь.ВидДня В(&ВидыДня)

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Контрагент,
    ВложенныйЗапрос.Договор,
    ВложенныйЗапрос.ДокументПоставки,
    ВложенныйЗапрос.ПроцентАванса,
    ВложенныйЗапрос.ВидОтсрочкиОплаты,
    ВложенныйЗапрос.СрокОплаты,
    ВложенныйЗапрос.КалендарныхДней,
    ВложенныйЗапрос.КонтрагентКодКраткий,
    ВложенныйЗапрос.КонтрагентРегион,
    ВложенныйЗапрос.СуммаОстаток
ИТОГИ
    СУММА(СуммаОстаток)
ПО
    КонтрагентРегион,
    Контрагент,
    Договор
7 Franchiser
 
гуру
31.08.18
17:18
Покажи обход. КонтрагентРегион = NULL ?
8 hhhh
 
31.08.18
17:19
(6) выборку покажи как делаешь, и установка параметров
9 treor
 
31.08.18
17:23
Установка параметров

Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
    Запрос.УстановитьПараметр("ДатаПолученияОстатков", Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая));
    
    СписокСчетов = Новый СписокЗначений();
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
    СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиВал);
    Запрос.УстановитьПараметр("Счет", СписокСчетов);
    
    ВидыСубконто = Новый СписокЗначений();
    ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
    ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
    ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами);
    Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
    
    ВидыДня = Новый СписокЗначений();
    ВидыДня.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
    ВидыДня.Добавить(Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
    Запрос.УстановитьПараметр("ВидыДня", ВидыДня);
10 treor
 
31.08.18
17:24
ВыборкаРегион = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "КонтрагентРегион");
    Пока ВыборкаРегион.Следующий() Цикл
        
        ОбластьРегион.Параметры.Регион = ВРег(ВыборкаРегион.КонтрагентРегион);
        ТабличныйДокумент.Вывести(ОбластьРегион);
        
        ВыборкаКОнтрагент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
        Пока ВыборкаКонтрагент.Следующий()Цикл
            
            ОбластьКонтрагент.Параметры.Контрагент = ВыборкаКОнтрагент.Контрагент;
            ТабличныйДокумент.Вывести(ОбластьКонтрагент);
            
            ИтогоПросроченоПоКонтрагенту = 0;
            ИтогоИстекаетСрокОплатыПоКОнтрагенту = 0;
            ИтогоМожноОтложитьОплатуПоКонтрагенту = 0;
            
            ВыборкаДоговор = ВыборкаКОнтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Договор");
            Пока ВыборкаДоговор.Следующий() Цикл
                
                ОбластьДоговор.Параметры.Договор = ВыборкаДоговор.Договор;
                ОбластьДоговор.Параметры.Валюта =  ВыборкаДоговор.Договор.ВалютаВзаиморасчетов;
                ТабличныйДокумент.Вывести(ОбластьДоговор);
                
                ВыборкаЗапись = ВыборкаДоговор.Выбрать();
                Пока ВыборкаЗапись.Следующий() Цикл
                    
                    ПолучитьСуммыДляОплаты(СуммыДляОплаты, ВыборкаЗапись);
                    
                    ОбластьЗапись.Параметры.Документ = ВыборкаЗапись.ДокументПоставки;
                    ОбластьЗапись.Параметры.СуммаПросрочено = СуммыДляОплаты.СуммаПросрочено;
                    ОбластьЗапись.Параметры.СуммаИстекаетСрокОплаты = СуммыДляОплаты.СуммаИстекаетСрокОплаты;
                    ОбластьЗапись.Параметры.СуммаМожноОтложитьОплату = СуммыДляОплаты.СуммаМожноОтложитьОплату;
                    ТабличныйДокумент.Вывести(ОбластьЗапись);
                    
                    ИтогоПросроченоПоКонтрагенту = ИтогоПросроченоПоКонтрагенту + СуммыДляОплаты.СуммаПросрочено;
                    ИтогоИстекаетСрокОплатыПоКОнтрагенту = ИтогоИстекаетСрокОплатыПоКОнтрагенту + СуммыДляОплаты.СуммаИстекаетСрокОплаты;
                    ИтогоМожноОтложитьОплатуПоКонтрагенту = ИтогоМожноОтложитьОплатуПоКонтрагенту + СуммыДляОплаты.СуммаМожноОтложитьОплату;
                КонецЦикла;
                
            КОнецЦикла;
            
            ОбластьИтогоПоКонтрагенту.Параметры.ИтогоПросроченоПоКонтрагенту = ИтогоПросроченоПоКонтрагенту;
            ОбластьИтогоПоКонтрагенту.Параметры.ИтогоИстекаетСрокОплатыПоКОнтрагенту = ИтогоИстекаетСрокОплатыПоКОнтрагенту;
            ОбластьИтогоПоКонтрагенту.Параметры.ИтогоМожноОтложитьОплатуПоКонтрагенту = ИтогоМожноОтложитьОплатуПоКонтрагенту;
            ТабличныйДокумент.Вывести(ОбластьИтогоПоКонтрагенту);
            
            ТабличныйДокумент.Вывести(ОбластьПустаяСтрока);
        КОнецЦикла;
        
    КОнецЦикла;
11 Franchiser
 
гуру
31.08.18
17:28
Это что такое?
ВыборкаКОнтрагент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
12 Franchiser
 
гуру
31.08.18
17:30
Нужно так:
ВыборкаКОнтрагент = ВыборкаРегион.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
13 Franchiser
 
гуру
31.08.18
17:33
Это зачем?
ТабличныйДокумент.Вывести(ОбластьПустаяСтрока);
14 treor
 
31.08.18
17:33
(11) Ctrl+C Ctrl+V((( и невнимательность. А главное думаю, чего он так тормозит в этом месте. Короче "гляжу в книгу - вижу фигу!"(((
15 Franchiser
 
гуру
31.08.18
17:35
(14) Рита, ну так нельзя!
16 treor
 
31.08.18
17:39
(13) Спасибо, работает)
17 treor
 
31.08.18
17:40
(15)постараюсь...( может дадите оценку того как написан запрос в целом? Может бросилось в глаза еще что-нибудь как делать нельзя
18 treor
 
31.08.18
17:42
задача была по поставщикам определить какие суммы на дату формирования отчета по условиям договора просрочены, какие нужно оплатить в течении дня и какие можно отложить
19 Franchiser
 
гуру
31.08.18
17:44
Вложенный запрос не желательно использовать, вместо списка значений лучше передавать массив. Но это если придираться.
20 treor
 
31.08.18
17:46
(19) "Вложенный запрос не желательно использовать"
По другому не придумала как в одном запросе и остатки получить и банковские дни рассчитать
21 Franchiser
 
гуру
31.08.18
17:49
ОбластьКонтрагент.Параметры.Контрагент = ВыборкаКОнтрагент.Контрагент;

Вместь это можно написать ЗаполнитьЗначенияСвойств(ОбластьКонтрагент.Параметры, ВыборкаКОнтрагент)
22 Franchiser
 
гуру
31.08.18
17:50
(20) Временные таблицы
23 Franchiser
 
гуру
31.08.18
17:51
(21) Точнее так:
ОбластьКонтрагент.Параметры.Заполнить(ВыборкаКОнтрагент)
24 treor
 
31.08.18
17:53
(22)спасибо. с 1с8 работаю недавно. С временными таблицами пока самой не доводилось работать. Буду разбираться. Еще раз спасибо!!!
25 Franchiser
 
гуру
31.08.18
17:57
Группировать по ВложенныйЗапрос.СуммаОстаток неправильно, нужно суммировать