В процессе ведения торговой деятельности контроль маржинальности является одной из приоритетных задач. Продажа товара в убыток (ниже себестоимости) может быть оправдана только в исключительных случаях, таких как ликвидация остатков или маркетинговые акции. В остальных ситуациях это чаще всего является следствием ошибки менеджера или кассира. Рассмотрим подробно, как реализовать механизм запрета таких операций в программе 1С:Управление нашей фирмой редакции 3.0.
Разберем ситуацию, когда нам необходимо жестко ограничить возможность проведения документа, если цена реализации меньше себестоимости. В сообщении на форуме предложен лаконичный код, который можно внедрить в логику проверки документа. Проанализируем этот подход подробнее.
Для реализации этой проверки нам потребуется создать расширение конфигурации, чтобы не снимать основную программу с поддержки. Мы будем использовать обработчик события ОбработкаПроверкиЗаполнения или ПередЗаписью в модуле объекта документа (например, РасходнаяНакладная или ЧекККМ).
Рассмотрим пример кода, который перебирает строки табличной части «Запасы» и сравнивает цену с себестоимостью:
Процедура Расшир_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Для Каждого СтрокаТЧ Из ЭтотОбъект.Запасы Цикл
// Проверяем наличие данных о себестоимости в строке
// Важно: в УНФ себестоимость может не храниться в ТЧ документа напрямую
Если СтрокаТЧ.Цена < СтрокаТЧ.Себестоимость Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товар " + СтрокаТЧ.Номенклатура + " продается ниже себестоимости!";
Сообщение.Поле = "Запасы[" + (СтрокаТЧ.НомерСтроки - 1) + "].Цена";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Выясним важный нюанс: поле Себестоимость в табличной части документа часто бывает скрытым или не заполненным в оперативном режиме. Программа 1С:УНФ рассчитывает точную себестоимость только после выполнения процедуры Закрытие месяца. Поэтому для оперативного контроля мы рекомендуем использовать вместо себестоимости показатель Последняя цена закупки или расчетную величину из регистра Запасы.
Разберем штатный функционал системы, который не требует программирования. В 1С:УНФ 3.0 предусмотрен механизм работы с минимальными ценами. Это более гибкий инструмент, так как он позволяет задать порог рентабельности для разных групп товаров.
Выполним следующие шаги для настройки:
[ЦенаЗакупки] * 1.05 (что будет означать запрет на продажу ниже закупочной цены плюс 5% наценки).После этих действий система будет автоматически проверять цену в документах Заказ покупателя и Расходная накладная. Если менеджер попытается установить цену ниже этого порога, программа выдаст предупреждение или запретит проведение в зависимости от настроек прав доступа. Для гибкой настройки такого контроля с разделением по сотрудникам можно использовать расширение для проверки минимальной цены с наценкой по пользователям.
Для розничной торговли в 1С:УНФ 3.0 предусмотрены специализированные настройки профиля РМК. Если ваш кассир работает через этот интерфейс, мы можем заблокировать возможность продажи в минус буквально одной «галочкой».
Проанализируем порядок действий:
Этот метод является наиболее эффективным для розницы, так как он предотвращает ошибку еще на этапе формирования корзины покупателя, до того как будет пробит фискальный чек.
Иногда проблема заключается не в отсутствии автоматизации, а в избыточных правах сотрудников. Посмотрим на ситуацию с точки зрения администрирования прав доступа. В 1С:УНФ 3.0 можно гибко настроить права для профилей сотрудников.
Нам необходимо проверить следующие права:
Цены (прайс-листе).Рекомендуем оставить право изменения цен только старшим менеджерам или руководителям отделов, тогда как рядовые сотрудники будут работать строго по утвержденному прайсу, который изначально формируется выше себестоимости.
Проанализируем важный методологический момент. Как уже упоминалось, Себестоимость в 1С:УНФ — величина переменная. Она включает в себя не только закупочную стоимость товара, но и дополнительные расходы (доставка, таможня, сборка). Полная себестоимость часто становится известна только в конце месяца. Для оперативного отслеживания таких затрат подойдёт расширение для отображения последней закупочной цены с учетом дополнительных расходов.
Поэтому, если мы хотим внедрить контроль «здесь и сейчас», лучше ориентироваться на один из следующих показателей:
ЦеныНоменклатуры с соответствующим видом цены).Если вы выбрали путь программной доработки (Метод 1), рекомендуем использовать запрос к остаткам регистра Запасы, чтобы получить актуальную оценку стоимости товара на складе прямо в момент проведения документа. Рассмотрим фрагмент запроса для получения оценки себестоимости:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗапасыОстатки.СуммаОстаток / ЗапасыОстатки.КоличествоОстаток КАК СредняяЦена
|ИЗ
| РегистрНакопления.Запасы.Остатки(&МоментВремени, Номенклатура = &Номенклатура) КАК ЗапасыОстатки";
Запрос.УстановитьПараметр("МоментВремени", ЭтотОбъект.МоментВремени());
Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
// Далее выполнение запроса и сравнение с ценой в строке...
Подведем итог: для быстрого решения без программирования используйте настройки Минимальных цен продажи и профили РМК. Для более тонкой настройки и учета специфики вашего бизнеса (например, учет НДС или учет доп. расходов в себестоимости) лучше прибегнуть к созданию небольшого расширения с проверкой в модуле проведения.