При разработке высоконагруженных систем, работающих в многопоточном режиме, программисты часто сталкиваются с необходимостью явного управления блокировками данных. Одной из частых ошибок, возникающих при попытке заблокировать объект по пользовательскому реквизиту, является сообщение: «У пространства блокировок <имя объекта> не существует поля с именем <имя поля>». Давайте разберем, почему система выдает такое предупреждение и как правильно настроить конфигурацию для корректной работы блокировок.
Механизм управляемых блокировок в платформе 1С предназначен для обеспечения целостности данных при параллельной записи в базу. Однако платформа не может «знать» обо всех ваших реквизитах, созданных в справочниках или документах, в контексте подсистемы блокировок. Чтобы использовать реквизит для установки блокировки через объект БлокировкаДанных, необходимо явно разрешить платформе использовать этот атрибут в качестве критерия блокировки.
Если вы попытаетесь установить значение для произвольного реквизита, не зарегистрированного в специальном списке, вы неизбежно получите ошибку отсутствия поля. Рассмотрим пошагово, как это исправить:
СтруктураПредприятия).Ссылка. Нажмите кнопку добавления (или «Добавить») и выберите из списка ваш реквизит, например, mdm_key.После выполнения этих действий платформа проиндексирует данное поле для целей блокировки, и ошибка при выполнении кода исчезнет.
Теперь, когда поле зарегистрировано в системе метаданных, мы можем корректно использовать объект БлокировкаДанных. Рассмотрим правильный пример программной реализации:
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("Справочник.СтруктураПредприятия");
Элемент.УстановитьЗначение("mdm_key", MDM_KEY);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Обратите внимание: метод УстановитьЗначение принимает имя поля так, как оно указано в свойствах «Поля блокировки данных», без префикса имени объекта. Также важно помнить, что вызов метода Заблокировать() эффективен только в том случае, если он выполняется внутри открытой транзакции. Для проверки наложенных в реальном времени управляемых блокировок можно использовать инструмент для просмотра заблокированных строк.
Для обеспечения стабильной и быстрой работы системы при многопоточной записи данных, проанализируем следующие моменты:
ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(), все блокировки, полученные в рамках этого блока, автоматически снимаются платформой.РежимБлокировкиДанных.Исключительный гарантирует, что ни один другой пользователь или фоновое задание не сможет не только изменить, но и даже прочитать данные в режиме ожидания, пока ваша транзакция не завершится. Это лучший способ борьбы с дублями при высоконагруженной загрузке данных.Применяя данные рекомендации, вы сможете эффективно защитить справочные данные от коллизий и обеспечить стабильную работу многопоточных обменов в вашей системе 1С.