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