Итоги в запросах 1С

Для чего нужны итоги

Итоги позволяют получить некоторый итог в запросе без сворачивания детальных записей.

Например, получим выборку из справочника номенклатура в некоторой условной конфигурации. В полях выберем код, наименование и качество:

ВЫБРАТЬ
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Качество КАК Качество
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НE СпрНоменклатура.ЭтоГруппа

Как мы видим, качество может быть трех видов: новый, ограниченно годен и не годен. Нам нужно подсчитать сколько есть позиций каждого качества, но без потери данных по наименованию и коду. То есть сгруппировать по качеству и подсчитать количество различных ссылок не получится.

Для решения данной задачи можно использовать итоги:

ВЫБРАТЬ
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Качество КАК Качество
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НE СпрНоменклатура.ЭтоГруппа
 
ИТOГИ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код)
ПО
	Качество

В результат запроса добавились 3 новые записи (выделены зеленым цветом). По одной для каждого качества. Это и есть итоги. Причем в колонке «Код» для итоговых записей будет количество детальных записей, потому что именно такую функцию мы указали в тексте запроса: КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код). Также мы не потеряли информацию по коду и наименованию для детальных записей.

Теперь мы можем сказать, что с качеством «Новый» 3 записи, с качеством «Не годен» 2 записи, с качеством «Ограниченно годен» 1 запись.

Синтаксис секции итогов

После ключевого слова ИТОГИ указываются итоговые поля, обычно для них применяется какая-нибудь агрегатная функция (сумма, количество, максимум, минимум, среднее). Таких полей может быть несколько, тогда они перечисляются через запятую. После ключевого слова ПО перечисляются поля, для которых нужно рассчитать итоги. Если их несколько, то тоже через запятую.

В итоговых полях можно использовать только те поля, которые есть в секции ВЫБРАТЬ. При этом не обязательное нужно использовать все поля. В секции ПО можно указать любое поле таблицы, даже если его нет в секции ВЫБРАТЬ.

Итоги рассчитываются платформой, а не средствами СУБД.

Итоги по нескольким полям

Для примера добавим в запрос итог по полю «Производитель»:

ВЫБРАТЬ
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Качество КАК Качество,
	СпрНоменклатура.Производитель КАК Производитель
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НE СпрНоменклатура.ЭтоГруппа
 
ИТOГИ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код)
ПО
	Производитель,
	Качество

Сначала были получены итоги по полю «Производитель» (выделены синим цветом), а потом внутри производителя итоги по качеству (выделены зеленым цветом).

Общие итоги

Если в секции ПО указать ключевое слово ОБЩИЕ, то будет добавлена еще одна строка с рассчитанными итогами для всех детальных записей:

ВЫБРАТЬ
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Качество КАК Качество,
	СпрНоменклатура.Производитель КАК Производитель
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НE СпрНоменклатура.ЭтоГруппа
 
ИТOГИ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код)
ПО
	ОБЩИЕ,
	Производитель,
	Качество

Первая строка — это общие итоги.

Иерархия итогов

Для примера выберем в запросе строки документов поступления:

ВЫБРАТЬ
	ДокПоступления.Ссылка КАК Ссылка,
	ДокПоступления.НомерСтроки КАК НомерСтроки,
	ДокПоступления.Номенклатура КАК Номенклатура
ИЗ
	Документ.ПоступлениеТоваров.Товары КАК ДокПоступления

Теперь добавим иерархические итоги по полю Номенклатура. Для этого после группировочного поля нужно указать ключевое слово ИЕРАРХИЯ:

ВЫБРАТЬ
	ДокПоступления.Ссылка КАК Ссылка,
	ДокПоступления.НомерСтроки КАК НомерСтроки,
	ДокПоступления.Номенклатура КАК Номенклатура
ИЗ
	Документ.ПоступлениеТоваров.Товары КАК ДокПоступления
ИТOГИ ПО
	Номенклатура ИЕРАРХИЯ

Зеленым цветом выделены обычные итоги по номенклатуре, а синим иерархические. В результат запроса были добавлены группы номенклатуры, в которых находятся элементы номенклатуры из документов поступления:

Если указать ТОЛЬКО ИЕРАРХИЯ, то в результате не будет обычных итогов, будут только иерархические итоги:

ВЫБРАТЬ
	ДокПоступления.Ссылка КАК Ссылка,
	ДокПоступления.НомерСтроки КАК НомерСтроки,
	ДокПоступления.Номенклатура КАК Номенклатура
ИЗ
	Документ.ПоступлениеТоваров.Товары КАК ДокПоступления
ИТOГИ ПО
	Номенклатура ТОЛЬКО ИЕРАРХИЯ

Прочие операции с итогами

Если в запросе есть СГРУППИРОВАТЬ ПО и для итогов не указана агрегатная функция, то для итогов будет использована агрегатная функция группировок:

ВЫБРАТЬ
	СпрНоменклатура.Производитель КАК Производитель,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СпрНоменклатура.Ссылка) КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	НE СпрНоменклатура.ЭтоГруппа
 
СГРУППИРОВАТЬ ПО
	СпрНоменклатура.Производитель
ИТOГИ ПО
	Производитель

В агрегатных функциях итогов можно использовать конструкцию ВЫБОР КОГДА … ТОГДА, произвольные выражения:

ВЫБРАТЬ
	ДокПоступления.Номенклатура КАК Номенклатура,
	ДокПоступления.Количество КАК Количество,
	ДокПоступления.Цена КАК Цена,
	ДокПоступления.Сумма КАК Сумма
ИЗ
	Документ.ПоступлениеТоваров.Товары КАК ДокПоступления
ИТOГИ
	ВЫБОР
		КОГДА СУММА(Количество) = 0
			ТОГДА 0
		ИНАЧЕ СУММА(Сумма) / СУММА(Количество)
	КОНЕЦ КАК Сумма
ПО
	Номенклатура

Обход итогов запроса во встроенном языке

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	СпрКонтрагенты.Ссылка КАК Ссылка,
               |	СпрКонтрагенты.Наименование КАК Наименование,
               |	СпрКонтрагенты.ЭтоГруппа КАК ЭтоГруппа,
               |	СпрКонтрагенты.Город КАК Город
               |ИЗ
               |	Справочник.Контрагенты КАК СпрКонтрагенты
               |ИТOГИ ПО
               |	Город";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаГород = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
//ВыборкаГород  - в выборке будут только итоговые записи
Пока ВыборкаГород.Следующий() Цикл
	Выборка = ВыборкаГород.Выбрать();
	//Выборка - только детальные записи внутри итоговой записи
	Пока Выборка.Следующий() Цикл
 
	КонецЦикла;	
КонецЦикла;

В методе Выбрать() нужно указать параметр ОбходРезультатаЗапроса.ПоГруппировкам, тогда будет получена выборка по итоговым записям. Чтобы получить детальные записи внутри итоговой, нужно от итоговой выборки получить еще одну выборку методом Выбрать().

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: