Контроль остатка при проведении без управляемой блокировки регистра
База работает в клиент-серверном варианте, режим управления блокировкой данных — управляемый. В обработке проведения расходного документа написано так:
// Обработка проведения расходного документа
Остаток = ПолучитьОстатокЗапросом(Номенклатура, Склад); // обычный запрос, блокировка не устанавливается
Если Остаток < Количество Тогда
Отказ = Истина;
Иначе
Движение = Движения.ТоварыНаСкладах.Добавить();
// заполнение движения расходом
КонецЕсли;
Два пользователя одновременно проводят разные документы по одной и той же номенклатуре и складу, остатка хватает только на один из них.
Что может произойти?
- Платформа сама заблокирует прочитанные данные, поэтому одновременное списание невозможно
- Вторая транзакция гарантированно завершится ошибкой блокировки: платформа не даст двум сеансам одновременно записать движения по одной номенклатуре, пользователь просто повторит проведение
- Оба документа прочитают один и тот же остаток, оба пройдут проверку и уведут остаток в минус: перед чтением нужна управляемая блокировка регистра по этим измерениям
- Проблема возможна только в файловой базе: в клиент-серверном варианте чтение всегда блокирует данные
