Вступить в клуб →
сложнаявопросПлатформа и объектная модель

Контроль остатка при проведении без управляемой блокировки регистра

База работает в клиент-серверном варианте, режим управления блокировкой данных — управляемый. В обработке проведения расходного документа написано так:

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

Два пользователя одновременно проводят разные документы по одной и той же номенклатуре и складу, остатка хватает только на один из них.

Что может произойти?

  • Платформа сама заблокирует прочитанные данные, поэтому одновременное списание невозможно
  • Вторая транзакция гарантированно завершится ошибкой блокировки: платформа не даст двум сеансам одновременно записать движения по одной номенклатуре, пользователь просто повторит проведение
  • Оба документа прочитают один и тот же остаток, оба пройдут проверку и уведут остаток в минус: перед чтением нужна управляемая блокировка регистра по этим измерениям
  • Проблема возможна только в файловой базе: в клиент-серверном варианте чтение всегда блокирует данные

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела