Можно ли в 1С:Розница включить контроль отрицательных остатков на выбранные позиции номенклатуры?

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

В практической деятельности розничных магазинов часто возникает дилемма при настройке контроля остатков. С одной стороны, жесткий контроль необходим для подакцизных товаров (поможет автоматизированный контроль алкоголя в РМК 1С:Розница), маркированной продукции и дорогостоящего штучного ассортимента. Продажа таких позиций «в минус» гарантированно приводит к расхождениям в государственных информационных системах (ЕГАИС, «Честный Знак»), хаосу в учете и внушительным штрафам от контролирующих органов.

С другой стороны, существует категория товаров (например, свежая выпечка, хлеб, весовые овощи и фрукты), жесткий контроль остатков по которым может парализовать работу кассы. Если горячий хлеб привезли в 8:30 утра, а товаровед приступает к работе и заносит накладные в базу только в 10:00, кассир физически не сможет продать товар покупателям при включенном контроле остатков. Покупатели уйдут к конкурентам, а магазин понесет прямые убытки.

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

Ограничения типового функционала «1С:Розница» (версии 2.3 и 3.0)

Проанализируем стандартные возможности конфигурации. В коробочной версии программы «1С:Розница» разработчиками предусмотрен только глобальный контроль остатков. Настроить его попозиционно (для конкретных папок номенклатуры или отдельных карточек товаров) в режиме пользователя невозможно. Система предлагает только два варианта работы:

  1. Глобальный контроль при проведении документов: Настраивается в разделе Администрирование -> Настройки пользователей и прав -> Персональные настройки -> Дополнительные права пользователей. За это отвечает флаг Контролировать остатки и резерв товаров.
  2. Контроль непосредственно в РМК (Рабочем месте кассира): Настраивается в настройках РМК с помощью флага Контролировать остатки товаров при закрытии чека.

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

Бизнес-кейсы: почему «в минус» нельзя продавать пиво, но можно хлеб

Рассмотрим подробнее экономические и юридические причины, требующие выборочного подхода к контролю остатков:

Техническое решение: пошаговая реализация выборочного контроля через расширение

Выясним, как обойти ограничение платформы без снятия конфигурации с поддержки. Наиболее изящным и безопасным способом является создание расширения конфигурации (.cfe). Мы кастомизируем логику проверки остатков, не изменяя основную базу, что позволит без проблем обновлять «1С:Розницу» в будущем.

Разберем по шагам алгоритм создания и внедрения такого решения:

Шаг 1. Создание дополнительного реквизита номенклатуры

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

  1. Перейдем в раздел Администрирование -> Общие настройки -> Дополнительные реквизиты и сведения.
  2. Для свойства Номенклатура добавим новый реквизит с наименованием Разрешить продажу в минус (тип значения: Булево).
  3. В карточках товаров (хлеб, молоко, выпечка) установим этот флаг в значение Да (Истина) (поможет массовое изменение свойств и реквизитов номенклатуры). Для пива, сигарет и крепкого алкоголя оставим значение Нет (Ложь).

Шаг 2. Разработка расширения и перехват процедуры проверки остатков

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

Обычно проверка остатков в «1С:Розница» вызывается при проведении документа ЧекККМ или при закрытии чека в РМК. Мы можем перехватить процедуру проверки в общем модуле, который занимается контролем остатков (например, в модуле ПроведениеСервер или специализированном модуле контроля остатков).

Рассмотрим пример кода расширения, который модифицирует таблицу проверяемых товаров непосредственно перед осуществлением контроля остатков в БД. Мы применим аннотацию &Вместо или &Перед для перехвата процедуры:


&Вместо("ПроверитьОстаткиТоваров")
Процедура Расш_ПроверитьОстаткиТоваров(ТаблицаТоваров, ПараметрыПроверки, Отказ)
    
    // Создаем массив строк, которые необходимо исключить из проверки остатков
    СтрокиДляУдаления = Новый Массив;
    
    Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
        
        // Получаем значение нашего дополнительного реквизита
        РазрешитьМинус = Ложь;
        РеквизитРазрешитьМинус = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Разрешить продажу в минус");
        
        Если ЗначениеЗаполнено(РеквизитРазрешитьМинус) Тогда
            // Ищем значение свойства в табличной части дополнительных реквизитов номенклатуры
            НайденнаяСтрока = СтрокаТовара.Номенклатура.ДополнительныеРеквизиты.Найти(РеквизитРазрешитьМинус, "Свойство");
            Если НайденнаяСтрока <> Неопределено Тогда
                РазрешитьМинус = НайденнаяСтрока.Значение;
            КонецЕсли;
        КонецЕсли;
        
        // Если для товара разрешена продажа в минус, помечаем строку на удаление из таблицы проверки
        Если РазрешитьМинус Тогда
            СтрокиДляУдаления.Добавить(СтрокаТовара);
        КонецЕсли;
        
    КонецЦикла;
    
    // Удаляем помеченные строки из таблицы, которая отправляется на стандартную проверку остатков
    Для Каждого СтрокаИзчезновения Из СтрокиДляУдаления Цикл
        ТаблицаТоваров.Удалить(СтрокаИзчезновения);
    КонецЦикла;
    
    // Вызываем оригинальный алгоритм проверки остатков 1С для оставшихся позиций (где минус запрещен)
    ПродолжитьВызов(ТаблицаТоваров, ПараметрыПроверки, Отказ);
    
КонецПроцедуры

Анализ работы кода:

Проанализируем, как работает написанный алгоритм совместными усилиями расширения и платформы:

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

Резюме

Мы выяснили, что попозиционный контроль остатков — крайне востребованная функция для автоматизации розницы, помогающая соблюдать баланс между требованиями законодательства и непрерывностью бизнес-процессов продаж. Хотя «из коробки» в «1С:Розница 2.3» реализовать выборочную проверку нельзя, проблема легко и быстро решается созданием небольшого расширения, которое сохраняет базу полностью обновляемой и типовой.

← На главную