Как в СКД рассчитать вычисляемые поля, зависящие друг от друга?

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

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

В этой статье мы подробно разберем, почему возникает данная проблема, рассмотрим ограничения платформы 1С и изучим 5 практических способов ее решения.

Причина ограничения СКД

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

Рассмотрим детально проверенные методы обхода этого ограничения.

Способ 1. Метод прямого вложения формул (подстановка)

Самый простой, но визуально громоздкий способ — напрямую скопировать формулу первого поля и вставить ее вместо имени этого поля во второе выражение.

Представим, что у нас есть два поля:

  1. Процент: Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС Конец
  2. Коэффициент: должен рассчитываться на основе полученного процента.

Чтобы рассчитать коэффициент, мы полностью заменяем упоминание процента его исходной формулой:


Выбор 
    Когда (Выбор Когда ПланыПродажСтоимостьСНДС = 0 Тогда 100 Иначе ПродажиСтоимостьСНДС * 100 / ПланыПродажСтоимостьСНДС Конец) > 120 
        Тогда 1.2 
    Иначе (Выбор Когда ПланыПродажСтоимостьСНДС = 0 Тогда 100 Иначе ПродажиСтоимостьСНДС * 100 / ПланыПродажСтоимостьСНДС Конец) / 100 
Конец

Минус метода: Если вам нужно рассчитать цепочку из 4–5 зависимых показателей, итоговая формула на выходе превратится в огромный и трудночитаемый текст. Это может замедлить работу парсера СКД и усложнить дальнейшую поддержку отчета.

Способ 2. Правильное распределение расчетов (Детальные записи vs Ресурсы)

Очень часто некорректный расчет зависимых полей связан с тем, что разработчики пытаются считать агрегатные показатели (проценты, коэффициенты и доли) на уровне детальных записей, а затем просто суммируют их. Это математическая ошибка: сумма частных не равна частному от сумм.

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

Выражение для ресурса Процент на уровне группировок должно выглядеть так:


Выбор 
    Когда Выразить(Сумма(ПланыПродажСтоимостьСНДС), "Число(15,2)") = 0 
        Тогда 100 
    Иначе Сумма(ПродажиСтоимостьСНДС) * 100 / Сумма(ПланыПродажСтоимостьСНДС) 
Конец

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

Способ 3. Вынос логики в функции общего модуля

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

Для реализации этого способа выполните следующие шаги:

  1. Создайте в конфигураторе общий модуль (или используйте существующий нетиповой). В свойствах модуля обязательно должны быть установлены флажки Сервер и Внешнее соединение.
  2. Напишите экспортную функцию, которая принимает исходные параметры и возвращает готовое значение. Например:

// Функция рассчитывает сложный коэффициент на основе продаж и планов
Функция РассчитатьКоэффициент(Продажи, Планы) Экспорт
    
    Если Планы = 0 Тогда
        Процент = 100;
    Иначе
        Процент = Продажи * 100 / Планы;
    EndIf;
    
    Если Процент > 120 Тогда
        Возврат 1.2;
    Иначе
        Возврат Процент / 100;
    EndIf;
    
КонецФункции
  1. В вычисляемом поле или поле ресурса СКД вызовите эту функцию, передав в нее нужные поля:

ИмяВашегоОбщегоМодуля.РассчитатьКоэффициент(Сумма(ПродажиСтоимостьСНДС), Сумма(ПланыПродажСтоимостьСНДС))

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

Способ 4. Использование пользовательских полей

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

Если вы хотите защитить эти формулы от изменений пользователями, вы можете создать пользовательские поля программно в модуле объекта отчета в процедуре ПриКомпоновкеРезультата и установить для них уровень доступности:


ПользовательскоеПоле = КомпоновщикНастроек.Настройки.ПользовательскиеПоля.Элементы.Добавить(Тип("ПользовательскоеПолеВыражение"));
ПользовательскоеПоле.ПутьКДанным = "ПользовательскоеПолеКоэффициент";
ПользовательскоеПоле.Заголовок = "Итоговый коэффициент";
ПользовательскоеПоле.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

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

Способ 5. Перенос промежуточных расчетов на уровень запроса

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

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

← На главную