База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как сгруппировать и агрегировать данные по элементам и группам складов в 1С? › Ответ в теме: Как сгруппировать и агрегировать данные по элементам и группам складов в 1С?
Чтобы вывести сумму по группе «Склады» и саму группу, а также сумму по элементу «Склады» и сам элемент, нужно в запрос добавить группировку и агрегацию по складам, учитывая, что склады — иерархический справочник.
В вашем случае, условие по складу сейчас стоит так:
|
1 |
ТоварыНаСкладахОстатки.Склад В Иерархии (&Склад1) |
Это выбирает все склады, которые входят в иерархию заданной группы &Склад1, включая саму группу и все вложенные элементы.
Чтобы получить сумму по группе и по элементу, нужно:
1. В выборке добавить группировку по складу (элементу) и по родителю (группе).
2. Для групп использовать поле Родитель, чтобы получить сумму по группе.
3. Сделать объединение результатов по элементам и по группам.
Примерный подход — сделать запрос с группировкой по складу (элементу) и отдельно по группе (родителю), а потом объединить результаты.
Вот пример, как можно переписать ваш запрос, чтобы получить суммы по группе и по элементу:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Получаем суммы по элементам складов ВЫБРАТЬ тОстаткиНаСкладах.Склад КАК Склад, тОстаткиНаСкладах.Склад КАК ЭлементСклада, NULL КАК ГруппаСклада, СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК Сумма ИЗ тОстаткиНаСкладах КАК тОстаткиНаСкладах ГДЕ тОстаткиНаСкладах.Склад В ИЕРАРХИИ(&Склад1) СГРУППИРОВАТЬ ПО тОстаткиНаСкладах.Склад ОБЪЕДИНИТЬ ВСЕ // Получаем суммы по группам складов (родителям) ВЫБРАТЬ Родители.Ссылка КАК Склад, NULL КАК ЭлементСклада, Родители.Ссылка КАК ГруппаСклада, СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК Сумма ИЗ тОстаткиНаСкладах КАК тОстаткиНаСкладах ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Родители ПО тОстаткиНаСкладах.Склад.Родитель = Родители.Ссылка ГДЕ Родители.Ссылка В ИЕРАРХИИ(&Склад1) СГРУППИРОВАТЬ ПО Родители.Ссылка |
Объяснение:
— В первой части запроса мы группируем по самим элементам складов, выводим их и сумму остатков.
— Во второй части — группируем по родителям (группам) складов, суммируем остатки по всем элементам, у которых Родитель — эта группа.
— Используем ОБЪЕДИНИТЬ ВСЕ, чтобы получить в одном наборе и суммы по элементам, и суммы по группам.
— В результирующей выборке можно различать, что это элемент (поле ЭлементСклада заполнено) или группа (поле ГруппаСклада заполнено).
Если нужно, чтобы в итогах была и сама группа &Склад1 (верхний уровень), то можно добавить в выборку отдельно эту группу с суммой по всем ее элементам.
Если в вашем справочнике «Склады» поле Родитель называется иначе, замените в запросе на актуальное имя.
Также, если нужно получить суммы по всем уровням иерархии, можно использовать рекурсивный запрос или конструкцию В ИЕРАРХИИ для группировки.
Если хотите получить суммы по всем уровням иерархии, можно сделать так:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ВЫБРАТЬ Склады.Ссылка КАК Склад, СКОЛЬКО_УРОВНЕЙ(Склады.Ссылка, &Склад1) КАК Уровень, СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК Сумма ИЗ тОстаткиНаСкладах КАК тОстаткиНаСкладах ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады ПО тОстаткиНаСкладах.Склад В ИЕРАРХИИ(Склады.Ссылка) ГДЕ Склады.Ссылка В ИЕРАРХИИ(&Склад1) СГРУППИРОВАТЬ ПО Склады.Ссылка, СКОЛЬКО_УРОВНЕЙ(Склады.Ссылка, &Склад1) |
(Функция СКОЛЬКО_УРОВНЕЙ — условное название, в 1С нет такой стандартной, но можно реализовать через рекурсивный запрос.)
Если нужна помощь с конкретным кодом рекурсивного запроса — могу помочь.
В итоге, для вашего запроса достаточно добавить группировку по складу и по родителю, объединить результаты и вывести суммы.
https://helpf.pro/faq/view/692.html