1C-CodeКак сделать → Как контролировать остатки при проведении документа

Как проверить остаток при проведении документа в 1С

Сначала поставить управляемую блокировку, потом прочитать остаток, потом сравнить. Порядок именно такой — иначе двое одновременно спишут один и тот же товар.

Код

Процедура ОбработкаПроведения(Отказ, Режим)

	// 1. Блокируем ДО чтения
	Блокировка = Новый БлокировкаДанных;
	Элемент = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
	Элемент.Режим = РежимБлокировкиДанных.Исключительный;
	Элемент.ИсточникДанных = Товары;
	Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
	Блокировка.Заблокировать();

	// 2. Читаем остатки
	// 3. Сравниваем и при нехватке — Отказ с внятным сообщением

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

Что здесь важно

1. Блокировка ДО чтения, а не после

Это вся суть. Прочитали остаток без блокировки — и между чтением и записью другой сеанс успел списать то же самое. Оба документа проведутся, а остаток уйдёт в минус. Заблокировали сначала — второй подождёт.

2. Блокировать по значениям, а не таблицу целиком

ИспользоватьИзИсточникаДанных сужает блокировку до тех товаров, которые в документе. Без этого блокируется весь регистр, и двое, торгующие разным товаром, будут стоять в очереди друг за другом.

3. Сообщение при отказе обязательно

Молчаливый Отказ = Истина человек читает как поломку. Пишите, чего и сколько не хватает: «Гвоздей на складе 5, требуется 12».

Где обычно спотыкаются

Проверять остаток ПОСЛЕ записи движений — распространённая и неверная схема: к моменту проверки данные уже изменены, и откат обойдётся дороже. И не полагайтесь на «в типовой же так»: во многих конфигурациях контроль настраивается флажком, и если он выключен, минусовые остатки — штатное поведение.

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

Решить задачу

Разобраться глубже

Другие вопросы

Как получить остатки на дату запросом в 1С Как программно провести документ в 1С Как избавиться от запроса в цикле в 1С Как добавить колонку в таблицу значений программно Как свернуть таблицу значений Как найти строку в таблице значений Как выгрузить колонку таблицы значений в массив Как превратить массив в таблицу значений Как передать таблицу значений с сервера на клиент Как отобрать строки в таблице значений Как отсортировать таблицу значений Как записать движения регистра накопления программно Чем регистр остатков отличается от регистра оборотов Как добавить реквизит расширением конфигурации Как сравнить две таблицы значений Какие бывают соединения в запросе 1С и чем отличаются Как выгрузить таблицу значений в Excel Чем дерево значений отличается от таблицы значений Как задать условное оформление таблицы на форме