Меня часто спрашивают о принципах транзакционных блокировок в 1С.
Вот краткая шпаргалка.
Справедливо для клиент-серверных версий 1С 8.х
1. Вне транзакций (в т.ч. отчеты) - "грязное чтение" (Read Uncommited). Теоретически можно вызвать транзакцию внутри отчета и перевести режим доступа в Repeatable Read, но тогда начинает работать п.2 и на все читаемые данные накладывается разделяемая блокировка.
2. Транзакция в автоматическом режиме блокировок (1С 8.0) - по умолчанию Repeatable Read или Serializable на уровне записей, блокируются все отбираемые записи всех таблиц, считываемые в процессе транзакции.
Если нужно наложить исключительную (неразделяемую) блокировку - программист должен в запросе к данным использовать конструкцию ДЛЯ ИЗМЕНЕНИЯ с перечислением блокируемых таблиц.
Исключительная блокировка также возникает в момент записи движений документа (в конце транзакции проведения, если в коде нет явных конструкций типа
).
3. Управляемый режим блокировок (введен с версии 8.1, но программист может использовать и автоматический режим) - по умолчанию в рамках транзакции везде Read Commited на уровне записей,
Если нужно использовать разделяемую (по чтению) или исключительную блокировку, программист самостоятельно должен определить таблицы и записи, на которые накладывается блокировка.
X++:
Dl=New DataLock;
Element1= Dl.Add("РегистрНакопления.ОстаткиНаСкладе"); // элементов блокировки м.б. много
Element1.Mode=DataLockMode.Exclusive;
Element1.SetValue("Склад", ); // фильтр по складу
Element1.DataSource= QueryResult; // например, результат запроса, но м.б. и табличная часть, и временная таблица.
Element1.UseFromDataSource("Товар","Номенклатура"); // фильтруем измерение Товар по колонке результата запроса Номенклатура
Dl.Lock();
Исключительная блокировка также возникает в момент записи движений документа.