Имя: Пароль:
1C
1С v8
Обход по группировкам запроса
0 ONE1
 
26.12.22
11:58
https://ibb.co/znVJJWh - получаю такие данные из запроса.

Потом перебираю в группировках. Но почему-то ВыборкаДетальныеЗаписи только один заказ выводит :_с Помогите пожалуйста 🙏

РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаОрганизация = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаОрганизация.Следующий() Цикл
        
        ВыборкаДатаОтгрузки = ВыборкаОрганизация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока ВыборкаДатаОтгрузки.Следующий() Цикл
            
            ВыборкаАдресДоставки = ВыборкаДатаОтгрузки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаАдресДоставки.Следующий() Цикл
                
                ВыборкаГруппаФинансовогоУчета = ВыборкаАдресДоставки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                Пока ВыборкаГруппаФинансовогоУчета.Следующий() Цикл
                    
                    ВыборкаСпособДоставки = ВыборкаГруппаФинансовогоУчета.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                    Пока ВыборкаСпособДоставки.Следующий() Цикл
                        
                        ВыборкаПартнер = ВыборкаСпособДоставки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                        Пока ВыборкаПартнер.Следующий() Цикл    
                            
                            ВыборкаВнутреннийПартнер = ВыборкаПартнер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                            Пока ВыборкаВнутреннийПартнер.Следующий() Цикл
                                
                                ВыборкаВнутреннийКонтрагент = ВыборкаВнутреннийПартнер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                Пока ВыборкаВнутреннийКонтрагент.Следующий() Цикл
                                    
                                    ВыборкаДопСвойство = ВыборкаВнутреннийКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                    Пока ВыборкаДопСвойство.Следующий() Цикл
                                        
                                        ВыборкаВнутренняяОперация = ВыборкаДопСвойство.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                        Пока ВыборкаВнутренняяОперация.Следующий() Цикл
                                            
                                            ВыборкаДетальныеЗаписи = ВыборкаВнутренняяОперация.Выбрать();
                                            
                                            ТаблицаЗаказов = Новый ТаблицаЗначений;
                                            ТаблицаЗаказов.Колонки.Добавить("Заказ");
                                            
                                            Группировки = ТаблицаГруппировок.Добавить();
                                            
                                            Группировки.СтрокаГруппировки = ""
                                            + ВыборкаВнутренняяОперация.Организация + " / "
                                            + ВыборкаВнутренняяОперация.Партнер + " / "
                                            + Формат(ВыборкаВнутренняяОперация.ДатаОтгрузки, "ДФ=dd.MM.yyyy") + " / "
                                            + ВыборкаВнутренняяОперация.АдресДоставки + " / "
                                            + ВыборкаВнутренняяОперация.ГруппаФинансовогоУчета + " / "
                                            + ВыборкаВнутренняяОперация.СпособДоставки + " / "
                                            + ВыборкаВнутренняяОперация.ВнутренняяОперация + " / "
                                            + ВыборкаВнутренняяОперация.ВнутреннийПартнер + " / "
                                            + ВыборкаВнутренняяОперация.НеОбъединятьЗаказ;
                                            
                                            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                                                СтрокаЗаказ = ТаблицаЗаказов.Добавить();
                                                СтрокаЗаказ.Заказ = ВыборкаДетальныеЗаписи.Заказ;
                                            КонецЦикла;
                                            
                                            Группировки.ТаблицаЗаказов = ТаблицаЗаказов;
                                        КонецЦикла;
                                        
                                    КонецЦикла;
                                КонецЦикла;
                            КонецЦикла;
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
1 Ryzeman
 
26.12.22
12:01
Господи... ТС, что этот код по-твоему в принципе должен делать?...
2 ONE1
 
26.12.22
12:05
(1) он группирует заказы, и потом если все данные заказов совпадают, то создается объединенная реализация из нескольких заказов :)
3 Ryzeman
 
26.12.22
12:16
Ну, я рискну предположить, что ты забыл указать параметры в методах Выбрать(), но даже если укажешь, это не будет работать как ты хочешь. Здесь вообще не нужно 100500 вложенных циклов.

https://its.1c.ru/db/pubqlang/content/65/hdoc

Выведи итоги по нужным полям и сгруппируй один раз.
4 Kassern
 
26.12.22
12:20
(0) Я конечно много чего повидал, но такое впервые))
5 ONE1
 
