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