Как запретить продажу ниже закупки или себестоимости в 1С:Бухгалтерия 8.3?

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

В процессе ведения учета в программе 1С:Бухгалтерия 8.3 (ред. 3.0) владельцы бизнеса и руководители нередко сталкиваются с человеческим фактором. Типичный пример: бухгалтер или менеджер по продажам при ручном вводе документа реализации ошибается в количестве нулей и продает товар за 400 рублей вместо 4000 рублей. В результате компания несет прямые убытки, а в учете искажаются финансовые показатели.

В отличие от специализированных торговых конфигураций, таких как 1С:Управление торговлей или 1С:Управление нашей фирмой, в стандартной 1С:Бухгалтерии отсутствует встроенный флаг в дополнительных правах пользователей «Запретить продажи ниже себестоимости». В этой статье мы подробно разберем, почему так происходит, и рассмотрим три эффективных способа решения этой проблемы: от организационных настроек программы до разработки собственного расширения конфигурации.

Почему в 1С:Бухгалтерии сложно контролировать себестоимость «на лету»?

Для начала проанализируем внутренние механизмы программы. Бухгалтерский учет устроен так, что точная и окончательная себестоимость единицы списанного товара формируется только в момент выполнения регламентной операции «Закрытие месяца». В течение отчетного периода расчет себестоимости зависит от настроек проведения документов.

Перейдем в раздел Администрирование — Проведение документов и обратим внимание на параметр «Время списания себестоимости»:

  1. При закрытии месяца: При такой настройке программа при проведении расходных накладных в течение месяца списывает только количественные остатки товаров. Денежная оценка (себестоимость) рассчитывается единым регламентным документом в конце месяца. При этом режиме никакой программный запрет при проведении накладной физически не сможет сравнить цену продажи с себестоимостью, поскольку последняя еще просто не рассчитана.
  2. При проведении документов: В этом случае программа рассчитывает «скользящую себестоимость» по средней цене или по методу ФИФО прямо в момент проведения документа реализации. Но и этот расчет является предварительным. Если документы поступления или реализации вводятся «задним числом», себестоимость партий будет постоянно пересчитываться, что может сделать оперативный контроль неточным.

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

Решение 1. Настройка типов цен и автозаполнения документов (Без программирования)

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

Разберем этот процесс по шагам:

  1. Перейдем в справочник Типы цен номенклатуры (раздел Справочники — Номенклатура — Типы цен) и создадим новый тип цен, например, «Оптовая» или «Розничная».
  2. С помощью документа Установка цен номенклатуры зафиксируем актуальные цены для всех продаваемых позиций. Это будет наш утвержденный прайс-лист.
  3. В актуальных релизах 1С:Бухгалтерии (начиная с версии 3.0.182) перейдем в карточку номенклатуры или в общие настройки заполнения цен через меню Справочники — Настройка заполнения цен. Настроим программу так, чтобы при создании документов продажи цены подтягивались строго из установленного типа цен.
  4. Для предотвращения ручного редактирования цен пользователями можно настроить права доступа. Если у пользователя (например, бухгалтера) будут ограничены права (отсутствует роль на редактирование цен), он будет вынужден использовать только автоматически заполняемые цены, что исключит ошибку «потерянного нуля».

Решение 2. Корректная настройка интеграции с торговой системой

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

Мы рекомендуем настроить полноценный двусторонний обмен данными между базами:

Решение 3. Техническая доработка: Создание расширения конфигурации

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

Рассмотрим пример создания программного контроля цен при проведении документа. Нам потребуется создать подписку на событие ОбработкаПроведения для документа РеализацияТоваровУслуг или перехватить процедуру проведения в расширении.

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


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

КонецПроцедуры

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

Важность контроля цен: Налоговые риски

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

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

← На главную