Как запросе рассчитать итоги по определенной группировке. Примеры применения функции скд - вычислитьвыражение

Вроде и нет ничего проще,а с четким определением проблема.
Итак.

Сгруппировать(группировка) - свернуть записи в группу по групповым полям (полям с одинаковым значением).
Пример . Нам необходимо узнать общее количество товаров на определенном складе (...всего 999 тонн..). В регистр записывается каждое движение и даже элементарный запрос из двух полей (Склад и Количество) сформирует выборку из множества записей с одинаковым значением поля Склад и разными значениями поля Количество.
Свернуть (сгруппировать) остатки по полю Склад- это получить общее количество товара на этом складе.
Отсюда вытекает необходимость (для нашего примера, но вообщем не обязательно) вычисления агрегатных функций (производят одиночное значение для определенной группы полей таблицы) по групповому полю (в терминах конструктора запросов- Суммируемое поле ).
В нашем примере - групповое поле Склад, а агрегатную функцию вычислим по полю Количество- получим ОБЩЕЕ КОЛИЧЕСТВО всех товаров на складе.
Т.к. настолько простые запросы очень редки, то во всех иных случаях при применении Группировки, группироваться будут все поля запроса (за исключением Суммируемых) и выборка будет сокращаться (сворачиваться) только на те записи , у которых все групповые поля одинаковы (одинаковый склад, одинаковый товар, одинаковый размер товара- эти записи свернуться, если хоть что-то разное- нет).

Итоги (т.н. общие )- дополнительные строки в результате запроса, содержащие итоги по заданным полям и группировкам (т.н. промежуточные итоги).
Общие итоги- строка в результате запроса со значением итогов по всем записям.

Итоги по группировкам - значения агрегатных функций по групповым полям (полям с одинаковым значением).

Отличия запроса с группировками (СГРУППИРОВАТЬ ПО) от запроса с итогами по группировкам .

В первом случае в результат запроса попадут только итоговые строки. В примере групповое поле- номенклатура:

Во втором- итоги и исходные записи. Причина- в определении (итоги не "сворачивают" данные, а добавляют строки)!В примере групповое поле- номенклатура:

Важно! В запросе нет необходимости пользоваться и группировкой и итогами! Все зависит от того, что нам нужно...

Порядок группировок в запросе с итогами по группировкам имеет важное значение, т.к. итоги рассчитываются по порядку.

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

Важно! В языке запросов допускается совместное использование различных итогов в одном запросе (общих, по группировкам и иерархических).

Синтаксис работы с итогами в выборке из результата запроса

Метод ТипЗаписи()
Пример:
Если Выборка . ТипЗаписи () = ТипЗаписиЗапроса . ИтогПоГруппировке Тогда

Продолжить;
КонецЕсли;

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Система компоновки данных 1С 8.3 для начинающих: считаем итоги (ресурсы)

Целью этого урока будет:

  • Написать отчёт, который выводит список продуктов (справочник Еда), их калорийность и вкус.
  • Сделать группировку продуктов по их цвету.
  • Познакомиться с возможностью подведения итогов (ресурсы) и вычисляемыми полями.

Создаём новый отчёт

Как и на предыдущих уроках открываем базу "Гастроном " в конфигураторе и создаём новый отчёт через меню "Файл "->"Новый... ":

Вид документа - внешний отчёт :

В форме настройки отчёта пишем имя "Урок3 " и нажимаем кнопку "Открыть схему компоновки данных ":

Оставляем имя схемы по умолчанию и нажимаем кнопку "Готово ":

Добавляем запрос через конструктор

На закладке "Набор данных " нажимаем зелёный плюсик и выбираем пункт "Добавить набор данных - запрос ":

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

На вкладке "Таблицы " перетягиваем таблицу "Еда " из первой колонки во вторую:

Выбираем из таблицы "Еда " поля, которые будем запрашивать. Для этого перетаскиваем поля "Наименование ", "Вкус ", "Цвет " и "Калорийность " из второй колонки в третью:

