.
1С 8.2. Блокировка информации в базе данных.
Автор megabax   
10.02.2014 г.
New Page 1

1С 8.2. Блокировка информации в базе данных.

Зачастую в базе данных 1С одновременно работает несколько пользователей. В принципе, это нормальное явление, 1С для этого и создавалась, что бы обеспечить возможность работы нескольких пользователей одновременно. Но тут могу возникнуть нюансы.

Предположим, что два пользователя одновременно запрашивают одну и ту же информацию, например, информацию об остатках. Допустим, на складе имеется сто телевизоров. Два менеджера по продажам одновременно пытаются отгрузить этот товар покупателю, и при этом узнают, сколько же товара есть на складе. Допустим, первый продает 60 штук, а второй 70. На складе 100 телевизоров. Теоретически, оба могут продать. Но практически им телевизоров не хватит: продают то они 60+70=130, а на складе только 100!

Как выйти из этого положения? Использовать блокировки. Начнем с того, что два пользователя все же не одновременно обращаются к базе данных. Это только так кажется, что одновременно, потому что разница может быть в несколько микросекунд. Тоесть, кто то все равно запросил остаток первый. Так вот, пользователь, обращающийся к базе данных, блокирует эту информацию от чтения другим пользователем. И это блокировка сохраняется до тех пор, пока он не спишет проданные товары со склада. После этого блокировка освобождается и второй юзер получает реальный остаток.

Тут может возникнуть еще вот какой нюанс. Допустим, первый пользователь "завис" и не снял блокировку. Второй пользователь пытается считать данные и не может. Так вот, что бы он тоже не "завис", при чтении информации задается какой то таймаут, в течении которого он может ожидать завершения блокировки. Если в течении этого времени данные не освободятся, то транзакция второго пользователя завершается с ошибкой.

Что бы заблокировать данные, в запросе достаточно указать "для изменения":

Запрос=Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| ОстаткиОстатки.Номенклатура,
| СУММА(ОстаткиОстатки.КоличествоОстаток) КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.Остатки.Остатки(, Номенклатура = &Товар) КАК ОстаткиОстатки
|
|СГРУППИРОВАТЬ ПО
| ОстаткиОстатки.Номенклатура
|
|ДЛЯ ИЗМЕНЕНИЯ"
;

Можно указать конкретные таблицы, которые будут блокироваться:

Запрос=Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| ОстаткиОстатки.Номенклатура,
| СУММА(ОстаткиОстатки.КоличествоОстаток) КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.Остатки.Остатки(, Номенклатура = &Товар) КАК ОстаткиОстатки
|
|СГРУППИРОВАТЬ ПО
| ОстаткиОстатки.Номенклатура
|
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.Остатки.Остатки"
;

Таким образом, прямо в запросе мы можем средствами платформы блокировать таблицы.