Как в 1С:УНФ 3.0 установить запрет на продажу товара ниже себестоимости

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

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

Метод 1: Программная проверка при проведении документа

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

Для реализации этой проверки нам потребуется создать расширение конфигурации, чтобы не снимать основную программу с поддержки. Мы будем использовать обработчик события ОбработкаПроверкиЗаполнения или ПередЗаписью в модуле объекта документа (например, РасходнаяНакладная или ЧекККМ).

Рассмотрим пример кода, который перебирает строки табличной части «Запасы» и сравнивает цену с себестоимостью:


Процедура Расшир_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        
        Для Каждого СтрокаТЧ Из ЭтотОбъект.Запасы Цикл
            
            // Проверяем наличие данных о себестоимости в строке
            // Важно: в УНФ себестоимость может не храниться в ТЧ документа напрямую
            Если СтрокаТЧ.Цена < СтрокаТЧ.Себестоимость Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Товар " + СтрокаТЧ.Номенклатура + " продается ниже себестоимости!";
                Сообщение.Поле = "Запасы[" + (СтрокаТЧ.НомерСтроки - 1) + "].Цена";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
                Отказ = Истина;
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Выясним важный нюанс: поле Себестоимость в табличной части документа часто бывает скрытым или не заполненным в оперативном режиме. Программа 1С:УНФ рассчитывает точную себестоимость только после выполнения процедуры Закрытие месяца. Поэтому для оперативного контроля мы рекомендуем использовать вместо себестоимости показатель Последняя цена закупки или расчетную величину из регистра Запасы.

Метод 2: Настройка минимальных цен продажи

Разберем штатный функционал системы, который не требует программирования. В 1С:УНФ 3.0 предусмотрен механизм работы с минимальными ценами. Это более гибкий инструмент, так как он позволяет задать порог рентабельности для разных групп товаров.

Выполним следующие шаги для настройки:

  1. Перейдем в раздел Продажи — Настройки и убедимся, что включена опция использования нескольких видов цен.
  2. Создадим новый вид цены и назовем его Минимальная цена продажи.
  3. В способе расчета установим Динамический (по другим ценам) или Динамический (по формуле). В формуле мы можем указать: [ЦенаЗакупки] * 1.05 (что будет означать запрет на продажу ниже закупочной цены плюс 5% наценки).
  4. В настройках программы (раздел Продажи) установим созданный вид цены в качестве Минимально допустимого.

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

Метод 3: Ограничения в Рабочем месте кассира (РМК)

Для розничной торговли в 1С:УНФ 3.0 предусмотрены специализированные настройки профиля РМК. Если ваш кассир работает через этот интерфейс, мы можем заблокировать возможность продажи в минус буквально одной «галочкой».

Проанализируем порядок действий:

  1. Зайдем в раздел Продажи — Профили РМК.
  2. Выберем используемый профиль и перейдем на закладку Формирование чека.
  3. Найдем параметр Разрешить цены ниже минимальных. Установим значение в Ложь (снимем флажок).
  4. Также полезно ограничить Максимальный процент скидки, чтобы кассир не смог «уронить» цену ниже критической отметки с помощью ручных скидок.

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

Метод 4: Ограничение прав доступа (Роли)

Иногда проблема заключается не в отсутствии автоматизации, а в избыточных правах сотрудников. Посмотрим на ситуацию с точки зрения администрирования прав доступа. В 1С:УНФ 3.0 можно гибко настроить права для профилей сотрудников.

Нам необходимо проверить следующие права:

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

Сложности учета: Себестоимость vs Цена закупки

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

Поэтому, если мы хотим внедрить контроль «здесь и сейчас», лучше ориентироваться на один из следующих показателей:

  1. Учетная цена (если в настройках выбран метод оценки «По средней»).
  2. Последняя цена закупки (из регистра сведений ЦеныНоменклатуры с соответствующим видом цены).
  3. Плановая себестоимость (устанавливается вручную в карточке товара).

Если вы выбрали путь программной доработки (Метод 1), рекомендуем использовать запрос к остаткам регистра Запасы, чтобы получить актуальную оценку стоимости товара на складе прямо в момент проведения документа. Рассмотрим фрагмент запроса для получения оценки себестоимости:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗапасыОстатки.СуммаОстаток / ЗапасыОстатки.КоличествоОстаток КАК СредняяЦена
    |ИЗ
    |	РегистрНакопления.Запасы.Остатки(&МоментВремени, Номенклатура = &Номенклатура) КАК ЗапасыОстатки";

Запрос.УстановитьПараметр("МоментВремени", ЭтотОбъект.МоментВремени());
Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
// Далее выполнение запроса и сравнение с ценой в строке...

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

← На главную