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

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

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

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

Выясняем причину: почему платформа накладывает ограничение?

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

Тем не менее, решить эту задачу можно несколькими красивыми способами. Рассмотрим их по шагам.

Способ 1. Перенос вычислений в текст запроса (Рекомендуемый метод)

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

Давайте посмотрим на практический пример. Предположим, нам нужно рассчитать сумму продажи, а затем на ее основе вычислить сумму НДС и сумму со скидкой.

Вместо создания вычисляемого поля Сумма мы пишем расчет прямо в запросе СКД:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.Цена КАК Цена,
    ПродажиОбороты.КоличествоОборот * ПродажиОбороты.Цена КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

Теперь поле Сумма является полноценным полем набора данных. На вкладке «Вычисляемые поля» мы можем создать новое поле СуммаНДС и без каких-либо ошибок написать выражение:

Сумма * 0.20

Преимущества метода: Высокая скорость работы, чистота схемы компоновки данных, отсутствие дублирования кода.

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

Способ 2. Подстановка формулы (Дублирование выражений)

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

Проанализируем ситуацию:

  1. У нас есть вычисляемое поле Поле1 с выражением: Цена * Количество.
  2. Нам требуется создать вычисляемое поле Поле2, которое должно умножать результат Поле1 на коэффициент скидки.
  3. Вместо формулы Поле1 * Коэффициент в выражении для Поле2 мы пишем полную раскрытую формулу: (Цена * Количество) * Коэффициент.

Преимущества метода: Простота реализации, не требует изменения структуры запросов или написания программного кода.

Недостатки: Дублирование логики. Если формула расчета первого поля изменится (например, добавятся налоги или дополнительные скидки), вам придется вручную искать и переписывать формулы во всех зависимых вычисляемых полях.

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

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

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

Разберем этот метод по шагам:

  1. Перейдите на вкладку «Вычисляемые поля» и создайте базовое поле (например, БазоваяСумма) с формулой расчета.
  2. Перейдите на вкладку «Настройки» (в нижней части конструктора СКД).
  3. Выберите вкладку «Пользовательские поля» и нажмите кнопку добавления. Выберите пункт «Новое поле-выражение...».
  4. В окне редактирования формулы детальных записей вы можете напрямую использовать созданное ранее вычисляемое поле. Важно: имя поля обязательно нужно заключать в квадратные скобки, например: [БазоваяСумма] * 0.18.
  5. Добавьте созданное пользовательское поле в список выбранных полей вашего отчета.

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

Способ 4. Вызов функций общих модулей конфигурации

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

Выполним следующую последовательность действий:

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

Функция РассчитатьИтоговуюСтоимость(Цена, Количество, ПроцентСкидки) Экспорт
    
    ПервичнаяСумма = Цена * Количество;
    РазмерСкидки = ПервичнаяСумма * (ПроцентСкидки / 100);
    
    Возврат ПервичнаяСумма - РазмерСкидки;
    
КонецФункции
  1. Теперь в схеме компоновки данных на вкладке «Вычисляемые поля» мы создаем вычисляемое поле и в колонке «Выражение» вызываем нашу функцию, передавая в нее поля набора данных в качестве аргументов:

ОбщийМодульОтчетов.РассчитатьИтоговуюСтоимость(Цена, Количество, Скидка)

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

Резюме

Мы рассмотрели все основные варианты обхода системного ограничения СКД. Выбор конкретного метода зависит от архитектуры вашего отчета:

← На главную