Настройка менеджера управляемых блокировок (БлокировкаДанных) в 1С
- Ошибка
Конфликт блокировок при выполнении транзакции: Превышено время ожидания предоставления блокировки. - Ошибки чтения несогласованных данных при проведении документов задним числом.
- Необходимость точечной блокировки только списываемых остатков без блокировки всего склада.
1. Принцип работы менеджера управляемых блокировок 1С
Управляемые блокировки выставляются в коде 1С перед выполнением операций чтения/записи внутри транзакции. Менеджер блокировок 1С работает на уровне кластера серверов 1С, транслируя в СУБД уровень изоляции Read Committed (RCSI в MS SQL), что полностью исключает блокировки читателями писателей.
2. Программная установка управляемой блокировки
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
// Режим: Исключительный (Exclusive) для записи или Разделяемый (Shared) для чтения
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
// Установка источника данных для точечной блокировки по списку номенклатуры
ЭлементБлокировки.ИсточникДанных = ТабличнаяЧастьТовары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
// Применение блокировки внутри транзакции
Блокировка.Заблокировать();3. Типичные ошибки при работе с БлокировкаДанных
- Попытка вызова
Заблокировать()вне транзакции (вызовет исключение); - Блокировка без указания измерений (блокирует весь регистр целиком);
- Блокировка после выполнения тяжелого чтения (приводит к дедлокам).
Частые вопросы (FAQ)
Чем отличается исключительная блокировка от разделяемой?
Исключительную (Exclusive) блокировку может удерживать только одна транзакция (для изменения данных). Разделяемую (Shared) могут одновременно удерживать несколько транзакций (для согласованного чтения).
В какой момент снимаются управляемые блокировки?
Управляемые блокировки автоматически снимаются кластером 1С в момент завершения транзакции (ЗафиксироватьТранзакцию или ОтменитьТранзакцию).
Что произойдет, если источник данных пуст при вызове Заблокировать()?
Если источник данных (таблица) не содержит строк, блокировка пространства данных не будет установлена, и транзакция продолжит работу.
Нужно ли блокировать данные при записи в регистры сведений?
Да, если перед записью выполняется проверка на существование или чтение связанных записей для предотвращения состояния гонки (Race Condition).