Рассмотрим весьма распространенную и неприятную ситуацию при работе в 1С. Пользователь открывает документ, вносит в него данные, но при попытке сохранить или провести систему выдает предупреждение: «Документ невозможно записать, он уже редактируется пользователем...». При этом в сообщении об ошибке указано имя этого же самого пользователя, а с документом гарантированно больше никто не работает. Если подождать около 15–20 минут и попробовать снова — документ успешно записывается. Проанализируем эту ситуацию и выясним причину такого поведения базы данных.
Подобный симптом с характерным временем ожидания (около 15 минут) является классическим маркером работы механизма пессимистических блокировок платформы 1С, а также наличия так называемых «фантомных» сеансов или ошибок в логике программного кода. Разберем по шагам основные причины возникновения данной проблемы и способы ее решения.
Особенно часто эта проблема проявляется при работе через веб-клиент или при нестабильном подключении к серверу 1С. Посмотрим, как это происходит на практике:
Если проблема возникает даже без разрывов соединения, проанализируем программный код конфигурации. Возможно, при открытии документа, при изменении реквизитов или в обработчике ожидания запускается фоновое задание.
Если этот фоновый процесс программно обращается к документу и вызывает методы блокировки, например, для сложных расчетов или проверок, он может заблокировать объект. Если фоновое задание зависает, работает слишком долго или завершается с ошибкой без снятия блокировки, интерактивная запись пользователем становится невозможной. Платформа будет считать, что документ занят другим процессом (хоть и инициированным тем же пользователем).
Разберем ситуацию программного конфликта. В 1С используется пессимистическая блокировка: как только пользователь начинает менять данные в форме, документ автоматически блокируется для других сеансов. Ошибка возникает, если программист написал код, который пытается параллельно получить этот же объект и заблокировать его программно.
Например, в модуле формы или в подписках на события может встречаться подобная конструкция:
ОбъектДокумента = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.РеализацияТоваровУслуг"));
ОбъектДокумента.Заблокировать();
В этом случае система видит, что объект уже заблокирован формой (интерактивно), а код пытается наложить блокировку еще раз в другом контексте. Результат — та самая ошибка редактирования.
Еще одна возможная причина кроется в обработке исключений. Если при предыдущей попытке проведения документа возникла ошибка, которую скрыли с помощью конструкции Попытка ... Исключение ... КонецПопытки, но при этом программист забыл корректно откатить транзакцию через ОтменитьТранзакцию(), транзакционная блокировка СУБД или объектная блокировка 1С остается висеть в памяти.
Рассмотрим подробнее инструменты и методы, которые помогут локализовать и устранить ошибку:
ПолучитьОбъект(), Заблокировать() и ЗаблокироватьДанныеДляРедактирования(). Проанализируйте логику их применения — они не должны конфликтовать с интерактивной работой пользователя в форме.Внимательно применяя эти шаги, вы сможете точно определить источник блокировки: будь то инфраструктурная особенность сети (фантомные сеансы) или логическая ошибка в коде конфигурации, и успешно решить проблему.