Получилось вот так:

Нажимаем кнопку "ОК " - текст запроса сформировался автоматически:

Формируем настройки представления отчёта

Переходим на закладку "Настройки " и нажимаем на волшебную палочку , чтобы вызвать конструктор настроек :

Выбираем вид отчета "Список ..." и нажимаем кнопку "Далее ":

Перетаскиваем из левой колонки в правую поля, которые будут отображаться в списке и нажимаем "Далее ":

Перетаскиваем из левой колонки в правую поле "Цвет " - по нему будет происходить группировка строк в отчёте. Нажимаем "ОК ":

А вот и результат работы конструктора. Иерархия нашего отчёта:

  • отчёт в целом
  • группировка "Цвет"
  • детальные записи - строки с названиями еды

Сохраним отчёт (кнопка дискета ) и не закрывая конфигуратора тут же откроем его в режиме пользователя. Получилось вот так:

Меняем порядок колонок

Но давайте поменяем порядок колонок (стрелки вверх-вниз), чтобы он был таким как на рисунке ниже:

Сохраним отчёт и вновь откроем в режиме пользователя:

Отлично, так гораздо лучше.

Подводим итог (сумму) по калорийности

Было бы неплохо выводить итог калорийности продуктов по группам. Чтобы видеть сумму калорийности всех продуктов, скажем, белого или жёлтого цвета. Или узнать общую калорийность вообще всех продуктов в базе.

Для этого существует механизм вычисления ресурсов.

Переходим на вкладку "Ресурсы " и перетаскиваем поле "Калорийность " (мы же по нему собираемся итог подводить) из левой колонки в правую.

При этом в поле выражение выбираем из выпадающего списка "Сумма(Калорийность) ", так как итогом будет являться сумма всех входящих в итог элементов:

Сохраняем и формируем отчёт:

У нас появились итоги по каждой из групп и по отчёту в целом.

Подводим итог (среднее) по калорийности

Теперь давайте сделаем так, чтобы в ещё одной колонке выводилась средняя калорийность продуктов по группам и в целом по отчёту.

Трогать уже имеющуюся колонку "Калорийность" нельзя - в неё уже выводится итог-сумма, поэтому заведём ещё одно поле , которое будет являться точной копией поля "Калорийность".

Чтобы завести такое "виртуальное" поле воспользуемся механизмом вычисляемых полей .

Переходим на закладку "Вычисляемые поля " и нажимаем зелёный плюсик:

В колонке "Путь к данным " пишем имя нового поля (слитно , без пробелов ). Пусть оно будет называться "СредняяКалорийность ", а в колонке "Выражение " пишем имя уже существующего поля, на основании которого будет рассчитываться новое поле. Пишем туда "Калорийность ". Колонка "Заголовок " заполнится автоматически.

Мы добавили новое поле ("СредняяКалорийность "), но в отчёте оно само по себе не появится - нужно или вновь вызывать конструктор настроек ("волшебная палочка") или добавить это поле вручную .

Поступим вторым способом. Для этого переходим на закладку "Настройки ", выбираем "Отчет " (ведь мы хотим добавить поле в целом к отчёту), выбираем внизу закладку "Выбранные поля " и перетаскиваем поле "СредняяКалорийность " из левой колонки в правую:

Получилось вот так:

Сохраняем и формируем отчет:

Поле появилось и мы видим, что его значениями являются значения поля "Калорийность". Отлично!

Для этого вновь воспользуемся уже знакомым нам механизмом ресурсов (подведение итогов). Переходим на закладку "Ресурсы " и перетаскиваем поле "СредняяКалорийность " из левой колонки в правую:

При этом в колонке "Выражение " выбираем "Среднее(СредняяКалорийность) ":

Сохраняем и формируем отчёт:

Видим, что по группам, то есть по каждому цвету, и по отчёту в целом совершенно верно посчиталось среднее значение. Но присутствуют лишние записи по отдельным продуктам (не по группам), которые хотелось бы убрать из отчёта.

