Администрирование · 10 мин
Блокировка данных в 1С: когда она снимается и что делать при зависании
Когда снимается блокировка данных в 1С: завершение транзакции, закрытие сеанса, таймауты. Как найти зависший сеанс, снять блокировку и не повредить данные.
Блокировка данных в 1С — это механизм, который не даёт двум пользователям или фоновым процессам одновременно изменить один и тот же объект: документ, элемент справочника или запись регистра. Пока один сеанс удерживает объект, остальные получают ошибку «Конфликт блокировок при выполнении транзакции» или сообщение о том, что объект заблокирован.
Ключевой вопрос — когда эта блокировка снимается. В штатной ситуации она освобождается автоматически: при завершении транзакции, при закрытии формы объекта или при завершении сеанса пользователя. Проблемы начинаются, когда сеанс «завис», транзакция не закрыта, а блокировка продолжает удерживаться и мешает работе всей базы.
Ниже разобраны моменты снятия блокировок в разных режимах работы 1С, способы найти источник зависшей блокировки и безопасные действия администратора.
Какие бывают блокировки в 1С и кто их ставит
В платформе 1С:Предприятие работают два уровня блокировок. Первый — управляемые блокировки, которые платформа и прикладной код накладывают через объект «БлокировкаДанных» в явном виде. Второй — автоматические блокировки, которые возникают при записи и изменении объектов без явного указания в коде.
Дополнительно существуют блокировки на уровне СУБД. В клиент-серверном варианте (MS SQL Server, PostgreSQL) 1С транслирует свои блокировки в блокировки базы данных, и именно их видно в системных представлениях СУБД. В файловом варианте блокировки управляются самой платформой внутри файла базы.
Отдельный вид — объектная блокировка формы: когда пользователь открывает документ на редактирование, платформа ставит блокировку, чтобы другой пользователь не изменил этот же объект одновременно. Именно она выдаёт сообщение вида «Объект заблокирован пользователем Иванов И.И.»
Когда блокировка снимается автоматически
Основное правило: транзакционная блокировка живёт ровно столько, сколько живёт транзакция. Как только транзакция зафиксирована (выполнен «ЗафиксироватьТранзакцию» или успешно завершилась запись объекта) либо отменена (откат), все блокировки, установленные в её рамках, снимаются немедленно.
Объектная блокировка формы снимается в нескольких случаях: когда пользователь закрывает форму, когда записывает объект и форма снимает редактирование, либо когда сеанс пользователя завершается. Если пользователь просто свернул окно и ушёл — блокировка продолжает держаться, пока жив его сеанс.
При завершении сеанса — штатном выходе из программы, разрыве соединения с таймаутом или принудительном удалении сеанса администратором — все блокировки этого сеанса освобождаются. Именно поэтому «убить зависший сеанс» является универсальным способом снятия зависшей блокировки.
Блокировки транзакции освобождаются сразу после успешной записи
Блокировки снимаются при отмене, изменения не сохраняются
Объектная блокировка редактирования снимается
Все блокировки сеанса освобождаются, включая зависшие
Почему блокировка не снимается: типовые причины
Самая частая причина — зависший сеанс. Пользователь закрыл программу «крестиком» при обрыве сети, компьютер ушёл в сон или клиентский процесс аварийно завершился, но сервер 1С ещё считает сеанс активным. До истечения таймаута блокировки такого сеанса продолжают удерживаться.
Вторая причина — длинная транзакция. Массовая обработка, проведение большого документа, перепроведение за период или обмен данными могут держать блокировки минутами. Для остальных пользователей это выглядит как «зависшая» блокировка, хотя процесс работает штатно.
Третья причина — ошибки в прикладном коде: установленная через «БлокировкаДанных» блокировка внутри транзакции, которая не завершается из-за исключения без корректной обработки, либо цикл ожидания, где сеанс сам ждёт другую блокировку (взаимоблокировка). Взаимоблокировки на уровне СУБД обычно разрешаются сервером автоматически выбором жертвы, но на уровне платформы могут приводить к ошибкам у пользователей.
Как найти сеанс, который держит блокировку
В клиент-серверном варианте откройте консоль кластера серверов 1С, перейдите в раздел «Сеансы» и найдите сеансы с длительным временем бездействия или с признаком «заснувший»/аварийно завершённый клиент. Там же видно, какой пользователь и с какого компьютера держит соединение.
Внутри самой программы (в типовых конфигурациях) используйте раздел «Администрирование — Обслуживание — Активные пользователи». Он показывает список сеансов и позволяет завершить выбранный. Для файловой базы это основной инструмент.
Для глубокой диагностики полезен технологический журнал: включите сбор событий блокировок (LOCK, TLOCK, TDEADLOCK), чтобы увидеть, какие объекты и какие сеансы конфликтуют. На уровне СУБД в MS SQL Server активные блокировки видны через sp_who2 и системные представления sys.dm_tran_locks.
- 1Определите, кто держит блокировку: текст ошибки обычно содержит имя пользователя и компьютер
- 2Попросите пользователя закрыть объект или выйти из программы — самый безопасный способ
- 3Если пользователь недоступен, откройте консоль кластера (Сеансы) или «Активные пользователи» в базе
- 4Убедитесь, что сеанс действительно завис: нет активности, клиент не отвечает
- 5Завершите сеанс принудительно — блокировки снимутся автоматически
- 6Проверьте, что другие пользователи могут работать с объектом
Как снять блокировку принудительно и чем это грозит
Безопасная последовательность всегда начинается с мягких методов: сначала попросить пользователя завершить работу, затем завершить сеанс штатными средствами консоли кластера или списка активных пользователей. Только если это невозможно, прибегают к более жёстким действиям.
Крайняя мера — перезапуск службы сервера 1С или СУБД. Это снимает все блокировки сразу, но обрывает работу всех пользователей и прерывает выполняющиеся фоновые задания. Применять такой способ стоит только при полном зависании сервера и после предупреждения пользователей.
Для файловых баз существует ситуация с «остаточными» блокировками после аварийного завершения: при следующем запуске платформа обычно разрешает их сама, но если база сообщает о блокировке при монопольном доступе — проверьте, что никто не держит базу открытой по сети, и завершите процессы 1С на всех компьютерах.
Как уменьшить количество конфликтов блокировок
Если ошибки «Конфликт блокировок» возникают регулярно, проблема не в конкретном сеансе, а в архитектуре работы. Основные направления: сокращение длительности транзакций, перенос тяжёлых операций в фоновые задания в нерабочее время и включение управляемого режима блокировок в конфигурации, если он ещё не включён.
Для регистров накопления и сведений эффективно разделение итогов и использование свойств вроде «Разделение итогов» там, где это поддерживается конфигурацией. Также помогает последовательное упорядочивание обращений к объектам в коде — когда все процессы блокируют объекты в одном порядке, взаимоблокировки практически исчезают.
Административные меры: настройте таймауты завершения спящих сеансов в свойствах информационной базы в консоли кластера. Тогда «забытые» сеансы пользователей будут завершаться автоматически, и блокировки не будут висеть часами.
Способы снятия блокировки
Самый безопасный способ; подходит, когда пользователь на месте и доступен
Подходит для зависших и забытых сеансов; прерывает работу конкретного пользователя
Крайняя мера при полном зависании; обрывает все сеансы и фоновые задания
Профилактика: автоматически снимает блокировки забытых сеансов без участия администратора
Частые вопросы о блокировках в 1С
Через какое время блокировка снимается сама?
Транзакционная блокировка снимается сразу при завершении транзакции. Блокировка зависшего сеанса держится, пока сеанс жив: либо до таймаута, настроенного в кластере, либо до принудительного завершения администратором. Фиксированного «автоматического срока» без настройки таймаутов нет.
Что означает ошибка «Конфликт блокировок при выполнении транзакции»?
Ваш сеанс попытался изменить данные, которые в этот момент заблокированы другим сеансом, и не дождался освобождения за отведённое время ожидания. Обычно помогает повторить операцию через некоторое время; при регулярном повторении нужно искать длинные транзакции.
Можно ли снять блокировку, не завершая сеанс пользователя?
Только если сам пользователь закроет объект или завершит операцию. Принудительно снять отдельную блокировку чужого активного сеанса штатными средствами платформы нельзя — единственный инструмент администратора это завершение сеанса целиком.
Опасно ли принудительное завершение сеанса для данных?
При завершении сеанса незавершённые транзакции откатываются, поэтому целостность данных на уровне СУБД сохраняется. Риск в другом: прерванная массовая операция (обмен, проведение) может остаться невыполненной, и её придётся запускать заново.
Почему блокировка держится, хотя пользователь вышел из 1С?
Клиентское приложение могло завершиться аварийно, а сервер ещё считает сеанс активным до истечения таймаута. Проверьте список сеансов в консоли кластера: «фантомный» сеанс будет виден там, и его можно завершить вручную.
Как настроить автоматическое завершение забытых сеансов?
В консоли кластера откройте свойства информационной базы и задайте параметры «интервал перезапуска» и таймауты завершения спящих сеансов, либо используйте настройки рабочего сервера. После этого простаивающие сеансы будут сниматься автоматически вместе с их блокировками.
Что важно запомнить
Блокировка в 1С снимается при завершении транзакции, закрытии формы объекта или завершении сеанса. Зависшая блокировка — почти всегда зависший сеанс: найдите его в консоли кластера или списке активных пользователей и завершите. Перезапуск сервера — крайняя мера. Для профилактики настройте таймауты завершения спящих сеансов и сокращайте длинные транзакции.