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

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

Как заблокировать записи регистра сведений в 1С

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

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

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

Ниже разобраны оба сценария с конкретным кодом, условиями выбора и способами проверки результата. Материал ориентирован на конфигурации с управляемым режимом блокировок, но отличия автоматического режима также указаны.

Что понимать под блокировкой регистра сведений

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

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

Как проверить режим блокировок в конфигурации

Прежде чем писать код, откройте свойства конфигурации в конфигураторе и посмотрите параметр «Режим управления блокировкой данных». Возможны три значения: «Автоматический», «Управляемый» и «Автоматический и управляемый». В типовых конфигурациях почти всегда установлен управляемый режим.

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

Ошибка «Конфликт блокировок»Конкурентный доступ

Два процесса пишут одни записи — нужна управляемая блокировка

Пользователи правят старые данныеОрганизационная проблема

Нужна дата запрета изменения или настройка ролей, а не блокировка

Дубли записей с одинаковыми измерениямиОтсутствует блокировка при чтении

Код читает и пишет без установки блокировки перед проверкой существования

Программная блокировка записей через БлокировкаДанных

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

НачатьТранзакцию();

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

ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КурсыВалют");

ЭлементБлокировки.УстановитьЗначение("Валюта", ВалютаСсылка);

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

Блокировка.Заблокировать();

// чтение и запись набора записей

ЗафиксироватьТранзакцию();

Блокировка снимается автоматически при завершении транзакции — вручную снимать её не нужно и нельзя. Если вызвать Заблокировать() вне транзакции, платформа выдаст ошибку. Всегда оборачивайте блокировку и работу с данными в конструкцию НачатьТранзакцию() / Попытка ... Исключение ОтменитьТранзакцию().

Блокировка по диапазону значений

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

Разделяемый режим блокировки

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

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

Запрет редактирования записей для пользователей

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

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

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

Сравнение способов запрета

Управляемая блокировка

Защита от конкурентного доступа в транзакции; не подходит для запрета пользователям

Роли и права

Постоянный запрет для групп пользователей; не учитывает даты и условия без RLS

Дата запрета изменения

Закрытие периода целиком; требует механизма БСП в типовых

Подписка ПередЗаписью

Гибкие условия по данным записи; требует доработки и тестирования

Типичные ошибки и как их избежать

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

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

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

Проверка результата и диагностика конфликтов

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

Для диагностики включите технологический журнал с событиями TLOCK и TDEADLOCK — они покажут, какие блокировки устанавливаются и где возникают взаимоблокировки. Взаимоблокировка (deadlock) обычно означает, что разные процедуры блокируют ресурсы в разном порядке; лечится единым порядком обхода объектов во всём коде.

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

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

Параллельная запись одних измерений
Норма

Второй сеанс ждёт и завершается без дублей

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

Появляются дубли или необработанная ошибка СУБД

Параллельная работа с разными измерениями
Норма

Оба сеанса выполняются одновременно

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

Сеансы блокируют друг друга — слишком широкая область

Техножурнал
Норма

Нет событий TDEADLOCK

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

Повторяющиеся взаимоблокировки

Часто задаваемые вопросы

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

Блокировки для этого не предназначены — они существуют только внутри транзакции. Для постоянного запрета используйте настройку ролей (убрать права на добавление и изменение), дату запрета изменения данных или проверку в подписке ПередЗаписью с отказом от записи.

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

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

Нужно ли блокировать регистр при простом чтении без записи?

Если результат чтения не влияет на последующую запись — нет, лишняя блокировка только снизит параллельность. Если по результату чтения принимается решение о записи (проверка существования, расчёт нового значения) — блокировка обязательна, иначе данные могут измениться между чтением и записью.

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

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

Работает ли БлокировкаДанных в файловой базе?

Механизм работает и в файловом варианте, но конкурентная запись там ограничена самой архитектурой, поэтому конфликты проявляются иначе. Основная польза управляемых блокировок раскрывается в клиент-серверном режиме с СУБД, где одновременно работают многие сеансы.

Как заблокировать записи только за определённый период в периодическом регистре?

Для программной блокировки используйте источник данных элемента блокировки с отбором по полю Периода. Для организационного запрета по периоду применяйте дату запрета изменения данных — она закрывает редактирование всех записей раньше указанной даты.

Итог

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

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