Знаете почему они появились (значения не по группам)? Потому что, когда мы добавляли поле "СредняяКалорийность " в настройки отчёта, на втором шаге мы выделили весь отчёт в целом и это новое поле попало в элемент "Детальные записи ".

Исправим ошибку. Для этого вернёмся на закладку "Настройки ", выберем "Детальные записи " сначала сверху (шаг 2), а затем "Детальные записи " снизу (шаг 3), перейдём на закладку "Выбранные поля " и увидим в её правой колонке элемент "Авто ".

Элемент "Авто " - это не одно поле. Это несколько полей, которые попадают сюда автоматически на основании вышестоящих настроек.

Чтобы увидеть, что это за поля - нажмём на элемент "Авто " правой кнопкой и выберем пункт "Развернуть ":

Элемент "Авто " раскрылся в следующие поля:

А вот и наше поле "СредняяКалорийность ", которое попало сюда из пункта "Отчет ", когда мы его туда перетаскивали. Просто снимем галку рядом с этим полем, чтобы убрать его вывода.

В компоновке данных настройка итогов выглядит несколько иначе, чем в запросах. Определим в системе компоновки данных набор данных «Запрос».

В самом запросе мы не настраиваем итоги, а переходим на закладку «Ресурсы» компоновки данных. На уровне схемы компоновки данных мы определяем ресурсы . Это те поля, которые нужно посчитать на уровне группировок. Нажмём на кнопку «>>» и система сама перенесёт все числовые поля и определит их в качестве ресурсов.

В ресурсах можно указывать и нечисловые поля. Например, если выбрать реквизит «Ссылка», то система подсчитает количество документов в наших группировках. Эта информация тоже может быть полезной. Итак, в схеме компоновки мы определяем только ресурсы , а сами группировки настраиваются на уровне варианта отчёта. Так же пользователь сам может создать группировки, которые хочет видеть в своей настройке варианта отчёта.

Создадим стандартную настройку компоновки данных.
Нажмём на кнопку «Открыть конструктор настроек».

Выберем тип отчета — список. Нажмём кнопку «Далее».

Выберем все поля и переместим поле контрагент на самую верхнюю позицию. Нажмём кнопку «Далее».

Выберем все поля и переместим поле контрагент на самую верхнюю позицию. Нажмём кнопку «OK».

Получилась следующая настройка:

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

Если открыть наш отчёт в режиме 1С:Предприятие и сформировать его, то мы увидим, что формируются итоговые данные на уровне группировок. Итоги по номенклатуре и по контрагентам.

Настройка ресурсов в схеме компоновки данных 1С

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

Здесь в поле «Выражение» мы можем написать и своё собственное выражение.

В поле «Выражение» мы можем обращаться и к функциям общих модулей.

Кроме того, можно указать в поле «Расчитывать по…» по каким группировкам необходимо рассчитывать ресурс. Если поле «Расчитывать по…» не заполнено, то итоговое значение ресурса будет считаться на всех уровнях группировки, которые определены в настройках варианта отчёта . В нашем случае нужно заполнить поле «Расчитывать по…» ресурса «Количество», так как мы можем продавать товар с разными единицами измерения. Например: масло в литрах и колёса в штуках. Не правда ли, нелогично будет складывать количество этих товаров? Поэтому нам нужно оставить суммирование количества на уровне номенклатуры, а на уровне контрагентов
суммирование уберём.

Если сформируем отчёт, то увидим, что итоги по количеству считаются только по номенклатуре, а по контрагентам итоги количества пустые.

Возможности при описании ресурсов в схеме компоновки данных 1С

Давайте рассмотрим ряд неочевидных особенностей связанных с описанием ресурсов .

  • Каждый ресурс можно определить несколько раз . Но это имеет смысл лишь в том случае, если
    ресурс будет рассчитываться по разным уровням группировок. Например, если количество, в одном случае
    суммируется для номенклатуры, а по контрагентам получаем минимальное значение.

