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