sv_mikh,
crabzzy, я разобрался наконец с блокировками.
Привожу фрагмент моей переписки на другом форуме. Человек очень доходчиво объяснил этот момент =)
Я: Возник вопрос по поводу установки блокировок на регистры накопления и бухгалтерии, после того как в лекциях Павла Белоусова увидел такой вот код:
Code
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать();
Блокирока = Новый БлокировкаДанных;
ЭлементБлокировки = Блокирока.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
Блокирока.Заблокировать();
...
Ответ: При записи "пустого" набора движений нужно блокировать записи по "Удаляемым" данным (если они были в случае перепроведения), чтобы гарантировать при откате транзакции неизменность итогов
Я: Честно говоря, не понял. Не могли бы вы на примере объяснить?
Я себе так представляю:
На складе Основной есть Товар1 в количестве 1 шт.
Расходной накладной мы списываем этот товар в количестве 1 шт. со склада Основной. Всё хорошо проводится.
При перепроведении у нас сначала записывается пустой набор в регистр, т.е. очищаем старые движения и на складе Основной опять появляется 1 шт.
Затем устанавливаем ручную блокировку на склад Основной и Товар1.
Читаем остатки - получаем остаток 1 шт.
И списываем. Опять всё хорошо проводится.
Если мы при перепроведении списываем не 1 шт. а больше, то после чтения остатков понимаем что не хватает и отказываемся от проведения документа.
Т.е. в итоге документ не проведен, в остатке 1 шт. Товара1 на складе Основной. Опять всё правильно.
Зачем тут
Code
БлокироватьДляИзменения
?
Может я неправильно рассуждаю?
Ответ: Ок, а как тебе такая версия:
Допустим: в уже имеющемся проведённом документе "Реализация" продан товар "стул" в количестве одна штука, при этом на складе их ноль штук.
Затем пользователь заходит в документ и меняет, "стул" на "кресло". Далее нажимает кнопку провести, и запускается обработка проведения.
В момент выполнения строки: Записать() движение в регистре с позицией "стул" очищается и запишется в базу данных, в результате на остатке на складе появится одна позиция "стул".
Далее внутри тойже обработки проведения наложится блокировка на "кресло" и начнётся транзакция.
При этом, по скольку на складе появился один незаблокированный "стул" на остатке, другой пользователь в это время возьмёт и побыстрому проведёт, этот "стул" в другом документе "реализация" и на складе станет ноль позицый "стул".
Затем уже в нашем документе, при попытке списать заменённый стул на кресло, произошла какая-то ошибка, и мы решили откатить транзакцию. т.е. "стул" возвращается на место.
И в результате таких действий, стул будет в количестве "минус один" на складе.
Вот для того, чтобы такого не произошло, нужно заблокировать, не только новые позиции, но и старые которые были в документе, до момента окончания текущей транзакции записи, до тех пор, пока мы не будем точно уверены, что не планируется её откат.
PS: надеюсь, так понятно, для чего нужна доп. блокировка старых позиций документа?
)