Как узнать, какой пользователь заблокировал объект в 1С:Предприятии?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе многопользовательской работы в системе 1С:Предприятие часто возникает ситуация, когда один пользователь не может записать или изменить объект, так как он уже занят (заблокирован) другим коллегой. Стандартное сообщение системы не всегда дает исчерпывающий ответ «в моменте», особенно если блокировка происходит программно. В этой статье мы подробно разберем, как вычислить «виновника» блокировки, используя различные инструменты: от простого программного кода до глубокого анализа на уровне сервера.

Метод 1. Программный перехват исключения (Пессимистическая блокировка)

Рассмотрим ситуацию, когда нам нужно программно попытаться заблокировать объект и, в случае неудачи, вывести информацию о том, кто его удерживает. Этот метод основан на использовании конструкции Попытка — Исключение. При попытке вызвать метод Заблокировать() для объекта, который уже занят другим пользователем, платформа генерирует ошибку. Текст этой ошибки содержит имя пользователя, имя компьютера и время блокировки. Для реализации более сложной логики, например, когда требуется выполнение произвольной функции в монопольном режиме с получением информации о блокирующем пользователе, можно использовать специализированные подсистемы.

Проанализируем пример функции, которая возвращает истину, если объект заблокирован, и выводит подробное сообщение:


Функция ОбъектЗаблокирован(Объект, СтрокаОшибки) Экспорт 
    Попытка
        // Пытаемся установить пессимистическую блокировку
        Объект.Заблокировать();
    Исключение
        // Если произошла ошибка, извлекаем описание
        СтрокаОписаниеОшибки = СокрЛП(ОписаниеОшибки());
        НашлиПоз = Найти(СтрокаОписаниеОшибки, "Не удалось заблокировать запись");
        
        Если НашлиПоз > 0 Тогда
            // Формируем понятное сообщение для пользователя
            СтрокаОшибки = СокрЛП(Объект) + ": " + Сред(СтрокаОписаниеОшибки, НашлиПоз);
        Иначе    
            СтрокаОшибки = СокрЛП(Объект) + ": " + СтрокаОписаниеОшибки;
        КонецЕсли; 

        #Если Клиент Тогда
            Сообщить(СтрокаОшибки, СтатусСообщения.Важное);
        #КонецЕсли

        Возврат Истина; // Объект действительно кем-то занят
    КонецПопытки;    
    
    Возврат Ложь; // Блокировка успешно установлена нами
КонецФункции

Важный нюанс: Поиск подстроки "Не удалось заблокировать запись" может зависеть от локализации платформы и её версии. В современных версиях 1С (начиная с 8.3) рекомендуется использовать объект ИнформацияОбОшибке(), чтобы получить более структурированные данные, однако текстовый парсинг остается самым быстрым способом «быстрой отладки».

Метод 2. Использование встроенных функций платформы

Выясним, какие еще штатные средства предоставляет 1С. Для некоторых типов объектов в старых версиях существовал метод ЗаблокированКем(). В актуальной платформе 8.3 для программного анализа интерактивных блокировок можно использовать метод Заблокирован(), но он возвращает лишь булево значение. Если же блокировка установлена в рамках транзакции (управляемая блокировка), программно получить имя пользователя внутри того же сеанса через простые методы объекта невозможно.

Метод 3. Анализ через консоль кластера серверов

Разберем административный подход, который является наиболее точным для клиент-серверного варианта базы. Если объект «завис» и не отпускается, системному администратору или ведущему разработчику следует выполнить следующие шаги:

  1. Откройте Консоль администрирования серверов 1С:Предприятия.
  2. Перейдите в раздел Блокировки вашей информационной базы.
  3. В списке вы увидите все активные блокировки. Обратите внимание на колонки «Сеанс», «Объект метаданных» и «Значение блокировки».
  4. Найдя нужный объект (например, по ссылке или идентификатору), вы сможете увидеть номер сеанса.
  5. Перейдите в раздел Сеансы, найдите этот номер и увидите имя пользователя, его компьютер и время начала работы.

Этот способ позволяет идентифицировать не только пессимистические блокировки, но и транзакционные. Для удобства администрирования часто используется полноценный центр администрирования 1С, который позволяет управлять сеансами и блокировками прямо из интерфейса системы.

Метод 4. Программный доступ к блокировкам через «Информацию о сеансах»

Посмотрим, как автоматизировать процесс поиска «виновника» без захода в консоль. Мы можем использовать встроенные механизмы администрирования через COM или встроенный язык (в последних версиях платформы через объект МенеджерКластера).

Используя метод ПолучитьБлокировкиСеанса(), можно программно перебрать все текущие блокировки в базе. Это требует прав администратора, но позволяет создать удобную обработку для обычных пользователей. В частности, эффективная консоль активности пользователей помогает быстро разобраться, кто занимает лицензии и какие объекты удерживает в данный момент.

Метод 5. Использование Технологического журнала (ТЖ)

Проанализируем ситуацию, когда блокировки кратковременные, но мешают работе («ошибка ожидания блокировки»). В этом случае нам поможет настройка и анализ Технологического журнала. В файле logcfg.xml следует настроить сбор событий TLOCK.

В логах ТЖ будет зафиксирована следующая информация:

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

Метод 6. Мониторинг на уровне SQL Server

Если ваша база работает на MS SQL Server, мы можем заглянуть «под капот», выполнив анализ транзакционных блокировок на уровне СУБД. Когда управляемые блокировки 1С не используются (или используются совместно с блокировками СУБД), можно выполнить SQL-запрос к системному представлению sys.dm_tran_locks.

Чтобы не писать сложные запросы вручную, можно анализировать SQL сервер глазами 1С-ника с помощью готовых обработок, которые конвертируют SQL-данные в понятные 1С-объекты. Это позволит увидеть SPID блокирующего соединения и сопоставить его с номером соединения в консоли 1С.

Подведем итоги

Для оперативного решения проблемы программисту проще всего использовать метод Попытка — Исключение с анализом текста ошибки. Администратору же стоит ориентироваться на Консоль кластера серверов или отчеты Библиотеки Стандартных Подсистем (БСП) в разделе «Активные пользователи».

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

← На главную