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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Понимание природы управляемых блокировок

Механизм управляемых блокировок в платформе 1С предназначен для обеспечения целостности данных при параллельной записи в базу. Однако платформа не может «знать» обо всех ваших реквизитах, созданных в справочниках или документах, в контексте подсистемы блокировок. Чтобы использовать реквизит для установки блокировки через объект БлокировкаДанных, необходимо явно разрешить платформе использовать этот атрибут в качестве критерия блокировки.

Шаг 1: Настройка метаданных «Поля блокировки данных»

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

  1. Откройте Конфигуратор и перейдите в ветку метаданных объекта (в нашем примере это справочник СтруктураПредприятия).
  2. В окне свойств объекта найдите раздел «Поля блокировки данных».
  3. По умолчанию там присутствует поле Ссылка. Нажмите кнопку добавления (или «Добавить») и выберите из списка ваш реквизит, например, mdm_key.
  4. Сохраните конфигурацию и обновите базу данных.

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

Шаг 2: Реализация кода блокировки

Теперь, когда поле зарегистрировано в системе метаданных, мы можем корректно использовать объект БлокировкаДанных. Рассмотрим правильный пример программной реализации:


Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("Справочник.СтруктураПредприятия");
Элемент.УстановитьЗначение("mdm_key", MDM_KEY);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

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

Важные рекомендации при работе с блокировками

Для обеспечения стабильной и быстрой работы системы при многопоточной записи данных, проанализируем следующие моменты:

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

← На главную