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

Администрирование · 9 мин

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

Как заблокировать объект в 1С: управляемые блокировки данных, пессимистическая и оптимистическая блокировка, блокировка сеансов базы, разбор ошибок и типовых ситуаций.

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

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

Какие виды блокировок существуют в 1С

Платформа 1С использует два базовых подхода. Пессимистическая блокировка устанавливается заранее — до чтения или изменения данных — и гарантирует, что никто другой не изменит объект, пока блокировка не снята. Оптимистическая блокировка ничего не блокирует заранее: при записи платформа проверяет, не изменилась ли версия объекта с момента чтения, и если изменилась — выдаёт ошибку.

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

Как программно заблокировать объект в коде

Для явной блокировки используется встроенный объект БлокировкаДанных. Создаётся элемент блокировки по пространству блокировок (например, «Справочник.Номенклатура»), задаётся значение поля (ссылка на конкретный элемент), указывается режим — исключительный или разделяемый — и вызывается метод УстановитьБлокировку() внутри транзакции.

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");

ЭлементБлокировки.УстановитьЗначение("Ссылка", ТекущаяНоменклатура);

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

Блокировка.УстановитьБлокировку();

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

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

Как заблокировать объект через метод Заблокировать()

У объектов данных (документов, справочников, элементов планов обмена и др.) есть метод Заблокировать(). Он устанавливает управляемую блокировку на конкретную ссылку и используется, когда объект изменяется вне стандартной записи — например, при длительной обработке, когда нужно гарантировать, что пользователь не откроет и не изменит этот же объект в форме.

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

Что делать при ошибке «Конфликт блокировок при выполнении транзакции»

Эта ошибка означает, что сеанс пользователя попытался заблокировать данные, которые уже удерживает другой сеанс, и не дождался освобождения за отведённое время ожидания. Разовая ошибка в часы пик — норма для нагруженной базы; систематические конфликты указывают на проблему.

Чтобы найти виновника, откройте консоль кластера серверов 1С, выберите базу и посмотрите список сеансов и соединений с СУБД. Ищите сеанс с длительной транзакцией или большим временем вызова СУБД. В файловой базе аналог — пункт «Администрирование → Активные пользователи» в клиенте. Зависший сеанс можно завершить принудительно, предварительно убедившись, что это не активный регламентный процесс.

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

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

Как заблокировать всю информационную базу для обслуживания

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

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

Как проверить, что блокировка работает

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

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

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

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

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

Ошибка конфликта блокировок или ожидание, затем успешная запись

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

Запись проходит мгновенно — блокировка не установлена или снята

Вход пользователя при включённой блокировке сеансов
Норма

Показано сообщение о блокировке, вход запрещён

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

Пользователь входит — блокировка не включена или истекла по времени

Список сеансов после обслуживания
Норма

Активны только сеансы администратора и регламентные

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

Остались пользовательские сеансы — они не были завершены

Частые вопросы о блокировках в 1С

Как снять блокировку объекта, если сеанс завис?

Завершите зависший сеанс через консоль кластера серверов 1С (раздел «Сеансы») или через «Администрирование → Активные пользователи» в файловой базе. После завершения сеанса платформа и СУБД автоматически снимут все его блокировки и откатят незавершённую транзакцию.

Чем отличается исключительный режим блокировки от разделяемого?

Исключительная блокировка запрещает другим сеансам и читать, и изменять данные с установкой блокировок. Разделяемая позволяет другим сеансам тоже ставить разделяемые блокировки (читать с гарантией неизменности), но запрещает исключительные. Для записи данных всегда нужен исключительный режим.

Почему ошибка «Конфликт блокировок» возникает только в часы пик?

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

Можно ли заблокировать объект навсегда, чтобы его никто не изменял?

Штатных «вечных» блокировок нет — они живут только в рамках сеанса или транзакции. Для запрета изменений используют другие механизмы: дату запрета изменения данных, права доступа (роли), признаки пометки на удаление или собственные проверки в подписках на события записи.

Опасно ли принудительно завершать сеансы пользователей?

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

Итог

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

Программная блокировка объекта делается через БлокировкаДанных внутри транзакции или метод Заблокировать() в управляемом режиме. Ошибка «Конфликт блокировок» лечится поиском и завершением зависшего сеанса, а при повторениях — анализом транзакций. Для обслуживания базы используется блокировка сеансов с кодом разрешения, предварительно сделайте резервную копию.