Как вывести в запросе 1С сумму по группе и элементу одновременно?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как вывести в запросе 1С сумму по группе и элементу одновременно?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35963
      Фото аватараOdineski
      Участник

        есть Запрос 1С в условии группа справочника и элемент справочника, вывести сумму по группе и саму группу, сумму и элемент
        ВЫБРАТЬ
        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        ВЫБОР
        КОГДА ТоварыНаСкладахОстатки.Склад.VEH_ТипСклада В (&МассивТипыСкладовКорп)
        ТОГДА ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0)
        ИНАЧЕ 0
        КОНЕЦ КАК ОстатокКорп,
        0 КАК ОстатокВПути,
        ТоварыНаСкладахОстатки.Склад КАК Склад
        ПОМЕСТИТЬ тОстаткиНаСкладах
        ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки({(&Дата)}, ) КАК ТоварыНаСкладахОстатки
        ГДЕ

        ТоварыНаСкладахОстатки.Склад В Иерархии (&Склад1)

        ОБЪЕДИНИТЬ ВСЕ

        ВЫБРАТЬ
        ЗапасыИПотребностиОстатки.Номенклатура,
        0,
        ЕСТЬNULL(ЗапасыИПотребностиОстатки.ПоступитОстаток, 0),
        ЗапасыИПотребностиОстатки.Склад
        ИЗ
        РегистрНакопления.ЗапасыИПотребности.Остатки({(&Дата)}, ТИПЗНАЧЕНИЯ(Заказ) = ТИП(Документ.ПеремещениеТоваров)) КАК ЗапасыИПотребностиОстатки
        ГДЕ
        ЗапасыИПотребностиОстатки.Склад В Иерархии (&Склад1)

        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        тОстаткиНаСкладах.Номенклатура.Код КАК Код,
        тОстаткиНаСкладах.Номенклатура КАК Номенклатура,
        СУММА(тОстаткиНаСкладах.ОстатокКорп) + СУММА(тОстаткиНаСкладах.ОстатокВПути) КАК ОстатокКорп,
        тОстаткиНаСкладах.Номенклатура.VEH_Категория КАК Категория,
        тОстаткиНаСкладах.Номенклатура.VEH_Система КАК Система,
        VEH_ОтборДляСнабжения.ЦенаССеб КАК ЦенаСеб,
        тОстаткиНаСкладах.Склад КАК Склад
        ИЗ
        тОстаткиНаСкладах КАК тОстаткиНаСкладах
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.VEH_ОтборДляСнабжения КАК VEH_ОтборДляСнабжения
        ПО тОстаткиНаСкладах.Номенклатура = VEH_ОтборДляСнабжения.Номенклатура

        СГРУППИРОВАТЬ ПО
        тОстаткиНаСкладах.Номенклатура.Код,
        тОстаткиНаСкладах.Номенклатура,
        тОстаткиНаСкладах.Номенклатура.VEH_Категория,
        тОстаткиНаСкладах.Номенклатура.VEH_Система,
        VEH_ОтборДляСнабжения.ЦенаССеб,
        тОстаткиНаСкладах.Склад

      • #35964
        bot_avaOdin — Одинэсник
        Участник

          Чтобы вывести одновременно сумму по группе, саму группу, сумму и элемент справочника в 1С запросе, нужно использовать конструкцию с объединением данных по элементам и группам, применяя условие В ИЕРАРХИИ для групп и группировку по элементам и группам.

          В вашем случае, у вас есть запрос с выборкой остатков по складам и номенклатуре, где в условии участвует группа складов (&Склад1) с использованием В ИЕРАРХИИ.

          Для вывода суммы по группе и по элементу одновременно, нужно:

          1. В выборке добавить группировку по группе (например, по полю Родитель или по ссылке группы).
          2. Сделать отдельный запрос, который суммирует остатки по группе (включая все подчиненные элементы).
          3. Объединить результаты по элементам и по группе.

          Примерный подход:

          Если нужно вывести в одной выборке и сумму по группе, и сумму по элементу, и саму группу, то можно сделать так:

          — В выборке добавить поле группы (Родитель) для каждого элемента.
          — Использовать оконные функции (если поддерживаются) или подзапросы для суммы по группе.

          Пример с подзапросом:

          В этом запросе:

          — Для каждого элемента выводится его остаток (ОстатокЭлемента).
          — Через подзапрос считается сумма по группе (ОстатокПоГруппе).
          — Выводится ссылка на группу (Номенклатура.Родитель).

          Если нужно вывести саму группу (например, наименование), то можно добавить в выборку:

          с соответствующим соединением:

          Таким образом, вы получите в одном запросе и сумму по элементу, и сумму по группе, и ссылки на группу и элемент.

          Если в вашем случае группа — это параметр &ГруппаНоменклатуры, то условие по группе можно использовать через В ИЕРАРХИИ(&ГруппаНоменклатуры), чтобы получить все элементы и подгруппы.

          Рекомендую использовать именно такой подход с подзапросом для суммы по группе, если в вашей версии 1С нет оконных функций.

          Рекомендации по оптимизации:

          — Если данных много, лучше предварительно выгрузить остатки в временную таблицу.
          — Используйте индексы по ссылкам и родителям.
          — Проверяйте план запроса.


          https://helpf.pro/faq8/view/918.html — про группировку и суммирование в табличных частях и запросах

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С