Если сформируем отчёт, то увидим, что по контрагенту «Дерия» минимальная закупка составляет пять единиц номенклатуры «Бумага самоклеющаяся».

  • В поле «Выражение», кроме написания формулы, можно использовать специальную функцию компоновки данных которая называется «Вычислить» . Эта функция позволяет вычислить какое-то итоговое значение по определённой формуле. Например, по каждому контрагенту необходимо знать процент закупки в натуральных единицах относительно общего объёма. Но как получить общий объём закупок по количеству? Для этого воспользуемся функцией «Вычислить» и запишем следующее выражение в поле «Выражение»:
Сумма(Количество)/Вычислить("Сумма(Количество)", "ОбщийИтог")*100

Как видно, все параметры функции «Вычислить» являются строковыми . Чтобы поле количество отображалось в отчёте красиво, настроим его на вкладке «Наборы данных». В строке количество найдём поле «Параметры редактирования». Откроем диалог, отыщем строку «Формат» и отредактируем в нём форматную строку, поставив на вкладке «Число», значение «Точность» равным двум.

Запустим отчёт и увидим результат вычисления процента закупки по контрагенту «АУПП КОС ТОО» относительно
общего объёма:


В конце статьи хочу посоветовать вам бесплатный от Сотникова Анатолия. Это курс от опытного программиста. Он на отдельной базе покажет вам, как строить отчеты в СКД. Вам только нужно внимательно слушать и запоминать! Вы получите ответы на такие вопросы:
  • Как создать простой отчет в виде списка?
  • Для чего нужны колонки Поле, Путь и Заголовок на закладке «Поля»?
  • Какие существуют ограничения для полей компоновки?
  • Как правильно настраивать роли?
  • Какие существуют роли для полей компоновки?
  • Где найти закладку компоновка данных в запросе?
  • Как настраивать параметры в СКД?
  • Дальше еще интереснее...
Наверное, не стоит самому стараться бороздить интернет в поисках нужной информации? Тем более все готово для применения. Только начните! Все подробности о том, что есть в бесплатных видеоуроках

Вот один из уроков о закладке компоновки данных в запросе:

Они имеют ту же задачу — произвести математические или статистические операции над данными выборки. Но имеются и существенные различия:

  1. Итоги добавляют строки к данным выборки, в то время как группировки сворачивают выборку и строк становится меньше.
  2. Итоги можно рассчитывать по всем данным выборки или по отдельным полям, при этом, в отличие от группировок, могут оставаться поля, которые не являются ни итоговыми, ни группировочными.
  3. Итоги могут учитывать иерархию.

Для начала немного теории. Секция итогов в запросах 1С состоит из двух разделов.

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

Существует 6 видов агрегатных функций, применяемых при группировках:

  1. СУММА — суммирует значения группируемого столбца, применяется только для числовых значений.
  2. СРЕДНЕЕ — вычисляет среднее арифметическое из значений группируемого столбца, применяется только для числовых значений.
  3. МАКСИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается максимальное значение из всех группируемых. Если значения не числовые, то возвращается последнее при сортировке по возрастанию.
  4. МИНИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается минимальное значение из всех группируемых. Если значения не числовые, то возвращается первое при сортировке по возрастанию.
  5. КОЛИЧЕСТВО — возвращает количество значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.
  6. КОЛИЧЕСТВО РАЗЛИЧНЫЕ — возвращает количество различных значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.

Второй раздел начинается с ключевого слова ПО и содержит группировочные поля в разрезе которых будет подсчитываться результат по итоговым полям. И/или слово ОБЩИЕ , если нужно подсчитать итоги по всей выборке. Здесь важен порядок, в котором будут располагаться поля, это этого зависит и порядок подсчета итогов в результате запроса.

Если в группировочном поле находятся данные, имеющие иерархическую структуру (иерархический справочник), то можно подсчитать итоги по всей иерархической цепочке. Для этого используется ключевое слово ИЕРАРХИЯ после имени группировочного поля. Если же итоги нужно подсчитывать по всей иерархической цепочке, кроме самого группировочного поля, то используется ключевое слово ТОЛЬКО ИЕРАРХИЯ .

