База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 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 |
// 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 |
ВЫБРАТЬ | тОстаткиНаСкладах.Номенклатура КАК Номенклатура, | Номенклатура.Родитель КАК Группа, | тОстаткиНаСкладах.Склад КАК Склад, | СУММА(тОстаткиНаСкладах.ОстатокКорп + тОстаткиНаСкладах.ОстатокВПути) КАК ОстатокЭлемента, | (ВЫБРАТЬ | СУММА(т2.ОстатокКорп + т2.ОстатокВПути) | ИЗ | тОстаткиНаСкладах КАК т2 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Н2 | ПО т2.Номенклатура = Н2.Ссылка | ГДЕ | Н2.Родитель = Номенклатура.Родитель | И т2.Склад = тОстаткиНаСкладах.Склад | ) КАК ОстатокПоГруппе |ИЗ | тОстаткиНаСкладах КАК тОстаткиНаСкладах | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура | ПО тОстаткиНаСкладах.Номенклатура = Номенклатура.Ссылка |ГДЕ | тОстаткиНаСкладах.Склад В ИЕРАРХИИ(&Склад1) |СГРУППИРОВАТЬ ПО | тОстаткиНаСкладах.Номенклатура, | Номенклатура.Родитель, | тОстаткиНаСкладах.Склад |
В этом запросе:
— Для каждого элемента выводится его остаток (ОстатокЭлемента).
— Через подзапрос считается сумма по группе (ОстатокПоГруппе).
— Выводится ссылка на группу (Номенклатура.Родитель).
Если нужно вывести саму группу (например, наименование), то можно добавить в выборку:
|
1 |
| ГруппаНаименование.Наименование КАК НаименованиеГруппы |
с соответствующим соединением:
|
1 2 |
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ГруппаНаименование | ПО Номенклатура.Родитель = ГруппаНаименование.Ссылка |
Таким образом, вы получите в одном запросе и сумму по элементу, и сумму по группе, и ссылки на группу и элемент.
—
Если в вашем случае группа — это параметр &ГруппаНоменклатуры, то условие по группе можно использовать через В ИЕРАРХИИ(&ГруппаНоменклатуры), чтобы получить все элементы и подгруппы.
—
Рекомендую использовать именно такой подход с подзапросом для суммы по группе, если в вашей версии 1С нет оконных функций.
—
Рекомендации по оптимизации:
— Если данных много, лучше предварительно выгрузить остатки в временную таблицу.
— Используйте индексы по ссылкам и родителям.
— Проверяйте план запроса.
—
https://helpf.pro/faq8/view/918.html — про группировку и суммирование в табличных частях и запросах