К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как проверить, заблокирован ли объект в 1С

Как проверить, заблокирован ли объект в 1С: метод Заблокирован(), разделители сеанса, консоль кластера, журнал регистрации и способы снятия блокировки.

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

Способ проверки зависит от контекста: внутри кода на встроенном языке используется метод Заблокирован(), для диагностики со стороны администратора — консоль кластера серверов 1С и журнал регистрации, а увидеть, кто редактирует объект, можно прямо из интерфейса при попытке открыть форму. Ниже разобраны все основные сценарии с примерами кода и порядком действий.

Что вообще значит «объект заблокирован» в 1С

Под блокировкой объекта в 1С понимают три разные ситуации, и путать их — частая причина неверной диагностики. Первая — объектный признак «изменён»: объект в памяти текущего сеанса отредактирован, но не записан. Именно это проверяет метод Заблокирован(). Вторая — пользовательская блокировка формы: кто-то открыл объект на редактирование, и при попытке открыть его же вы получите сообщение с именем пользователя и компьютера. Третья — управляемая транзакционная блокировка на уровне СУБД: платформа автоматически блокирует записи при записи объекта в транзакции, и конкурирующий сеанс получает ошибку конфликта блокировок.

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

Проверка в коде: метод Заблокирован()

Метод Заблокирован() доступен у объектов данных (справочников, документов и т. п.) и возвращает булево значение. Важно понимать его семантику: он показывает, что объект изменён в текущем сеансе и изменения не записаны в базу. Он не сообщает, заблокирован ли объект другим пользователем — это принципиально другой вопрос.

Типичный пример использования — проверка перед записью или перед закрытием формы, чтобы не потерять несохранённые изменения:

ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();

ОбъектСправочника.Наименование = "Новое наименование";

Если ОбъектСправочника.Заблокирован() Тогда

Сообщить("Объект изменён, но не записан");

КонецЕсли;

ОбъектСправочника.Записать();

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

bsl
Попытка
    ЗаблокироватьДанныеДляРедактирования(СсылкаНаОбъект);
    // блокировка получена — объект никем не редактируется
    РазблокироватьДанныеДляРедактирования(СсылкаНаОбъект);
Исключение
    Сообщить("Объект редактируется: " + ОписаниеОшибки());
КонецПопытки;

Как узнать, кто редактирует объект, из интерфейса

Самый простой способ без программирования — попробовать открыть объект на редактирование. Если другой пользователь уже открыл его форму в режиме редактирования, платформа покажет сообщение вида «Объект редактируется пользователем Иванов И.И., компьютер WS-012». Этого достаточно, чтобы понять, к кому обращаться, чтобы тот закрыл форму или записал изменения.

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

Порядок действий
  1. 1
    Попробуйте открыть объект на редактирование и зафиксируйте текст сообщения о блокировке
  2. 2
    Найдите указанного пользователя в списке активных пользователей
  3. 3
    Попросите пользователя закрыть форму или записать объект
  4. 4
    Если сеанс завис — завершите его через консоль кластера серверов 1С
  5. 5
    Повторно откройте объект и убедитесь, что блокировка снята

Диагностика управляемых блокировок на сервере

Когда ошибка звучит как «Конфликт блокировок при выполнении транзакции» и возникает при записи, источник — управляемые блокировки СУБД. В клиент-серверном варианте откройте консоль кластера серверов 1С, найдите нужную информационную базу и посмотрите вкладку «Блокировки» — там видно, какие сеансы удерживают блокировки и какие ждут освобождения ресурсов. Это позволяет найти сеанс-виновник, например длительную фоновую операцию.

Дополнительно включите в журнале регистрации отбор по событию с текстом ошибки блокировки: в записи фиксируются пользователь, время и данные, при работе с которыми возник конфликт. Для глубокого анализа на MS SQL Server можно использовать технологический журнал 1С и динамические представления sys.dm_tran_locks, но это уже инструменты администратора СУБД.

Блокировки в файловой и клиент-серверной базе: в чём разница

