1C-CodeОшибки 1С → Конфликт блокировок при выполнении транзакции

Конфликт блокировок при выполнении транзакции — почему и что делать

Сообщение платформы: Конфликт блокировок при выполнении транзакции

Два сеанса одновременно взялись за одни и те же данные, и один из них не дождался. Полный текст обычно называет таблицу и номера сеансов — это самое ценное в сообщении, по нему и ищут виновника.

Отчего это бывает

1. Длинная транзакция

НачатьТранзакцию();
	// чтение, расчёты, обращение к внешнему сервису, запись
ЗафиксироватьТранзакцию();

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

2. Блокировки берутся в разном порядке

// одна обработка: сначала товары, потом склады
// другая:        сначала склады, потом товары

Каждая ждёт то, что держит другая, и обе стоят. Лечится соглашением: все места кода захватывают ресурсы в ОДНОМ порядке.

3. Блокировка шире, чем нужно

Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
// без установки условий блокируется весь регистр
Элемент.УстановитьЗначение("Номенклатура", Товар);   // а надо так

Управляемая блокировка без условий берёт таблицу целиком. Задавайте значения измерений — тогда двое, работающие с разными товарами, не мешают друг другу.

Что сделать

Начните с журнала регистрации: там записан весь конфликт, включая номера обоих сеансов и то, что они делали. Дальше — сокращать транзакции и сужать блокировки. Увеличивать время ожидания стоит в последнюю очередь: это не решение, а отсрочка, и на растущей базе она перестаёт работать.

Проверить себя на практике. В тренажёре те же ошибки возникают на настоящем интерпретаторе языка 1С: сообщения дословно те же, что у платформы, но исправить их можно сразу в браузере, без установки и без риска для рабочей базы.

Открыть тренажёр

Разобраться глубже

Другие частые ошибки

Поле объекта не обнаружено Значение не является значением объектного типа Переменная не определена Метод объекта не обнаружен Индекс находится за границами массива Деление на ноль