26.12.22
12:24
Это не мое :(( Меня просто попросили в это добавить колонку "НеОбъединятьЗаказ", а оно так выглядит страшно и не понятно и не работает добавив гусеничку еще одну
6 Kassern
 
26.12.22
12:26
(5) Скрин с группировкой итогов покажите
7 Гипервизор
 
26.12.22
12:27
(0) Больше циклов Богу циклов! )
8 ONE1
 
26.12.22
12:34
Сам запрос такой: ВЫБРАТЬ РАЗРЕШЕННЫЕ
        | ДополнительныеСведения.Свойство КАК Свойство,
        | ДополнительныеСведения.Значение КАК Значение,
        | ДополнительныеСведения.Объект КАК Объект
        |ПОМЕСТИТЬ ВТДопСвойстваЗаказа
        |ИЗ
        | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
        |ГДЕ
        | ДополнительныеСведения.Объект В (&Заказы);
        |/////////////////////
        |ВЫБРАТЬ
        |    втЗаказы.Заказ КАК Заказ
        |ПОМЕСТИТЬ втЗаказ
        |ИЗ
        |    &Заказы КАК втЗаказы
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ЗаказКлиента.Ссылка КАК Заказ,
        |    ЗаказКлиента.Организация КАК Организация,
        |    ЗаказКлиента.Партнер КАК Партнер,
        |    ЗаказКлиента.ДатаОтгрузки КАК ДатаОтгрузки,
        |    ЗаказКлиента.АдресДоставки КАК АдресДоставки,
        |    ЗаказКлиента.ГруппаФинансовогоУчета КАК ГруппаФинансовогоУчета,
        |    ЗаказКлиента.СпособДоставки КАК СпособДоставки,
        |    ЗаказКлиента.яядВнутренняяОперация КАК ВнутренняяОперация,
        |    ЗаказКлиента.яядВнутреннийКонтрагент КАК ВнутреннийКонтрагент,
        |    ЗаказКлиента.яядВнутреннийПартнер КАК ВнутреннийПартнер,
        |    ЕСТЬNULL(ВТДопСвойстваЗаказа.Значение , Ложь) КАК НеОбъединятьЗаказ
        |ИЗ
        |    втЗаказ КАК втЗаказ
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
        |        ПО втЗаказ.Заказ = ЗаказКлиента.Ссылка
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.яядДокументыРеализации КАК ЗаказКлиентаяядДокументыРеализации
        |        ПО втЗаказ.Заказ = ЗаказКлиентаяядДокументыРеализации.Ссылка
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТДопСвойстваЗаказа КАК ВТДопСвойстваЗаказа
        |        ПО втЗаказ.Заказ = ВТДопСвойстваЗаказа.Объект
        |ГДЕ
        |    ЗаказКлиентаяядДокументыРеализации.ДокументРеализации ЕСТЬ NULL
        |ИТОГИ ПО
        |    Организация,
        |    ДатаОтгрузки,
        |    АдресДоставки,
        |    ГруппаФинансовогоУчета,
        |    СпособДоставки,
        |    Партнер,
        |    ВнутреннийПартнер,
        |    ВнутреннийКонтрагент,
        |    ВнутренняяОперация,
        |    НеОбъединятьЗаказ
9 Fedor-1971
 
26.12.22
12:54
(0) ТаблицаЗаказов каждый раз создаётся в цикле
(8) в таком запросе нужен ещё один цикл выборки НеОбъединятьЗаказ  перед Детальными записями
10 ass1c
 
26.12.22
13:31
(0) Начни не с этого

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

А с этого

ВыборкаОрганизация = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Организация");
   Пока ВыборкаОрганизация.Следующий() Цикл
        //и иди вниз до самой последней группировки "НеОбъединятьЗаказ"
        //что бы не запутаться добавляй второй параметр выборки - название группировки (а то приходится смотреть порядок в запросе)
        //и уже в последней группировки с помощью выбрать получишь все свои данные
11 Kassern
 
26.12.22
13:36
(10) Я бы вообще эту лесенку убрал. Смысл обходить группировки в которых ничего не обрабатывается? Тогда уж лучше сразу сгруппировать данные и обойти один цикл без группировок.
12 ass1c
 
26.12.22
13:53
(11) + Да само собой всегда есть способ сделать лучше, правильнее и т.д. Но на мисте часто себе дороже объяснять как и что можно сделать более правильно
13 Said_We
 
26.12.22
14:53
(8) Опять прикалываться начали....

Убирай все итоги: "|ИТОГИ ПО...".

ВыборкаЗапроса = Запрос.Выполнить().Выбрать();  // простая прямая выборка - у тебя нет агрегатных функций для итогов, значит итоги не нужны.
Пока ВыборкаЗапроса.Следующий() Цикл
....
КонецЦикла;

Не понял я зачем в таблицу значений засовывать заказы и потом эту таблицу в поле "ТаблицаЗаказов". Но если так сильно надо, то это максимум одна группировка. Какая не скажу так как логику задачи не озвучили. А когда озвучите, то скорее всего, окажется что весь запрос не нужен будет и всё уже реализовано, только надо какую-нибудь галочку включить или отчетом готовым воспользоваться. Обычно так.