Как реализовать вычитание и арифметические расчеты в СКД 1С 8.3

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

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

Проблема пустых значений или почему 100 - NULL = NULL

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

Для решения этой проблемы проанализируем использование функции ЕСТЬNULL. Мы должны гарантировать, что вместо пустоты система будет использовать ноль. Правильнее всего сделать это еще на этапе запроса, но если вы работаете с готовым набором данных, используйте выражение в Вычисляемых полях или Ресурсах:


ЕСТЬNULL(СуммаПродажи, 0) - ЕСТЬNULL(СуммаВозврата, 0) - ЕСТЬNULL(ОплатаПоставщику, 0)

Важный совет: По возможности заменяйте NULL на 0 непосредственно в тексте запроса. Это повышает производительность и избавляет от необходимости загромождать настройки компоновки сложными конструкциями.

Где писать формулу: Вычисляемые поля или Ресурсы?

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

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

Рассмотрим ситуацию из практики: вам нужно умножить количество на цену. Если вы сделаете это в ресурсах как Сумма(Цена) * Сумма(Количество), вы получите огромную неверную цифру. Правильный порядок действий в таком случае:

1. В Вычисляемых полях создаем поле Стоимость с выражением:

ЕСТЬNULL(Цена, 0) * ЕСТЬNULL(Количество, 0)

2. В Ресурсах для этого поля указываем выражение:

Сумма(Стоимость)

Ошибка "Данного поля нет" и работа с группировками

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

Проанализируем порядок исправления такой ошибки:

Сложные расчеты: Скидки и задолженность

Посмотрим на пример из реальной задачи: расчет задолженности перед поставщиком на основе проданных товаров. Формула может выглядеть так:

(ЦенаПоставщика - СуммаСкидки) * ПроданноеКоличество

Здесь важно учитывать архитектуру конфигурации (например, УТ 11). Помните, что СуммаРучнойСкидки в табличной части часто относится ко всей строке, а не к одной единице товара. В таком случае формула должна быть скорректирована:


// Если Скидка указана на весь объем в строке:
(ЦенаПоставщика * КоличествоПродано) - (СуммаСкидки / КоличествоЗаказано * КоличествоПродано)

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

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

Рассмотрим важный нюанс, упомянутый опытными разработчиками: если сначала отминусовать значения, а потом сгруппировать строки — результат будет верный. Но если сначала помножить 0 на 5 и 10 на 0, а затем сгруппировать, вы получите 0. Это часто происходит при использовании ПОЛНОЕ СОЕДИНЕНИЕ в запросах.

Чтобы избежать этой ситуации, следуйте алгоритму:

  1. Проверьте связи наборов данных.
  2. Используйте ВЫБОР КОГДА ... ТОГДА в выражениях ресурсов, если нужно исключить определенные значения из расчета итогов.
  3. При использовании функции СУММА() в ресурсах, помните, что она игнорирует NULL, но если вы складываете два ресурса, каждый из которых может быть NULL, оберните их в ЕСТЬNULL:

ЕСТЬNULL(Сумма(Поле1), 0) - ЕСТЬNULL(Сумма(Поле2), 0)

Заключение

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

← На главную