1C-Code → Как сделать → Как контролировать остатки при проведении документа
Сначала поставить управляемую блокировку, потом прочитать остаток, потом сравнить. Порядок именно такой — иначе двое одновременно спишут один и тот же товар.
Процедура ОбработкаПроведения(Отказ, Режим)
// 1. Блокируем ДО чтения
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.ИсточникДанных = Товары;
Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
// 2. Читаем остатки
// 3. Сравниваем и при нехватке — Отказ с внятным сообщением
КонецПроцедуры
Это вся суть. Прочитали остаток без блокировки — и между чтением и записью другой сеанс успел списать то же самое. Оба документа проведутся, а остаток уйдёт в минус. Заблокировали сначала — второй подождёт.
ИспользоватьИзИсточникаДанных сужает блокировку до тех товаров, которые в документе. Без этого блокируется весь регистр, и двое, торгующие разным товаром, будут стоять в очереди друг за другом.
Молчаливый Отказ = Истина человек читает как поломку. Пишите, чего и сколько не хватает: «Гвоздей на складе 5, требуется 12».
Проверять остаток ПОСЛЕ записи движений — распространённая и неверная схема: к моменту проверки данные уже изменены, и откат обойдётся дороже. И не полагайтесь на «в типовой же так»: во многих конфигурациях контроль настраивается флажком, и если он выключен, минусовые остатки — штатное поведение.
Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Отказать в проведении при нехватке остатка»: проверить остаток и отказать понятным сообщением, а не молча. Проверяется и порядок действий, и то, что человеку сказали, чего не хватает. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.