Одной из наиболее частых проблем при ведении складского учета в 1С является нарушение целостности цепочки документов. Ситуация, когда пользователь отменяет проведение документа «задним числом» (например, перемещение товара), а последующий документ (списание) уже сформировал движения, приводит к появлению отрицательных остатков. Давайте разберем, как системно подойти к решению этой задачи.
Прежде чем приступать к доработке кода, важно осознать, что технические средства не могут полностью заменить дисциплину учета. В профессиональной среде для борьбы с «ошибками заднего числа» рекомендуются следующие шаги:
Если организационных мер недостаточно или логика бизнес-процессов требует гибкости, мы можем внедрить программный механизм контроля остатков при отмене проведения документа. Рассмотрим алгоритм, который можно реализовать в процедурах обработки проведения.
Чтобы исключить возможность отмены проведения документа, если это приведет к отрицательным остаткам, нам необходимо добавить проверку непосредственно в момент отмены проведения документа. Для этого выполним следующие действия:
Разберем логику проверки. При отмене проведения документа необходимо проанализировать состояние остатков на складе СкладПолучатель на момент времени всех последующих документов, которые использовали товар, списанный нашим документом.
Шаги реализации:
ОбработкаУдаленияПроведения необходимо выполнить запрос к регистрам накопления, в которых отражаются товары.Примерная логика проверки в модуле документа:
Процедура ОбработкаУдаленияПроведения(Отказ)
// Выполняем проверку остатков перед тем, как отменить движения
Если Не ПроверитьОстаткиПриОтмене(ЭтотОбъект) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Отмена проведения невозможна: возникнут отрицательные остатки!";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
В современных конфигурациях, таких как УТ 11, КА 2 или ERP, уже существует механизм контроля отмены проведения прихода, если по товару были движения расхода. Если вы работаете с Бухгалтерией предприятия 3.0, вы можете адаптировать этот подход:
КонтролироватьТоварыОрганизацийПриОтменеПриходов.ПропускКонтроляТоваровОрганизацийПриОтменеПриходов для пользователей, которым необходимо разрешить принудительную отмену.ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ).Для исключения «гонки» транзакций, когда два пользователя одновременно пытаются изменить состояние одного и того же склада, крайне важно использовать управляемые блокировки. При проведении контроля остатков всегда используйте метод БлокировкаДанных для регистра накопления:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.УстановитьЗначение("Склад", СкладИсточник);
Блокировка.Заблокировать();
Комбинируя организационный запрет на редактирование документов прошлых периодов и программный контроль в процедуре отмены проведения, вы создадите надежную систему защиты от «ошибок заднего числа». Помните, что для сложных цепочек документов эффективнее всего использовать механизм Последовательностей, который автоматически отслеживает нарушение хронологии и сигнализирует о необходимости перепроведения документов.