Загадочное свойство БлокироватьДляИзменения

Что это за свойство?


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

Для чего используется?


Это свойство актуально для регистров, у которых разрешено разделение итогов (Разрешить разделение итогов равно Истина). поэтому данное свойство имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи.

На что стоит обратить внимание?


Блокировка итогов регистра по набору значений измерений выполняется в момент записи набора записей.

Контроль итогов регистра можно выполнять без применений опции "ДЛЯ ИЗМЕНЕНИЙ" (в случае использования автоматического режима) или явной установки управляемой блокировки (в случае использования управляемого режима).

Если записать пустой набор данных, то блокировка итогов выполняется по "очищаемым" записям, и, соответственно, записи очищаются.
Движения.ОстаткиТоваров.Очистить();
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
// Будут заблокированы записи, которые могли существовать
// у документа до его перепроведения.
Движения.ОстаткиТоваров.Записать();


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


Если не применять данное свойство, то блокировка в любом случае будет наложена системой, в момент записи. Но, если в регистре включен режим разделения итогов, то параллельно может быть записан набор с такими-же измерениями и итоги изменятся, иначе блокировка происходит без учета разделителя итогов. Проще говоря, если применить данное свойство к регистру с разделением итогов, то две транзакции по одним и тем же измерениям не смогут параллельно писать, тем самым обеспечиваем себе актуальные остатки.

При попытке использования в автоматическом режиме блокировки вызывает исключительную ситуацию. После успешной записи документа свойство устанавливается в Ложь у всех наборов записей. При отмене транзакции значение свойства восстанавливается в состояние до транзакции. Значение по умолчанию Ложь.

Контролируйте остатки после записи!


В этом случае можно не использовать объект БлокировкаДанных, то есть не нужно устанавливать управляемые блокировки вручную, что в свою очередь повышает удобочитаемость алгоритма проведения, а так же позволяет минимизировать влияние блокирующего чтения остатков на производительность системы, за счет построения более оптимального алгоритма проведения документа.

Очень-очень полезные статьи:
Методика оперативного проведения и управляемые блокировки
Новая методика проведения документа в 1С 8.2
Пример решения экзаменационного задания из сборника задач (ошибка остатков)

Комментарии