Как решить проблему отрицательных остатков в розничной торговле на базе 1С?

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

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

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

Анатомия проблемы: почему остатки уходят в минус?

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

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

Стратегия 1: Жесткий запрет продаж «в минус». Почему это не работает в продуктовом ритейле?

Кажется, что самый простой способ решить проблему — поставить галочку «Запретить продажи при отсутствии остатков» на кассовых узлах. Проанализируем последствия такого решения:

В аптечном бизнесе или торговле дорогой электроникой этот метод работает отлично. Там порядок учета жестко регламентирован законодательством (маркировка, предметно-количественный учет). Но в продуктовом супермаркете с большим трафиком жесткий запрет приводит к катастрофе. Представим ситуацию: вечерняя очередь, у покупателя на ленте 20 товаров, и один из них не проводится из-за отсутствия остатка в системе. Касса блокируется. Кассир пытается аннулировать позицию, покупатель нервничает, очередь растет, лояльность падает. Клиент может просто оставить всю корзину и уйти. Бизнес не должен страдать от проблем внутреннего учета. Продажи должны идти в любом случае.

Стратегия 2: Двухуровневый контроль (Фронт-офис без контроля, Бэк-офис с жестким контролем)

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

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

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

Как автоматизировать работу товароведа: пишем инструмент поиска пересортицы

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

Рассмотрим пример кода на языке 1С, который выполняет такой анализ:


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

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

Использование подобных автоматизированных рабочих мест (АРМ) позволяет товароведу за пару кликов сформировать документы ПересортицаТоваров или ОприходованиеТоваров на основе реального анализа продаж, сводя рутинную работу к минимуму.

Решение проблемы на уровне себестоимости: партионный учет и РАУЗ

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

Чтобы избежать коллапса при закрытии месяца, применим следующие правила:

Организационные меры: как дисциплинировать персонал

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

1. Внедрение скользящих (циклических) инвентаризаций. Не нужно закрывать магазин раз в месяц на глобальную ревизию. Внедрите практику ежедневных микро-пересчетов. Каждое утро система должна автоматически выдавать товароведу список из 10–15 позиций, по которым вчера были зафиксированы минусы или подозрительные продажи. Пересчет такого количества позиций с помощью ТСД (терминала сбора данных) занимает не более 10 минут, но позволяет держать базу в актуальном состоянии.

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

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

Резюме

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

← На главную