Почему в 1С 7.7 возникают отрицательные остатки при включенном запрете списания в минус?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В типовых конфигурациях платформы 1С 7.7 (например, «Торговля и Склад 9.2») нередко возникает ситуация, когда включен строгий запрет на списание товаров в минус, но в отчетах по остаткам все равно появляются отрицательные значения. Разберем механику платформы 1С 7.7, выясним причины такого поведения и рассмотрим способы решения проблемы.

Причины появления отрицательных остатков

Проанализируем типовой механизм контроля остатков в 1С 7.7. Стандартная процедура проведения документа проверяет доступное количество товара либо на момент позиции самого документа, либо на точку актуальности (ТА). Отрицательные остатки образуются в следующих сценариях:

  1. Проведение документов будущей датой и последующее списание текущей датой. Рассмотрим пример: на складе числится 10 единиц товара. Оператор создает расходную накладную с датой «завтра» на 10 единиц. Контроль остатков на позицию документа проходит успешно, так как товар есть. Затем другой оператор создает и проводит расходную накладную «сегодня» на те же 10 единиц — остаток на сегодня равен 10, документ проводится. В результате на «завтра» итоговый остаток становится равным минус 10.
  2. Изменение приходных накладных задним числом. Если уменьшить количество в приходном документе в прошлом или отменить его проведение, все последующие списания, которые ранее были корректными, автоматически уводят остаток в минус.
  3. Списание задним числом между существующими движениями. Если остаток товара на дату документа и на ТА положителен, но между ними в какой-то момент он уменьшался до нуля, проведение нового расхода задним числом приведет к отрицательному остатку на этом промежуточном интервале.
  4. Параллельное проведение документов в многопользовательском режиме. Если перед чтением регистров не установлена явная блокировка, два оператора могут одновременно получить одинаковый свободный остаток и провести два расходных документа, что приведет к перерасходу.

Способ 1. Организационные и программные запреты на работу с датами

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

  1. Запрет ввода документов будущей датой. В модуле формы или в процедуре ПриЗаписи проверяем дату документа относительно текущей рабочей даты или даты ТА:
    
    Если ДатаДок > РабочаяДата() Тогда
        Предупреждение("Запрещено проводить документы будущей датой!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
  2. Запрет проведения задним числом и редактирования проведенных документов. Ограничиваем права операторов на изменение проведенных накладных без участия администратора или товароведа.
  3. Контроль границы последовательности документов. Регулярно отслеживаем смещение границы последовательности назад. Если граница ушла в прошлое, необходимо выполнять регламентное восстановление последовательности документов.

Способ 2. Переход на схему резервирования товаров

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

  1. Создается документ «Заказ покупателя» или «Заявка», который делает движения только по регистру резервов, не списывая физический остаток со склада.
  2. Контроль остатков при проведении текущих накладных настраивается по формуле: СвободныйОстаток = ФизическийОстаток - Зарезервировано.
  3. Финансовая расходная накладная формируется и проводится строго в день фактической отгрузки и списывает как физический остаток, так и ранее сформированный резерв.

Способ 3. Контроль остатков на всем временном интервале до ТА

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

Разберем пример кода проверки в процедуре ОбработкаПроведения модуля документа:


РегистрОстатков = СоздатьОбъект("Регистр.ОстаткиТМЦ");
РегистрОстатков.ВременныйРасчет(1);
РассчитатьРегистрыНа(ТекущийДокумент());

// Блокируем регистр для исключения параллельного списания
РегистрОстатков.ЗаблокироватьДляИзменения();

// Выполняем движения документа
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    ОстатокНаМомент = РегистрОстатков.СводныйОстаток(Номенклатура, Склад, "Количество");
    Если ОстатокНаМомент < Количество Тогда
        Сообщить("Недостаточно товара " + Номенклатура + " на момент проведения!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
    // Проверка остатка на Точке Актуальности (ТА)
    РегистрОстатков.ВременныйРасчет(0);
    ОстатокНаТА = РегистрОстатков.СводныйОстаток(Номенклатура, Склад, "Количество");
    Если ОстатокНаТА < Количество Тогда
        Сообщить("Списание задним числом приведет к отрицательному остатку на ТА по товару: " + Номенклатура);
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецЦикла;

Способ 4. Аудит действий операторов и исправление итогов

Чтобы точно определять, кто и когда изменил документы в прошлом, рекомендуется включить расширенное логирование или настроить периодический контроль:

  1. Использовать встроенную функцию ЗаписьЖурналаРегистрации() непосредственно в обработчике проведения для фиксации имени пользователя, времени проведения документа и текущих остатков до списания.
  2. Периодически запускать в Конфигураторе процедуру «Тестирование и исправление информационной базы» с пересчетом итогов регистров для устранения возможных сбоев в индексах и таблицах накоплений.
← На главную