1C-Code → Ошибки 1С → Конфликт блокировок при выполнении транзакции
Сообщение платформы: Конфликт блокировок при выполнении транзакции
Два сеанса одновременно взялись за одни и те же данные, и один из них не дождался. Полный текст обычно называет таблицу и номера сеансов — это самое ценное в сообщении, по нему и ищут виновника.
НачатьТранзакцию();
// чтение, расчёты, обращение к внешнему сервису, запись
ЗафиксироватьТранзакцию();
Пока транзакция открыта, захваченное ею никто другой тронуть не может. Внутри транзакции должно быть только то, что обязано быть атомарным: расчёты, отчёты и походы наружу выносят за её пределы.
// одна обработка: сначала товары, потом склады
// другая: сначала склады, потом товары
Каждая ждёт то, что держит другая, и обе стоят. Лечится соглашением: все места кода захватывают ресурсы в ОДНОМ порядке.
Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
// без установки условий блокируется весь регистр
Элемент.УстановитьЗначение("Номенклатура", Товар); // а надо так
Управляемая блокировка без условий берёт таблицу целиком. Задавайте значения измерений — тогда двое, работающие с разными товарами, не мешают друг другу.
Начните с журнала регистрации: там записан весь конфликт, включая номера обоих сеансов и то, что они делали. Дальше — сокращать транзакции и сужать блокировки. Увеличивать время ожидания стоит в последнюю очередь: это не решение, а отсрочка, и на растущей базе она перестаёт работать.
Проверить себя на практике. В тренажёре те же ошибки возникают на настоящем интерпретаторе языка 1С: сообщения дословно те же, что у платформы, но исправить их можно сразу в браузере, без установки и без риска для рабочей базы.