Готовишься к экзамену?
Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.
При работе с документом «Ведомость в кассу» (например, когда выполняется автозаполнение по кнопке «Заполнить») что означает пессимистическая блокировка объекта методом «Заблокировать()» с точки зрения возможности изменить данные документа программно?
Блокировка не мешает коду изменять реквизиты и табличные части этого документа; она нужна в основном для защиты от параллельных изменений другими пользователями.
Правильно: пессимистическая блокировка предназначена для того, чтобы другие сеансы не могли одновременно изменить тот же объект и помешать записи; при этом текущий сеанс может программно менять данные объекта (в том числе перед записью после «Заполнить»).
После блокировки объект становится «только для чтения», поэтому программно менять его данные нельзя до снятия блокировки.
Неправильно: блокировка не превращает объект в режим «только чтение» для текущего кода; она ограничивает конкурентное изменение (обычно со стороны других сеансов), а не запрещает редактирование объекту, который блокировку установил.
Менять данные можно только если блокировка выполнена строго через ту же переменную, которой затем выполняется изменение.
Неправильно: смысл пессимистической блокировки не в «привязке к переменной», а в фиксации эксклюзивности редактирования объекта на уровне информационной базы; изменения выполняются обычным образом в текущем сеансе, а ограничиваются попытки параллельной записи/редактирования.
Пояснение
Развернутая подсказка (как это связано с автоматическим заполнением «Ведомости в кассу»):
1) Зачем вообще блокировать «Ведомость в кассу» при заполнении
Когда один пользователь открывает ведомость для редактирования и выполняет автозаполнение, он меняет табличную часть (сотрудники, суммы к выплате) и затем записывает документ. Если в этот момент другой пользователь попытается параллельно изменить ту же ведомость, можно получить конфликты: «кто последний записал - тот и прав», расхождения сумм или ошибки записи.
Пессимистическая блокировка как раз нужна, чтобы исключить конкурентные изменения одного и того же документа.
2) Что блокировка делает, а что - нет
- Делает: защищает объект от изменений другими сеансами (обычно другой пользователь не сможет начать редактирование/запись этого же документа и получит сообщение о невозможности блокировки/редактирования).
- Не делает: не запрещает вашему коду менять реквизиты и строки документа. Вы по-прежнему можете выполнить «Заполнить», добавить/удалить строки, скорректировать суммы и записать документ.
3) Практический сценарий «два пользователя»
- Пользователь А открыл «Ведомость в кассу» и начал редактирование (или код явно вызвал «Заблокировать()»).
- Пользователь Б открыл ту же ведомость и попытался изменить/записать.
Ожидаемое поведение: у пользователя Б будет отказ/ошибка блокировки, а пользователь А сможет нормально нажать «Заполнить», получить строки к выплате и записать документ.
4) Как это увязать с корректным автозаполнением
Блокировка защищает от конкуренции, но не исправляет причины «пустой ведомости». Если «Заполнить» не подставляет сотрудников/суммы, обычно проверяют:
- выбранный вид выплаты и «Месяц выплаты» в ведомости,
- способ выплаты у сотрудников (наличные/банк),
- наличие рассчитанных сумм «к выплате» за нужный период.
То есть блокировка - это про одновременную работу, а не про правила подбора сумм.
5) Рекомендация по лучшей практике
- Если документ редактируется пользователем в форме, блокировка часто устанавливается автоматически при переходе в режим изменения.
- Если заполнение выполняется программно (например, обработкой), разумно:
а) попытаться заблокировать объект перед массовыми изменениями,
б) при неудаче аккуратно сообщить, что документ уже редактируется,
в) после записи снять блокировку (или завершить работу с объектом так, чтобы блокировка освободилась).
6) Контрольный вопрос для самопроверки
Если после «Заблокировать()» ваш код все равно может изменить табличную часть ведомости и записать документ, а другой пользователь не может параллельно записать тот же документ - значит вы правильно понимаете назначение пессимистической блокировки.