В файловом варианте 1С консоли кластера нет: блокировками управляет сама платформа внутри файла базы. Диагностика сводится к сообщению при открытии объекта, списку активных пользователей и журналу регистрации. Если файл базы лежит на сетевом диске, «зависшие» блокировки нередко связаны с обрывом соединения клиента — помогает корректный перезапуск сеансов.

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

Сравнение вариантов

Метод Заблокирован() в коде

Подходит для проверки несохранённых изменений в текущем сеансе. Не показывает блокировки других пользователей.

Открытие объекта в интерфейсе

Быстрый способ узнать, кто редактирует объект. Не работает для управляемых транзакционных блокировок.

Консоль кластера серверов

Полная картина блокировок и сеансов, но только для клиент-серверного варианта и с правами администратора.

Журнал регистрации

Показывает факты конфликтов задним числом, удобен для поиска закономерностей, но не даёт снимка текущего состояния.

Типичные ошибки при проверке и снятии блокировок

Самая распространённая ошибка — ожидать от Заблокирован() информации о других пользователях. Метод работает только в рамках текущего сеанса, и опираться на него для проверки «занятости» объекта нельзя. Вторая ошибка — снимать блокировку перезапуском сервера 1С или СУБД: это грубое решение, которое прерывает все активные транзакции и маскирует настоящую причину конфликтов.

Третья типичная проблема — игнорировать повторяющиеся конфликты. Если одна и та же операция регулярно упирается в блокировки, причина обычно в архитектуре: слишком длинные транзакции, запись одного и того же регистра множеством документов, обмены в рабочее время. Здесь проверка блокировки — лишь симптом, а лечить нужно процесс.

Типичные ошибки
01
Использовать Заблокирован() для проверки блокировки другим пользователем — метод показывает только изменения в текущем сеансе
02
Перезапускать сервер для снятия блокировки — обрываются все транзакции, причина конфликта остаётся
03
Завершать сеанс, не проверив выполняемую операцию — риск повредить данные при обмене или закрытии периода
04
Игнорировать повторяющиеся конфликты блокировок — симптом проблем в архитектуре обменов и транзакций

Как убедиться, что проблема решена

После снятия блокировки или завершения конфликтующего сеанса выполните контрольную проверку: откройте объект на редактирование — форма должна открыться без сообщения о другом пользователе. Затем повторите операцию записи, которая завершалась ошибкой конфликта блокировок. Если ошибка не воспроизводится и в журнале регистрации не появляются новые записи о конфликтах, ситуация нормализовалась.

Если блокировка возникает снова через короткое время, зафиксируйте время, пользователя и операцию — эти данные помогут найти источник: регламентное задание, обмен или интеграцию, которая держит объект продолжительное время.

Контрольные точки

Как проверить результат

Открытие объекта на редактирование
Норма

Форма открывается без сообщений о другом пользователе

Тревожный признак

Сообщение «объект редактируется» появляется снова

Повторная запись объекта
Норма

Запись проходит без ошибки конфликта блокировок

Тревожный признак

Ошибка конфликта повторяется

Журнал регистрации после операции
Норма

Новых записей о конфликтах нет

Тревожный признак

Конфликты фиксируются регулярно — ищите источник в регламентных заданиях

Частые вопросы

Можно ли программно узнать, кто именно заблокировал объект?

Да, через попытку вызова ЗаблокироватьДанныеДляРедактирования(): при неудаче текст исключения содержит сведения о сеансе, удерживающем блокировку. Также имя пользователя и компьютер видны в сообщении при открытии объекта в интерфейсе.

Почему Заблокирован() возвращает Ложь, хотя объект явно занят другим пользователем?

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

Что делать, если блокировку держит «зависший» сеанс?

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

Как избежать конфликтов блокировок при обмене данными?

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

Можно ли посмотреть блокировки в файловой базе?

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

Итог

Что важно запомнить

Различайте три вида блокировок: несохранённые изменения в сеансе (метод Заблокирован()), редактирование другим пользователем (видно при открытии объекта) и управляемые транзакционные блокировки (диагностируются через консоль кластера и журнал регистрации). Не снимайте блокировки грубыми методами, не выяснив, какая операция их удерживает.