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

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

Управляемые блокировки в 1С: суть, настройка и практика

Что такое управляемые блокировки в 1С, чем они отличаются от автоматических, как включить режим в конфигураторе и избежать ошибок взаимоблокировок.

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

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

Чем управляемые блокировки отличаются от автоматических

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

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

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

Сравнение режимов блокировок

Автоматический режим

Платформа сама управляет блокировками через СУБД. Подходит для небольших баз с низкой конкуренцией, но склонен к избыточным блокировкам и эскалации до уровня таблицы.

Управляемый режим

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

Смешанный режим

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

Как включить управляемый режим в конфигурации

Режим блокировок настраивается в конфигураторе. Откройте свойства корневого узла конфигурации и найдите свойство «Режим управления блокировкой данных». Доступны три значения: «Автоматический», «Управляемый» и «Автоматический и управляемый». Третий вариант означает, что для конфигурации в целом действует управляемый режим, но для конкретных объектов (документов, регистров) можно задать автоматический через одноимённое свойство объекта метаданных.

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

Как программно установить управляемую блокировку

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

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

bsl
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.УстановитьЗначение("Номенклатура", Товар);
Элемент.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();
// далее чтение остатков и запись движений
ЗафиксироватьТранзакцию();

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

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

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

Типичные конфликты и взаимоблокировки

Взаимоблокировка (deadlock) возникает, когда две транзакции захватили разные ресурсы и каждая ждёт освобождения ресурса другой. Классический сценарий: транзакция А заблокировала товар 1 и ждёт товар 2, транзакция Б заблокировала товар 2 и ждёт товар 1. Платформа обнаруживает такую ситуацию и принудительно завершает одну из транзакций с ошибкой.

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

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

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

Основные инструменты диагностики — технологический журнал и консоль кластера серверов 1С. В технологическом журнале события TLOCK, TDEADLOCK и TTIMEOUT показывают, какие блокировки устанавливались, где возникли взаимоблокировки и превышения времени ожидания. В консоли кластера видны текущие сеансы и их блокировки, что позволяет найти «зависший» сеанс, удерживающий ресурс.

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

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

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

Технологический журнал после доработки
Норма

События TDEADLOCK и TTIMEOUT исчезли или стали единичными

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

Взаимоблокировки повторяются на тех же объектах — порядок блокирования не выровнен

Параллельное проведение документов
Норма

Документы по разным товарам/контрагентам проводятся одновременно без ожиданий

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

Даже непересекающиеся документы ждут друг друга — блокировка слишком широкая

Корректность данных
Норма

Остатки и итоги сходятся при параллельной нагрузке

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

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

Когда обращаться к специалисту

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

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

Итог

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

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

Частые вопросы

Чем управляемая блокировка отличается от объектной блокировки «Данные изменены другим пользователем»?

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

Можно ли снять управляемую блокировку до конца транзакции?

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

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

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

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

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

Работают ли управляемые блокировки в файловой базе?

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

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

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