Как настроить разный процент наценки в зависимости от закупочной цены в 1С:УТ 11.4 и решить проблему с формулами

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

В торговой практике очень часто возникает необходимость гибкого ценообразования. Одно из наиболее популярных правил — установка прогрессивной шкалы наценки. Например, для недорогих товаров (закупка до 100 рублей) мы хотим установить наценку в размере 10%, для товаров средней ценовой категории (от 101 до 200 рублей) — 20%, а для дорогих позиций — 30% и более. Такой подход позволяет оставаться конкурентоспособными и при этом компенсировать издержки на дешевом ассортименте.

В программном продукте 1С:Управление торговлей 11.4 для этого предусмотрен удобный редактор формул в правилах ценообразования. Однако при его использовании на определенных релизах пользователи сталкиваются с крайне неприятной технической ошибкой: система ломает синтаксис, заменяя запятые на точки, из-за чего формулы перестают работать. В этой статье мы подробно разберем, как обойти этот баг, как правильно написать формулу расчета цены и какие существуют альтернативные способы решения этой задачи.

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

---

Причина проблемы: баг с автозаменой запятых на точки в УТ 11.4.3.160

Выясним причину странного поведения программы, когда корректно написанная формула после записи изменяется сама собой, превращая запятые в точки. Эта проблема воспроизводилась на релизе конфигурации 11.4.3.160.

Дело в том, что в коде платформы и самой конфигурации за разбор (парсер) текстовых формул отвечает встроенный синтаксический анализатор. При сохранении формулы система пытается нормализовать строку и обращается к региональным настройкам операционной системы Windows. Если в вашей операционной системе в качестве разделителя дробной части установлена запятая, парсер ошибочно принимает разделители параметров функции ?() за дробные знаки и принудительно преобразует их в точки. В результате конструкция вида ?(Условие, Истина, Ложь) превращается в синтаксический мусор вида ?.(Условие. Истина. Ложь), который программа уже не может рассчитать.

Как решить эту проблему:

  1. Обновление конфигурации: Самый надежный и правильный путь. Разработчики исправили этот баг в последующих релизах. Начиная с версии 11.4.8.73 и выше, синтаксический анализатор работает корректно, сохраняя все запятые на своих местах.
  2. Временное изменение настроек ОС: Если оперативно обновить базу невозможно, можно временно изменить региональные стандарты в панели управления Windows. Установите в качестве разделителя элементов списка запятую, а в качестве разделителя дробной части — точку (английский стандарт). После этого перезапустите сессию 1С и сохраните формулу.

---

Вариант решения №1: Правильный синтаксис формулы в 1С

Рассмотрим, как должна выглядеть математически и логически верная формула для расчета цен. Нам необходимо использовать вложенный тернарный оператор ?(). Его базовый синтаксис выглядит так: ?(Условие, ВыражениеЕслиИстина, ВыражениеЕслиЛожь).

Частая ошибка пользователей заключается в написании избыточных условий. Не нужно писать конструкции вида [Оптоваяцена] >= 100 И [Оптоваяцена] < 200. Поскольку условия внутри формулы проверяются последовательно (слева направо), мы можем существенно упростить запись. Если цена не подошла под первый критерий (например, не оказалась меньше или равна 100), система автоматически переходит к следующей проверке, где цена гарантированно больше 100.

Посмотрим на пример правильной структуры вложенного условия для прогрессивной наценки:


?([ЗакупочнаяЦена] <= 100, [ЗакупочнаяЦена] * 1.1, ?([ЗакупочнаяЦена] <= 200, [ЗакупочнаяЦена] * 1.2, ?([ЗакупочнаяЦена] <= 300, [ЗакупочнаяЦена] * 1.3, [ЗакупочнаяЦена] * 1.4)))

Разберем по шагам, как работает этот алгоритм расчета:

  1. Система проверяет: если [ЗакупочнаяЦена] меньше или равна 100, то цена продажи рассчитывается как закупка с наценкой 10% (умножаем на 1.1).
  2. Если это условие ложно (то есть закупка уже строго больше 100), система переходит ко второму оператору ?() и проверяет: меньше или равна ли цена 200? Если да, наценка составляет 20% (умножаем на 1.2).
  3. Если закупка больше 200, проверяется следующее условие: меньше или равна ли цена 300? Если да, наценка равна 30% (умножаем на 1.3).
  4. Для всех остальных случаев (когда цена закупки строго больше 300) сработает финальная ветка «Иначе», где наценка составит 40% (умножаем на 1.4).

---

Вариант решения №2: Произвольный запрос к данным ИБ (СКД)

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

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

Выполним настройку по шагам:

  1. Откроем карточку нужного Вида цен.
  2. В поле Способ задания цены выберем вариант «Произвольный запрос к данным ИБ».
  3. В поле ниже выберем схему компоновки данных, например, стандартную схему «Цены поступления».
  4. Нажмем кнопку «Редактировать схему компоновки» и перейдем в конструктор запроса.

В самом запросе мы можем написать понятную, легко читаемую и масштабируемую структуру:


ВЫБОР
    КОГДА ИсточникДанных.Цена <= 100 
        ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.10 КАК ЧИСЛО(15, 2))
    КОГДА ИсточникДанных.Цена <= 200 
        ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.20 КАК ЧИСЛО(15, 2))
    КОГДА ИсточникДанных.Цена <= 300 
        ТОГДА ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.30 КАК ЧИСЛО(15, 2))
    ИНАЧЕ ВЫРАЗИТЬ(ИсточникДанных.Цена * 1.40 КАК ЧИСЛО(15, 2))
КОНЕЦ

Преимущества работы через СКД:

---

Вариант решения №3: Настройка наценок по Ценовым группам

Зачастую логика «разная наценка в зависимости от цены» является следствием того, что в базе перемешаны разные типы номенклатуры. Например, дешевая канцелярия требует наценки 100%, а дорогие принтеры — всего 10%. В этом случае правильнее использовать штатный механизм конфигурации — Ценовые группы, который не требует написания формул и программирования вообще.

Разберем этот бизнес-процесс:

  1. Перейдем в раздел НСИ и администрирование -> Настройка разделов -> CRM и маркетинг и включим опцию «Ценовые группы».
  2. Создадим справочник ценовых групп (например: «Мелкие аксессуары», «Бытовая техника», «Премиум сегмент»).
  3. В карточках номенклатуры сопоставим каждый товар с соответствующей ценовой группой. Это можно сделать быстро с помощью групповой обработки справочника.
  4. В настройках нашего Вида цен выберем способ расчета «Наценка на другой вид цен» (указав в качестве базового вида цену закупки).
  5. Нажмем на появившуюся ссылку «Уточнить наценки по ценовым группам».
  6. В открывшейся таблице для каждой группы укажем свой индивидуальный процент наценки. Для «Мелких аксессуаров» — 50%, для «Бытовой техники» — 15%.

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

← На главную