Как в 1С изменить оптовую цену на ту же сумму (дельту) при ручном изменении розничной цены?

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

Рассмотрим достаточно интересную и неочевидную задачу ценообразования, с которой часто сталкиваются компании. Допустим, у нас есть два вида цен — розничные и оптовые. Цены задаются вручную. Возникает потребность: если мы повышаем розничную цену на конкретную сумму (например, на 10 рублей), оптовая цена также должна автоматически увеличиться ровно на 10 рублей. Например, если розничная цена была 50 руб., а оптовая 30 руб., то при изменении розничной на 60 руб., оптовая должна стать 40 руб.

Проблема заключается в том, что в типовых конфигурациях 1С (таких как УТ 11, КА 2, ERP) формулы ценообразования отлично работают с процентами (наценками) или с фиксированной абсолютной суммой для всего вида цен. Но если разрыв (дельта) между оптовой и розничной ценой уникален для каждой позиции номенклатуры, стандартная формула вида [Розничная] - 100 нам не подойдет. Разберем по шагам несколько рабочих способов решения этой проблемы.

Способ 1. Использование дополнительных реквизитов номенклатуры

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

  1. Перейдем в настройки программы и включим использование дополнительных реквизитов.
  2. Создадим для справочника номенклатуры новый числовой реквизит и назовем его, например, ФиксированнаяРазница.
  3. Заполним этот реквизит для товаров. Например, для шоколадки "Аленка" укажем 20, для другого товара — 100.
  4. Зайдем в справочник видов цен. Для оптовой цены установим способ задания Рассчитывать по формуле.
  5. В редакторе формул пропишем следующее: [Розничная] - [ФиксированнаяРазница].

Посмотрим на результат: теперь в документе установки цен при любом ручном изменении розничной цены, оптовая цена пересчитается автоматически, вычтя индивидуальную дельту конкретного товара.

Способ 2. Произвольный запрос к базе данных (через СКД)

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

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

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

Способ 3. Штатный инструмент "Изменить цены" в документе

Если цены меняются не каждый день, и дельта одинакова для группы выделенных товаров, проанализируем возможности самого документа Установка цен номенклатуры.

  1. В табличной части документа выделим нужные строки с товарами.
  2. Нажмем кнопку Изменить цены (в некоторых версиях Изменить на...).
  3. Выберем вариант изменения на абсолютную сумму (например, +10 рублей).

Система применит это приращение ко всем выделенным колонкам. Таким образом, розничная цена увеличится на 10 рублей, и оптовая увеличится на 10 рублей. Историческая дельта между ними сохранится.

Способ 4. Создание расширения или внешней обработки

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

Логика работы такого расширения будет срабатывать при изменении колонки с розничной ценой:


// Псевдокод алгоритма пересчета
СтараяРозничная = ПолучитьСтаруюЦенуИзБазы(ТекСтрока.Номенклатура, ВидЦеныРозничная);
Разница = ТекСтрока.РозничнаяЦена - СтараяРозничная;

Если Разница <> 0 Тогда
    СтараяОптовая = ПолучитьСтаруюЦенуИзБазы(ТекСтрока.Номенклатура, ВидЦеныОптовая);
    ТекСтрока.ОптоваяЦена = СтараяОптовая + Разница;
КонецЕсли;

Такой подход займет у разработчика 1-2 часа, зато полностью снимет головную боль с пользователей. Им достаточно будет просто вбить новую розничную цену, а оптовая подтянется автоматически на тот же денежный эквивалент.

Способ 5. Использование Excel для массовой загрузки

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

  1. Выгружаем текущие цены (розничные и оптовые) из 1С в Excel.
  2. В Excel добавляем колонку "Новая розничная цена" и вписываем новые значения.
  3. В колонке "Новая оптовая цена" пишем простую математическую формулу: Новая Оптовая = Старая Оптовая + (Новая Розничная - Старая Розничная).
  4. Протягиваем формулу на весь прайс-лист.
  5. Загружаем итоговый файл обратно в документ установки цен через встроенную команду загрузки из внешнего файла. 1С сама сопоставит номенклатуру.

Важный нюанс: Округление цен

Какой бы способ мы ни выбрали, обязательно проанализируем правила округления. Если для розничной цены настроено округление (например, до 10 рублей), а для оптовой оно отключено или настроено иначе (до копеек), то после нескольких таких "относительных сдвигов" математическая разница начнет искажаться. Рекомендуется задавать идентичные правила округления для связанных видов цен, если для вас критически важно сохранять копейка-в-копейку фиксированный разрыв между оптом и розницей.

← На главную