- ИТОГИ в запросе 1С 8.3
- Для чего нужны итоги
- Синтаксис секции итогов
- Итоги по нескольким полям
- Запросы 1С:Предприятие 8. Итоги
- Задача 1. Подсчет итогов по нескольким полям.
- Задача 2. Группировка записей по полю.
- Задача 3. Подсчет итогов по полю с учетом иерархии.
- Задача 4. Подсчет итогов только по иерархии.
- Как обойти результат запроса с итогами
- Итоги по объединенной совокупности группировок в запросе
- 1С 8.3 Итоги в запросе — Программист 1С Минск. Автоматизация бизнеса.
- 1С 8.3 Итоги в запросе
- Использование СГРУППИРОВАТЬ ПО и ИТОГИ, Виртуальные таблицы
ИТОГИ в запросе 1С 8.3
Для чего нужны итоги
Итоги позволяют получить некоторый итог в запросе без сворачивания детальных записей.
Например, получим выборку из справочника номенклатура в некоторой условной конфигурации. В полях выберем код, наименование и качество:
Как мы видим, качество может быть трех видов: новый, ограниченно годен и не годен. Нам нужно подсчитать сколько есть позиций каждого качества, но без потери данных по наименованию и коду. То есть сгруппировать по качеству и подсчитать количество различных ссылок не получится.
Для решения данной задачи можно использовать итоги:
В результат запроса добавились 3 новые записи (выделены зеленым цветом). По одной для каждого качества. Это и есть итоги. Причем в колонке «Код» для итоговых записей будет количество детальных записей, потому что именно такую функцию мы указали в тексте запроса: КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код). Также мы не потеряли информацию по коду и наименованию для детальных записей.
Теперь мы можем сказать, что с качеством «Новый» 3 записи, с качеством «Не годен» 2 записи, с качеством «Ограниченно годен» 1 запись.
Синтаксис секции итогов
После ключевого слова ИТОГИ указываются итоговые поля, обычно для них применяется какая-нибудь агрегатная функция (сумма, количество, максимум, минимум, среднее). Таких полей может быть несколько, тогда они перечисляются через запятую. После ключевого слова ПО перечисляются поля, для которых нужно рассчитать итоги. Если их несколько, то тоже через запятую.
В итоговых полях можно использовать только те поля, которые есть в секции ВЫБРАТЬ. При этом не обязательное нужно использовать все поля. В секции ПО можно указать любое поле таблицы, даже если его нет в секции ВЫБРАТЬ.
Итоги рассчитываются платформой, а не средствами СУБД.
Итоги по нескольким полям
Для примера добавим в запрос итог по полю «Производитель»:
Источник
Запросы 1С:Предприятие 8. Итоги
Итоги в запросах 1С чем-то похожи на группировки. Они имеют ту же задачу — произвести математические или статистические операции над данными выборки. Но имеются и существенные различия:
- Итоги добавляют строки к данным выборки, в то время как группировки сворачивают выборку и строк становится меньше.
- Итоги можно рассчитывать по всем данным выборки или по отдельным полям, при этом, в отличие от группировок, могут оставаться поля, которые не являются ни итоговыми, ни группировочными.
- Итоги могут учитывать иерархию.
Для начала немного теории. Секция итогов в запросах 1С состоит из двух разделов.
Первый начинается с ключевого слова ИТОГИ и содержит итоговые поля с применяемой к ним агрегатной функцией. Этот раздел может оставаться пустым, тогда в результате запроса получится просто группировка по полям следующего раздела без подсчета итоговых данных.
Существует 6 видов агрегатных функций, применяемых при группировках:
- СУММА — суммирует значения группируемого столбца, применяется только для числовых значений.
- СРЕДНЕЕ — вычисляет среднее арифметическое из значений группируемого столбца, применяется только для числовых значений.
- МАКСИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается максимальное значение из всех группируемых. Если значения не числовые, то возвращается последнее при сортировке по возрастанию.
- МИНИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается минимальное значение из всех группируемых. Если значения не числовые, то возвращается первое при сортировке по возрастанию.
- КОЛИЧЕСТВО — возвращает количество значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.
- КОЛИЧЕСТВО РАЗЛИЧНЫЕ — возвращает количество различных значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.
Второй раздел начинается с ключевого слова ПО и содержит группировочные поля в разрезе которых будет подсчитываться результат по итоговым полям. И/или слово ОБЩИЕ, если нужно подсчитать итоги по всей выборке. Здесь важен порядок, в котором будут располагаться поля, это этого зависит и порядок подсчета итогов в результате запроса.
Если в группировочном поле находятся данные, имеющие иерархическую структуру (иерархический справочник), то можно подсчитать итоги по всей иерархической цепочке. Для этого используется ключевое слово ИЕРАРХИЯ после имени группировочного поля. Если же итоги нужно подсчитывать по всей иерархической цепочке, кроме самого группировочного поля, то используется ключевое слово ТОЛЬКО ИЕРАРХИЯ.
Рассмотрим в качестве примера таблицу поставок товаров.
Задача 1. Подсчет итогов по нескольким полям.
Необходимо узнать, сколько всего товаров поставлено и сколько столов и стульев.
В результате получим следующую таблицу с итогами (итоговые строки выделены желтым).
Задача 2. Группировка записей по полю.
Необходимо сгруппировать записи таблицы по виду товара.
Запрос . Текст = «ВЫБРАТЬ
Поставки.Товар КАК Товар,
Поставки.Поставщик КАК Поставщик,
Поставки.Количество КАК Количество,
ИЗ
Поставки КАК Поставки
ИТОГИ
В результате получим следующую таблицу.
Задача 3. Подсчет итогов по полю с учетом иерархии.
Необходимо подсчитать итоговое количество поставок по каждому поставщику и региону, в котором он находится. При этом оба поставщика находятся в иерархическом справочнике и подчинены группе «Челябинск».
В результате получим следующую таблицу.
Задача 4. Подсчет итогов только по иерархии.
Необходимо подсчитать итоговое количество поставок по региону, в котором находится поставщик. При этом оба поставщика находятся в иерархическом справочнике и подчинены группе «Челябинск».
В результате получим следующую таблицу.
Как обойти результат запроса с итогами
Результат запроса с итогами можно обойти несколькими способами:
- Как обычный запрос. В этом случае будут последовательно выведены группировочные и детальные записи. Пример такого обхода приведен в статье Основы работы с запросами 1С.
- Отдельно обойти группировки и детальные записи.
В качестве примера возьмем запрос из задачи 1. Но не будем учитывать общие итоги.
Источник
Итоги по объединенной совокупности группировок в запросе
Задача перевода «плоской» информации в «иерархическую» встает перед разработчиком 1С достаточно часто. В качестве примера такой задачи можно привести случай, когда мы имеем таблицу с данными о контрагентах и проданных им товарах, из данных которой нам нужно сформировать документы реализации. Каждая реализация должна объединять в себе строки по одному контрагенту, и все эти строки должны формировать табличную часть товаров документа.
Такая задача решается легко, путем использования ключевого слова ИТОГИ в запросе:
Затем результат запроса обходим по группировкам и создаем документы:
Усложним задачу, добавив в исходную таблицу колонку «Договор».
Теперь каждая отдельная реализация должна объединять строки с одинаковым набором значений Контрагент-Договор. Для того чтобы это учесть, можно добавить в запрос итоги по полю договор. При обходе результата запроса у нас появится еще один вложенный цикл.
Добавим в таблицу еще пару полей. Например, «Организация» и «Грузоотправитель». Реализация теперь создается на каждый набор Организация-Контрагент-Грузоотправитель-Договор. Если действовать тем же методом, добавляя итоговые поля в запрос, при обработке результата мы получим цикл пятого уровня вложенности:
Вид этой конструкции вызывает, мягко говоря, негативные эмоции.
А ведь группировочных полей может быть еще больше.
Для того чтобы избежать матрешки из циклов, нужно присвоить каждой связке Организация-Контрагент-Грузоотправитель-Договор какой-то идентификатор и производить группировку по всему набору, а не по каждому полю в отдельности. В рамках языка запросов это можно сделать при помощи функции АВТОНОМЕРЗАПИСИ. Для нашего примера запрос должен выглядеть так:
Воспользовавшись функцией АВТОНОМЕРЗАПИСИ, мы идентифицировали все наборы Организация-Контрагент-Грузоотправитель-Договор и выполнили группировку в рамках целого набора, а не по каждому полю отдельно.
Код обработки такого запроса выглядит так же просто, как и в первоначальном случае с единственным группировочным полем:
Источник
1С 8.3 Итоги в запросе — Программист 1С Минск. Автоматизация бизнеса.
1С 8.3 Итоги в запросе
&НаСервере
Процедура ПолучениеИтоговВЦеломПоТаблице ()
// Получение среднего веса материалов по всему справочнику
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СРЕДНЕЕ(Вес)
|ПО
| ОБЩИЕ» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтогоВПоОдномуПолюВРазрезеДругогоПоля ()
// Получение итогов по весу материалов в разрезе Срока Использования
Запрос = Новый Запрос ( «ВЫБРАТЬ
| СрокИспользования,
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес)
|ПО
| СрокИспользования» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтоговОднихПолейВРазрезеНесколькихДругих ()
// Получение итогов веса, плотности и фасовки материалов
// в разрезе производителей и сроков использования, по всему справочнику
Запрос = Новый Запрос ( «ВЫБРАТЬ
| СрокИспользования,
| Производитель,
| Наименование,
| Вес,
| Плотность,
| Фасовка,
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес),
| СУММА(Плотность),
| СУММА(Фасовка),
|ПО
| ОБЩИЕ,
| СрокИспользования,
| Производитель» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтоговПоИерархии ()
// Получение средней цены поступления на материалы
// в разрезе элементов и групп справочника материалов
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Период,
| Материалы,
| ВходящаяЦена
|ИЗ
| РегистрСведений.ВходящаяЦенаМатериалов КАК ВходящаяЦенаМатериалов
|ИТОГИ
| СРЕДНЕЕ(ВходящаяЦена)
|ПО
| Материалы ИЕРАРХИЯ» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Источник
Использование СГРУППИРОВАТЬ ПО и ИТОГИ, Виртуальные таблицы
Виртуальная таблица
Виртуальная таблица применяется для обращения к итогам и автоматической свертки по нужным полям.
Например:
можно получить все итоги регистра (итоги по всем измерениям и ресурсам),
Код 1C v 8.х
итоги по контрагенту и ресурсу Сумма
Код 1C v 8.х
итоги в разрезе контрагентов и товаров по двум ресурсам
Код 1C v 8.х
Если другой информации извлекать не нужно и не нужно использовать сводные таблицы или сводные диаграммы, то в запросе НЕ НУЖНО использовать ИТОГИ и СГРУППИРОВАТЬ ПО. Это приведет только к увеличению времени выполнения запроса и пересылки результата запроса по сети.
Сгруппировать по
Конструкция — сгруппировать по аналогично методу Свернуть для таблицы значений и слову Группировка в языке запросов 7.7. При применении этой конструкции в результате запроса остаются только группировочные записи. Это ключевое слово обычно применяется совместно с агрегатными функциями в списке полей выборки.
Код 1C v 8.х
Код 1C v 8.х
Итоги применяются для построения отчетов, сводной таблицы или сводной диаграммы. Для двух последних использование ИТОГОВ обязательно!
При применении этой конструкции в результате запроса остаются детальные записи И итоговые записи (напоминает Сгруппировать По). При этом агрегатные функции перечисляются в предложении ИТОГИ, а не в списке полей ВЫБРАТЬ.
Код 1C v 8.х
Источник