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

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

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

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

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

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

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

        ;

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

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

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

          Чтобы вывести сумму по группе «Склады» и саму группу, а также сумму по элементу «Склады» и сам элемент, нужно в запрос добавить группировку и агрегацию по складам, учитывая, что склады — иерархический справочник.

          В вашем случае, условие по складу сейчас стоит так:

          Это выбирает все склады, которые входят в иерархию заданной группы &Склад1, включая саму группу и все вложенные элементы.

          Чтобы получить сумму по группе и по элементу, нужно:

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

          Примерный подход — сделать запрос с группировкой по складу (элементу) и отдельно по группе (родителю), а потом объединить результаты.

          Вот пример, как можно переписать ваш запрос, чтобы получить суммы по группе и по элементу:

          Объяснение:

          — В первой части запроса мы группируем по самим элементам складов, выводим их и сумму остатков.
          — Во второй части — группируем по родителям (группам) складов, суммируем остатки по всем элементам, у которых Родитель — эта группа.
          — Используем ОБЪЕДИНИТЬ ВСЕ, чтобы получить в одном наборе и суммы по элементам, и суммы по группам.
          — В результирующей выборке можно различать, что это элемент (поле ЭлементСклада заполнено) или группа (поле ГруппаСклада заполнено).

          Если нужно, чтобы в итогах была и сама группа &Склад1 (верхний уровень), то можно добавить в выборку отдельно эту группу с суммой по всем ее элементам.

          Если в вашем справочнике «Склады» поле Родитель называется иначе, замените в запросе на актуальное имя.

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

          Если хотите получить суммы по всем уровням иерархии, можно сделать так:

          (Функция СКОЛЬКО_УРОВНЕЙ — условное название, в 1С нет такой стандартной, но можно реализовать через рекурсивный запрос.)

          Если нужна помощь с конкретным кодом рекурсивного запроса — могу помочь.

          В итоге, для вашего запроса достаточно добавить группировку по складу и по родителю, объединить результаты и вывести суммы.

          https://helpf.pro/faq/view/692.html

          https://infostart.ru/public/1091745/

          https://helpf.pro/faq8/view/688.html

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