В торговой практике очень часто возникает необходимость гибкого ценообразования. Одно из наиболее популярных правил — установка прогрессивной шкалы наценки. Например, для недорогих товаров (закупка до 100 рублей) мы хотим установить наценку в размере 10%, для товаров средней ценовой категории (от 101 до 200 рублей) — 20%, а для дорогих позиций — 30% и более. Такой подход позволяет оставаться конкурентоспособными и при этом компенсировать издержки на дешевом ассортименте.
В программном продукте 1С:Управление торговлей 11.4 для этого предусмотрен удобный редактор формул в правилах ценообразования. Однако при его использовании на определенных релизах пользователи сталкиваются с крайне неприятной технической ошибкой: система ломает синтаксис, заменяя запятые на точки, из-за чего формулы перестают работать. В этой статье мы подробно разберем, как обойти этот баг, как правильно написать формулу расчета цены и какие существуют альтернативные способы решения этой задачи.
Проанализируем все возможные варианты настройки — от простых формул до запросов к базе данных и штатного функционала ценовых групп.
---
Выясним причину странного поведения программы, когда корректно написанная формула после записи изменяется сама собой, превращая запятые в точки. Эта проблема воспроизводилась на релизе конфигурации 11.4.3.160.
Дело в том, что в коде платформы и самой конфигурации за разбор (парсер) текстовых формул отвечает встроенный синтаксический анализатор. При сохранении формулы система пытается нормализовать строку и обращается к региональным настройкам операционной системы Windows. Если в вашей операционной системе в качестве разделителя дробной части установлена запятая, парсер ошибочно принимает разделители параметров функции ?() за дробные знаки и принудительно преобразует их в точки. В результате конструкция вида ?(Условие, Истина, Ложь) превращается в синтаксический мусор вида ?.(Условие. Истина. Ложь), который программа уже не может рассчитать.
Как решить эту проблему:
---
Рассмотрим, как должна выглядеть математически и логически верная формула для расчета цен. Нам необходимо использовать вложенный тернарный оператор ?(). Его базовый синтаксис выглядит так: ?(Условие, ВыражениеЕслиИстина, ВыражениеЕслиЛожь).
Частая ошибка пользователей заключается в написании избыточных условий. Не нужно писать конструкции вида [Оптоваяцена] >= 100 И [Оптоваяцена] < 200. Поскольку условия внутри формулы проверяются последовательно (слева направо), мы можем существенно упростить запись. Если цена не подошла под первый критерий (например, не оказалась меньше или равна 100), система автоматически переходит к следующей проверке, где цена гарантированно больше 100.
Посмотрим на пример правильной структуры вложенного условия для прогрессивной наценки:
?([ЗакупочнаяЦена] <= 100, [ЗакупочнаяЦена] * 1.1, ?([ЗакупочнаяЦена] <= 200, [ЗакупочнаяЦена] * 1.2, ?([ЗакупочнаяЦена] <= 300, [ЗакупочнаяЦена] * 1.3, [ЗакупочнаяЦена] * 1.4)))
Разберем по шагам, как работает этот алгоритм расчета:
[ЗакупочнаяЦена] меньше или равна 100, то цена продажи рассчитывается как закупка с наценкой 10% (умножаем на 1.1).?() и проверяет: меньше или равна ли цена 200? Если да, наценка составляет 20% (умножаем на 1.2).---
Если у вас сложная матрица наценок, использование вложенных операторов ?() в интерфейсе формул становится неудобным: легко запутаться в закрывающих скобках и запятых. Кроме того, этот метод чувствителен к системным багам платформы. Рассмотрим более надежный и профессиональный инструмент — расчет цен через **Произвольный запрос**.
Этот механизм базируется на Системе компоновки данных (СКД) и позволяет использовать всю мощь языка запросов 1С, включая конструкцию ВЫБОР КОГДА ... ТОГДА.
Выполним настройку по шагам:
В самом запросе мы можем написать понятную, легко читаемую и масштабируемую структуру:
ВЫБОР
КОГДА ИсточникДанных.Цена <= 100
ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.10 КАК ЧИСЛО(15, 2))
КОГДА ИсточникДанных.Цена <= 200
ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.20 КАК ЧИСЛО(15, 2))
КОГДА ИсточникДанных.Цена <= 300
ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.30 КАК ЧИСЛО(15, 2))
ИНАЧЕ ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.40 КАК ЧИСЛО(15, 2))
КОНЕЦ
Преимущества работы через СКД:
ВЫРАЗИТЬ.---
Зачастую логика «разная наценка в зависимости от цены» является следствием того, что в базе перемешаны разные типы номенклатуры. Например, дешевая канцелярия требует наценки 100%, а дорогие принтеры — всего 10%. В этом случае правильнее использовать штатный механизм конфигурации — Ценовые группы, который не требует написания формул и программирования вообще.
Разберем этот бизнес-процесс:
Этот способ является наиболее чистым с точки зрения методологии учета 1С. Он позволяет менеджерам по продажам и закупкам легко управлять ценами без привлечения программистов для изменения сложных формул или запросов при изменении конъюнктуры рынка.