Как в запросе 1С добавить поле с делением на поле итогов

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в 1С часто возникает задача рассчитать долю конкретной строки (номенклатуры, контрагента) в общем объеме продаж или прибыли. Типичный пример: «Процент продаж от общей суммы». Несмотря на кажущуюся простоту, реализация этой задачи напрямую в запросе, особенно при использовании ПостроителяОтчета или классических итогов ИТОГИ, имеет свои нюансы. Разберем подробно несколько проверенных способов решения этой задачи.

Метод 1: Использование временных таблиц в запросе

Это классический способ, который работает в любом запросе, независимо от используемой системы компоновки. Суть метода заключается в разделении данных на «детальные» и «итоговые», с последующим их соединением. Разберем этот процесс по шагам.

Шаг 1: Подготовка первичных данных. Сначала мы выбираем все необходимые данные и группируем их в разрезе нужных нам измерений (например, номенклатура и контрагент). Результат помещаем во временную таблицу ВТ_Продажи.


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

Шаг 2: Расчет общего итога. Теперь создадим вторую временную таблицу ВТ_Итого, в которой будет всего одна строка с общей суммой всех продаж за период. Обратите внимание, что здесь мы не используем поля группировок, так как нам нужна общая сумма по всей таблице.


ВЫБРАТЬ
    СУММА(ВТ_Продажи.Сумма) КАК ОбщаяСумма
ПОМЕСТИТЬ ВТ_Итого
ИЗ
    ВТ_Продажи КАК ВТ_Продажи;

Шаг 3: Соединение данных и расчет процента. На финальном этапе мы соединяем детальную таблицу с таблицей итога. Поскольку в таблице ВТ_Итого всего одна строка, мы используем левое соединение по условию ИСТИНА. Это позволяет «подставить» общее значение к каждой строке с номенклатурой.


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Контрагент,
    Продажи.Сумма,
    Итого.ОбщаяСумма,
    ВЫБОР
        КОГДА ЕСТЬNULL(Итого.ОбщаяСумма, 0) = 0
            ТОГДА 0
        ИНАЧЕ ВЫРАЗИТЬ(Продажи.Сумма / Итого.ОбщаяСумма * 100 КАК ЧИСЛО(15, 2))
    КОНЕЦ КАК ПроцентОтПродаж
ИЗ
    ВТ_Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Итого КАК Итого
        ПО ИСТИНА;

Важный момент: Всегда используйте конструкцию ВЫБОР КОГДА ... ТОГДА для проверки деления на ноль. Если за выбранный период не было оборотов, запрос без этой проверки завершится с ошибкой.

Метод 2: Решение задачи через Систему компоновки данных (СКД)

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

Рассмотрим вариант с функцией ВычислитьВыражение. В схеме компоновки данных на вкладке «Ресурсы» мы можем прописать формулу расчета доли:

Сумма(Сумма) / ВычислитьВыражение("Сумма(Сумма)", "ОбщийИтог") * 100

Проанализируем параметры этой функции:

  1. "Сумма(Сумма)" — выражение, которое нужно рассчитать (сумма по строке или текущей группировке).
  2. "ОбщийИтог" — контекст расчета. В данном случае СКД возьмет сумму по всему отчету, игнорируя фильтры группировок.

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

Особенности работы с Построителем отчета

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

Проанализируем ситуацию: автор пытался разделить сумму на итог прямо в выражении полей. Это невозможно, так как итоговые значения рассчитываются сервером БД уже после выборки строк. Поэтому для ПостроителяОтчета единственным стабильным решением остается предварительный расчет общих итогов во временных таблицах (как в Методе 1) или переход на СКД.

Практические советы по оптимизации

Рассмотрим несколько рекомендаций для повышения точности и быстродействия:

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

← На главную