В типовых конфигурациях платформы 1С 7.7 (например, «Торговля и Склад 9.2») нередко возникает ситуация, когда включен строгий запрет на списание товаров в минус, но в отчетах по остаткам все равно появляются отрицательные значения. Разберем механику платформы 1С 7.7, выясним причины такого поведения и рассмотрим способы решения проблемы.
Проанализируем типовой механизм контроля остатков в 1С 7.7. Стандартная процедура проведения документа проверяет доступное количество товара либо на момент позиции самого документа, либо на точку актуальности (ТА). Отрицательные остатки образуются в следующих сценариях:
Самый простой и эффективный способ устранить подобные ошибки — исключить саму возможность проведения документов вне текущего оперативного времени.
ПриЗаписи проверяем дату документа относительно текущей рабочей даты или даты ТА:
Если ДатаДок > РабочаяДата() Тогда
Предупреждение("Запрещено проводить документы будущей датой!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если специфика бизнес-процессов требует подготовки отгрузок на следующий день (например, ночная сборка и утренняя доставка), нельзя использовать финансовые расходные накладные с будущей датой. Рассмотрим правильную схему работы:
Если проведение задним числом неизбежно, алгоритм проведения расходных документов необходимо доработать, чтобы проверка остатков выполнялась не только на момент документа, но и на всем интервале до точки актуальности.
Разберем пример кода проверки в процедуре ОбработкаПроведения модуля документа:
РегистрОстатков = СоздатьОбъект("Регистр.ОстаткиТМЦ");
РегистрОстатков.ВременныйРасчет(1);
РассчитатьРегистрыНа(ТекущийДокумент());
// Блокируем регистр для исключения параллельного списания
РегистрОстатков.ЗаблокироватьДляИзменения();
// Выполняем движения документа
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ОстатокНаМомент = РегистрОстатков.СводныйОстаток(Номенклатура, Склад, "Количество");
Если ОстатокНаМомент < Количество Тогда
Сообщить("Недостаточно товара " + Номенклатура + " на момент проведения!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
// Проверка остатка на Точке Актуальности (ТА)
РегистрОстатков.ВременныйРасчет(0);
ОстатокНаТА = РегистрОстатков.СводныйОстаток(Номенклатура, Склад, "Количество");
Если ОстатокНаТА < Количество Тогда
Сообщить("Списание задним числом приведет к отрицательному остатку на ТА по товару: " + Номенклатура);
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЦикла;
Чтобы точно определять, кто и когда изменил документы в прошлом, рекомендуется включить расширенное логирование или настроить периодический контроль:
ЗаписьЖурналаРегистрации() непосредственно в обработчике проведения для фиксации имени пользователя, времени проведения документа и текущих остатков до списания.