Как в отчете СКД рассчитать процент скидки и избежать ошибки деления на ноль?

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

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

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

Решение 1: Расчет процента напрямую в тексте запроса СКД

Этот метод является наиболее производительным и предпочтительным, поскольку все вычисления производятся на стороне сервера баз данных (СУБД), еще до того, как данные попадут в обработку 1С. Это значительно ускоряет формирование отчета на больших объемах данных. Для реализации мы будем использовать конструкцию ВЫБОР КОГДА языка запросов 1С.

Проанализируем ситуацию: у нас есть два поля, например, СуммаПродажи и СуммаБезСкидки. Формула для расчета процента скидки выглядит так: (1 - СуммаПродажи / СуммаБезСкидки) * 100. Ошибка деления на ноль возникнет, если СуммаБезСкидки окажется равной нулю.

Чтобы избежать этой ошибки, мы добавим в запрос проверку. Разберем по шагам, как это сделать:

  1. Откройте схему компоновки данных вашего отчета.
  2. Перейдите на вкладку "Наборы данных" и выберите ваш основной набор данных типа "Запрос".
  3. Нажмите кнопку "Конструктор запроса..." или откройте текст запроса для редактирования.
  4. В секцию ВЫБРАТЬ вашего запроса добавьте следующую конструкцию:

ВЫБОР
    КОГДА ИсходныеДанные.СуммаБезСкидки = 0
        ТОГДА 0
    ИНАЧЕ (1 - ИсходныеДанные.СуммаПродажи / ИсходныеДанные.СуммаБезСкидки) * 100
КОНЕЦ КАК ПроцентСкидки

Рассмотрим подробнее, что делает этот код:

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

Решение 2: Использование вычисляемых полей в настройках СКД

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

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

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

В поле "Выражение" введите следующую строку:

?(СуммаБезСкидки = 0, 0, (1 - СуммаПродажи / СуммаБезСкидки) * 100)

Этот синтаксис полностью аналогичен конструкции ВЫБОР КОГДА в запросе: если СуммаБезСкидки равна 0, то возвращается 0, иначе вычисляется процент.

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


ВычислитьВыражение("?(СуммаБезСкидки = 0, 0, (1 - СуммаПродажи / СуммаБезСкидки) * 100)")

Для нашей простой задачи оба варианта в вычисляемых полях дадут одинаковый результат.

Решение 3: Форматирование и представление результата

После того как поле с процентом рассчитано одним из вышеописанных способов, его нужно красиво вывести в отчете — с нужным количеством знаков после запятой и, возможно, со знаком "%".

Посмотрим, как это настроить:

  1. Перейдите на вкладку "Настройки" в схеме компоновки данных.
  2. В структуре отчета выберите группировку или детальные записи, где выводится поле ПроцентСкидки.
  3. Перейдите на вкладку "Выбранные поля". Найдите ваше поле ПроцентСкидки.
  4. Выделите его и в свойствах элемента пользовательских настроек (в нижней части окна) найдите свойство "Оформление". Нажмите на гиперссылку "Формат".
  5. В открывшемся окне "Редактирование формата" вы можете настроить представление числа. Например, чтобы отображать два знака после запятой, установите "Точность" равной 2.
  6. Чтобы добавить знак процента, можно использовать форматную строку. В поле "Формат" введите строку вида: ЧДЦ=2; ЧН=' '; ЧГ=0, а в макете отчета на вкладке "Макеты" добавить рядом с полем текстовую ячейку со знаком "%". Более элегантный способ — настроить условное оформление.

Настройка через условное оформление:

  1. На вкладке "Условное оформление" добавьте новый элемент.
  2. В колонке "Оформление" задайте параметр "Формат".
  3. В качестве значения формата укажите строку, которая включает знак процента, например: "ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧРГ=' '; ЧН=0,00; ЧФ=С" и в текстовом представлении добавить в конце '%'. Например, `"Формат('ЧДЦ=2') + ' %'"`. Однако, правильнее настроить формат числа, а знак процента добавить в макете. Для числового формата используйте: ЧДЦ=2 (Число десятичных знаков = 2).
  4. В колонке "Оформляемые поля" укажите ваше поле ПроцентСкидки.

Таким образом, вы получите не только корректно рассчитанное, но и аккуратно отформатированное значение в итоговом отчете.

← На главную