Рассмотрим в качестве примера таблицу поставок товаров.

Задача 1. Подсчет итогов по нескольким полям.

Необходимо узнать, сколько всего товаров поставлено и сколько столов и стульев.

Запрос. Текст= "ВЫБРАТЬ
Поставки.Товар КАК Товар,


ИЗ
Поставки КАК Поставки
ИТОГИ
СУММА(Количество)
ПО
ОБЩИЕ,
Товар"
;

В результате получим следующую таблицу с итогами (итоговые строки выделены желтым).

Задача 2. Группировка записей по полю.

Необходимо сгруппировать записи таблицы по виду товара.

Запрос. Текст= "ВЫБРАТЬ
Поставки.Товар КАК Товар,
Поставки.Поставщик КАК Поставщик,
Поставки.Количество КАК Количество,
ИЗ
Поставки КАК Поставки
ИТОГИ

ПО
Товар" ;

Задача 3. Подсчет итогов по полю с учетом иерархии.

Запрос. Текст= "ВЫБРАТЬ
Поставки.Товар КАК Товар,
Поставки.Поставщик КАК Поставщик,
Поставки.Количество КАК Количество,
ИЗ
Поставки КАК Поставки
ИТОГИ
СУММА(Количество)
ПО
Поставщик ИЕРАРХИЯ"
;

В результате получим следующую таблицу.

Задача 4. Подсчет итогов только по иерархии.

Запрос. Текст= "ВЫБРАТЬ
Поставки.Товар КАК Товар,
Поставки.Поставщик КАК Поставщик,
Поставки.Количество КАК Количество,
ИЗ
Поставки КАК Поставки
ИТОГИ
СУММА(Количество)
ПО
Поставщик ТОЛЬКО ИЕРАРХИЯ"
;

В результате получим следующую таблицу.

Как обойти результат запроса с итогами

Результат запроса с итогами можно обойти несколькими способами:

  1. Как обычный запрос. В этом случае будут последовательно выведены группировочные и детальные записи. Пример такого обхода приведен в статье .
  2. Отдельно обойти группировки и детальные записи.
    В качестве примера возьмем запрос из задачи 1. Но не будем учитывать общие итоги.

    ГруппировкиТовар = Запрос. Выполнить() . Выбрать(ОбходРезультатаЗапроса. ПоГруппировкам, "Товар" ) ;
    Пока ГруппировкиТовар. Следующий() Цикл
    //здесь обрабатываем группировочные строки результата запроса
    ДетальныеЗаписи = ГруппировкиТовар. Выбрать() ;
    Пока ДетальныеЗаписи. Следующий() Цикл
    //здесь обрабатываем строки детальных записей, принадлежащих группировкам
    КонецЦикла ;
    КонецЦикла ;

Итоги должны присутствовать в любом отчете. Например, если у вас есть поля Наименование количество цена и сумма, то логично по последние колонки получить общий итог. Сегодня рассмотрим, как это сделать с помощью СКД (Система компоновки данных).

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

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

Давайте к нему добавим общий итог по колонке Сумма.

Как вывести общие итоги по колонке с помощью СКД 1С

И так запускаем конфигуратор открываем наш отчет Приход Товара и кликаем на Схему компоновки данных.

В открывшемся окне переходим на вкладку Ресурсы. Слева из окна доступные поля выбираем поле Сумма и перетаскиваем его в правое окно. Больше не чего не меняем.

Запускаем 1С и смотрим что у нас получилось. Если вы все сделали правильно, то в конце таблицы должен появиться итог по колонке.

В результате получим итоговую сумму по всем колонкам.

Ну вот мы и научились выводит итого по колонкам с помощью системы компоновки данных.

Похожие статьи

© 2024 ap37.ru. Сад и огород. Декоративные кустарники. Болезни и вредители.