Использование произвольных выражений в итогах языка запроса

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

Произвольные выражения в итогах

Синтаксис и функциональность выражения для расчета итогов аналогичны простому выражению языка запроса, однако имеются некоторые особенности:

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

Пример:

Копировать в буфер обмена

ИТОГИ
    100 * Сумма(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли

В данном примере результате выражения будет помещаться в поле "ПроцентПрибыли". Заметим, что поле "ПроцентПрибыли" должно присутствовать в списке выборки запроса.

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

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

Пример:

Копировать в буфер обмена

ИТОГИ
    Номенклатура КАК Номенклатура,// Правильно, т.к. поле присутствует в списке группировок итогов
    СуммаОборот КАК СуммаОборот, // Неправильно, т.к. поле отсутствует в списке группировок итогов
    Сумма(КоличествоОборот) КАК КоличествоОборот // Правильно, т.к. поле используется в агрегатной функции
ПО
    Номенклатура,
    Контрагент

В случае если поле - группировка используется в итоговом выражении, и по данному полю еще не было получена группировка - значение поля будет равняться NULL.

Примеры использования

Расчет выражений от агрегатных функций

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

Пример:

Копировать в буфер обмена

ВЫБРАТЬ
    Номенклатура,
    СуммаОборот КАК Оборот,
    СуммаПрибыль КАК Прибыль,
    100 * СуммаПрибыль / СуммаОборот КАК ПроцентПрибыли
ИЗ
    РегистрНакопления.УчетПрибыли.Обороты
ИТОГИ
    СУММА(Оборот),
    СУММА(Прибыль),
    100 * СУММА(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли
ПО
    Номенклатура ИЕРАРХИЯ

В данном примере в поле "ПроцентПрибыли" итоговых записей будет помещено значение суммы по полю "Прибыль" умноженное на 100 и поделенное на значение суммы по полю "Оборот".

Расчет итогов только для уже полученных группировок

Для того, чтобы значение некоторых суммируемых полей рассчитывалось только для группировок, по которым уже получены итоги, в выражении для расчета итога можно воспользоваться тем фактом, что значение полей - группировок для еще не полученных группировок равняется NULL.

Пример:

Копировать в буфер обмена

ВЫБРАТЬ
    ОсновнойОстатки.Счет КАК Счет,
    ОсновнойОстатки.Валюта КАК Валюта,
    ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
    ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
    РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
    СУММА(СуммаОстаток),
    ВЫБОР
        КОГДА Валюта ЕСТЬ НЕ NULL
            ТОГДА СУММА(ВалютнаяСуммаОстаток)
    КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
    Счет,
    Валюта

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

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

Пример:

Копировать в буфер обмена

ВЫБРАТЬ
    ОсновнойОстатки.Счет КАК Счет,
    ОсновнойОстатки.Валюта КАК Валюта,
    ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
    ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
    РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
    СУММА(СуммаОстаток),
    ВЫБОР
        КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Валюта) = 1
            ТОГДА СУММА(ВалютнаяСуммаОстаток)
    КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
    Счет,
    Валюта

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

Переопределение представлений для группировок

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

Пример.

Копировать в буфер обмена

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Номенклатура.Код КАК НоменклатураКод,
    ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
    ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
    ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ИТОГИ
    НоменклатураКод + ") " + НоменклатураПредставление КАК НоменклатураПредставление,
    СУММА(КоличествоОборот),
    СУММА(СуммаОборот)
ПО
    Номенклатура

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