При разработке отчетов на схеме компоновки данных (СКД) часто возникает задача последовательного расчета показателей. Например, сначала необходимо вычислить процент выполнения плана, затем на его основе рассчитать коэффициент эффективности, а после — умножить этот коэффициент на сумму мотивации. Однако при попытке написать выражение для второго поля с использованием имени первого вычисляемого поля система выдает ошибку о том, что поле не найдено.
В этой статье мы подробно разберем, почему возникает данная проблема, рассмотрим ограничения платформы 1С и изучим 5 практических способов ее решения.
Основное правило работы вкладки Вычисляемые поля в СКД заключается в том, что расчет выражений происходит на этапе обхода детальных записей до группировки данных. На этом этапе схема компоновки данных обрабатывает каждое поле независимо. Платформа 1С не позволяет использовать одни вычисляемые поля внутри выражений других вычисляемых полей на этой вкладке. Из-за этого прямая ссылка на уже созданное поле (например, использование поля Процент в формуле поля Коэффициент) приводит к синтаксической ошибке.
Рассмотрим детально проверенные методы обхода этого ограничения.
Самый простой, но визуально громоздкий способ — напрямую скопировать формулу первого поля и вставить ее вместо имени этого поля во второе выражение.
Представим, что у нас есть два поля:
Выбор Когда ПланыПродажСтоимостьСНДС=0 Тогда 100 Иначе ПродажиСтоимостьСНДС*100/ПланыПродажСтоимостьСНДС КонецЧтобы рассчитать коэффициент, мы полностью заменяем упоминание процента его исходной формулой:
Выбор
Когда (Выбор Когда ПланыПродажСтоимостьСНДС = 0 Тогда 100 Иначе ПродажиСтоимостьСНДС * 100 / ПланыПродажСтоимостьСНДС Конец) > 120
Тогда 1.2
Иначе (Выбор Когда ПланыПродажСтоимостьСНДС = 0 Тогда 100 Иначе ПродажиСтоимостьСНДС * 100 / ПланыПродажСтоимостьСНДС Конец) / 100
Конец
Минус метода: Если вам нужно рассчитать цепочку из 4–5 зависимых показателей, итоговая формула на выходе превратится в огромный и трудночитаемый текст. Это может замедлить работу парсера СКД и усложнить дальнейшую поддержку отчета.
Очень часто некорректный расчет зависимых полей связан с тем, что разработчики пытаются считать агрегатные показатели (проценты, коэффициенты и доли) на уровне детальных записей, а затем просто суммируют их. Это математическая ошибка: сумма частных не равна частному от сумм.
Для правильного расчета показателей перенесите формулы на вкладку Ресурсы. На этой вкладке вы можете использовать агрегатные функции (такие как Сумма, Среднее, Количество) и обращаться к итоговым значениям полей группировки.
Выражение для ресурса Процент на уровне группировок должно выглядеть так:
Выбор
Когда Выразить(Сумма(ПланыПродажСтоимостьСНДС), "Число(15,2)") = 0
Тогда 100
Иначе Сумма(ПродажиСтоимостьСНДС) * 100 / Сумма(ПланыПродажСтоимостьСНДС)
Конец
На вкладке «Ресурсы» вы можете добавлять одно и то же поле несколько раз, указывая в колонке Рассчитывать по... конкретные разрезы (например, по определенной группировке или по общим итогам), что позволяет гибко управлять расчетами на разных уровнях иерархии без громоздких условий.
Если цепочка расчетов длинная, а формулы сложные, лучшим решением будет использование функций общих модулей 1С. Это позволит сделать выражения в СКД чистыми, а код — простым для отладки.
Для реализации этого способа выполните следующие шаги:
// Функция рассчитывает сложный коэффициент на основе продаж и планов
Функция РассчитатьКоэффициент(Продажи, Планы) Экспорт
Если Планы = 0 Тогда
Процент = 100;
Иначе
Процент = Продажи * 100 / Планы;
EndIf;
Если Процент > 120 Тогда
Возврат 1.2;
Иначе
Возврат Процент / 100;
EndIf;
КонецФункции
ИмяВашегоОбщегоМодуля.РассчитатьКоэффициент(Сумма(ПродажиСтоимостьСНДС), Сумма(ПланыПродажСтоимостьСНДС))
Использование этого метода гарантирует высокую скорость работы отчета и исключает синтаксические ошибки компоновщика при построении сложных условий.
В СКД существует встроенный механизм пользовательских полей, который позволяет настраивать выражения для расчета одних показателей на основе других прямо в пользовательском режиме или программно.
Если вы хотите защитить эти формулы от изменений пользователями, вы можете создать пользовательские поля программно в модуле объекта отчета в процедуре ПриКомпоновкеРезультата и установить для них уровень доступности:
ПользовательскоеПоле = КомпоновщикНастроек.Настройки.ПользовательскиеПоля.Элементы.Добавить(Тип("ПользовательскоеПолеВыражение"));
ПользовательскоеПоле.ПутьКДанным = "ПользовательскоеПолеКоэффициент";
ПользовательскоеПоле.Заголовок = "Итоговый коэффициент";
ПользовательскоеПоле.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Это скроет поле из настроек отчета на клиенте, но сохранит возможность использовать его для вывода данных.
Если расчеты не завязаны на динамическое изменение группировок пользователем (например, вам нужно рассчитать показатели на уровне детальных записей номенклатуры или контрагентов), оптимальным решением будет перенести эти вычисления непосредственно в текст запроса схемы компоновки данных.
Используйте временные таблицы или вложенные запросы, чтобы на первом этапе рассчитать базовые коэффициенты, а в основном запросе получить уже готовые поля. Это разгрузит процессор компоновки данных и ускорит формирование отчета.