В процессе разработки отчетов в системе компоновки данных (СКД) одной из самых частых задач является расчет относительных показателей, таких как наценка или рентабельность. Часто начинающие разработчики сталкиваются с вопросом: как объединить сложные математические операции в одном поле, избежать ошибок при делении на ноль и обеспечить корректный расчет итогов по группам товаров. В этой статье мы подробно разберем, как реализовать расчет наценки правильно и профессионально.
Прежде чем переходить к написанию кода в 1С, давайте проанализируем саму формулу. В бизнесе часто путают два понятия: наценку и маржу (рентабельность). Разберем их различия, чтобы наш отчет выдавал именно те цифры, которые ждет заказчик:
Формула: (Цена продажи - Цена закупки) / Цена закупки * 100
Формула: (Цена продажи - Цена закупки) / Цена продажи * 100
В рамках обсуждаемой темы нас интересует именно наценка. Важно помнить, что если цена закупки равна нулю (например, товар был оприходован по нулевой стоимости), классическая формула наценки математически теряет смысл, так как деление на ноль недопустимо.
Рассмотрим ситуацию, когда мы хотим произвести расчет непосредственно в тексте запроса СКД. Это наиболее эффективный метод с точки зрения производительности, так как основные вычисления ложатся на СУБД. Проанализируем, как должна выглядеть конструкция, учитывающая проверку на нулевые значения:
ВЫБОР
КОГДА ЕстьNull(ЗакупочныеЦены.Цена, 0) <> 0
ТОГДА (ЕстьNull(РеализацияТоваровУслугТовары.Цена, 0) - ЕстьNull(ЗакупочныеЦены.Цена, 0)) / ЗакупочныеЦены.Цена * 100
ИНАЧЕ 0
КОНЕЦ КАК НаценкаПроцент
В данном примере мы используем оператор ВЫБОР, который позволяет нам сначала проверить делитель. Если ЗакупочнаяЦена не равна нулю, программа выполняет расчет. В противном случае выводится 0. Использование функции ЕстьNull крайне важно, чтобы избежать ошибок при обработке пустых значений в базе данных.
Если данные о ценах приходят из разных наборов данных (например, из разных запросов или объектных данных), расчет удобнее вынести на вкладку "Вычисляемые поля" в конструкторе СКД. Это позволяет не загромождать текст запроса лишней логикой.
Посмотрим на алгоритм добавления такого поля:
НаценкаПроцент.Пример выражения:
Выбор Когда ЗакупочнаяЦена = 0 Тогда 0 Иначе (ЦенаПродажи - ЗакупочнаяЦена) / ЗакупочнаяЦена * 100 Конец
Преимущество этого метода в том, что СКД автоматически подставит значения полей после выполнения всех объединений и связей между наборами данных.
Это самый важный этап, на котором совершается большинство ошибок. Если мы просто рассчитаем процент в детальных записях и выведем его в отчет, то при группировке товаров СКД по умолчанию применит функцию Сумма к процентам. Например, если у одного товара наценка 20%, а у другого 30%, в итоге группы вы увидите 50%, что в корне неверно.
Выясним, как правильно настроить вкладку "Ресурсы". Для получения корректного среднего процента наценки по группе или по всему отчету, нужно использовать формулу агрегатных функций:
(Сумма(СуммаПродажи) - Сумма(СуммаЗакупки)) / Сумма(СуммаЗакупки) * 100
Обратите внимание на логику: мы сначала суммируем все рублевые показатели (выручку и себестоимость), и только потом выполняем деление. Только такой подход обеспечит математическую точность итоговых строк отчета.
Не забудьте обернуть делитель в проверку на ноль и в ресурсах, если есть вероятность отсутствия закупок в итогах:
ВЫБОР
КОГДА Сумма(СуммаЗакупки) = 0
ТОГДА 0
ИНАЧЕ (Сумма(СуммаПродажи) - Сумма(СуммаЗакупки)) / Сумма(СуммаЗакупки) * 100
КОНЕЦ
Чтобы отчет был читабельным, проанализируем настройки оформления поля НаценкаПроцент. В СКД это можно сделать на уровне настроек набора данных или в условном оформлении.
Рекомендуемые параметры:
ЧЦ=15; ЧДЦ=2. Это уберет "хвосты" типа 25.33333333% и оставит лаконичные 25.33.НаценкаПроцент < 0 текст окрашивался в красный цвет. Это мгновенно подсветит менеджеру продажи, совершенные в убыток.Если в вашей конфигурации расчет наценки является сложным (например, учитываются дополнительные расходы, бонусы или переменные курсы валют), целесообразно вынести расчет в программный код. В СКД в поле выражения можно обращаться к функциям общих модулей.
Допустим, у нас есть общий модуль ЦенообразованиеСервер. Тогда выражение может выглядеть так:
ЦенообразованиеСервер.РассчитатьПроцентНаценки(ЦенаПродажи, ЦенаЗакупки)
Важное условие: функция в общем модуле должна быть помечена ключевым словом Экспорт, а сам модуль должен иметь флаг "Сервер" и "Вызов сервера" (или "Клиент", в зависимости от контекста выполнения отчета).
Подведем итог: расчет наценки в СКД одним полем — это не просто написание формулы, а комплексная задача, включающая проверку делителя, правильную агрегацию в ресурсах и настройку визуального представления. Используя приведенные выше инструкции, вы сможете создавать точные и надежные аналитические инструменты для бизнеса.