Управляемые блокировки в 1С 8.3

Курс

Зачем нужны блокировки

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

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

Другой пример, когда при проведении расходной накладной сразу рассчитывается себестоимость проданного товара. В первой расходной накладной было 1000 строк, среди которых также был один стол. Во второй накладной была только одна строка со столом. При расчете себестоимости используется партионный учет и первый стол был значительно дешевле второго. А следовательно будет выше прибыль менеджера. Первый менеджер первым начал проводить большую накладную, однако пока она проводилась второй менеджер успел провести накладную с одной строкой и списал более дешевый стол. Хотя по факту он позже начал проводить свой документ.

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

Автоматические блокировки

До версии платформы 8.1 использовался автоматический режим управления блокировкой данных. В данном режиме использовались только блокировки СУБД. Все ожидания на блокировках тоже были только на СУБД.

Автоматический режим имел ряд недостатков:

  • По вине СУБД могли присутствовать излишние блокировки
  • Блокировка на чтение удерживалась до конца транзакции
  • При использовании СУБД-версионников блокировалась вся таблица
  • Могла блокироваться пустая таблица, в итоге никто не мог в нее ничего записать

Поэтому начиная с версии платформы 8.1 появились управляемые блокировки.

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

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

Доступны три режима:

  • Автоматический
  • Управляемый
  • Автоматический и управляемый

Если выбрать Автоматический и управляемый, то в свойствах объекта метаданных можно выбрать режим управления блокировкой данных для конкретного объекта:

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

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

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

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

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

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

На сервере 1С есть собственный менеджер блокировок. Блокировка сначала устанавливается на сервере 1С и только потом на СУБД. Если конфликт блокировок возникнет на сервере 1С, то СУБД даже не узнает о нем.

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

Минусы управляемого режима:

  • Повышается нагрузка на сервер 1С
  • Программисту приходится вручную устанавливать блокировки

Управляемые блокировки могут быть установлены только внутри транзакции. Блокировка всегда держится до конца транзакции.

Типы управляемых блокировок

Управляемые блокировки могут быть двух типов:

  • Разделяемая (блокировка для чтения)
  • Исключительная (блокировка для изменения)

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

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

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

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

Блокировки будут несовместимы при одновременном выполнении следующих условий:

  • Блокировки установлены разными транзакциями
  • Блокировки установлена на один и тот же ресурс
  • Блокировки имеют несовместимые типы

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

Явные и неявные управляемые блокировки

Управляемые блокировки могут быть явными и неявными.

Неявная управляемая блокировка устанавливается в следующих случаях:

  • При изменении данных в базе: запись, удаление, проведение и т.п. Устанавливается исключительная блокировка.
  • При чтении набора записей регистров методом Прочитать. Устанавливается разделяемая блокировка.

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

Явная управляемая блокировка устанавливается с помощью программного объекта БлокировкаДанных:

С помощью метода Добавить в блокировку добавляются новые элементы блокировки, где параметром указывается пространство блокировки. Пространство — это тот объект, в котором будет блокироваться какое-то значение. В данном примере это регистр накопления ОстаткиТоваров.

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

Методом УстановитьЗначение устанавливается значение, которое нужно будет заблокировать. В данном примере это значение измерения Товар.

Сама блокировка устанавливается при вызове метода Заблокировать. При окончании транзакции блокировка будет снята.

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

Если попробовать установить явную блокировку не в транзакции, то будет выброшено исключение «Использование блокировки допустимо только внутри транзакции в режиме управляемых блокировок!».

В одной блокировке может быть сразу несколько элементов:

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

Для объектных данных (справочник, документ и т.п.) это поле Ссылка:

Если попытаться установить блокировку по другому полю, например по артикулу, то будет получена ошибка «У пространства блокировок Справочник.Товары не существует поля с именем Артикул».

Однако на закладке Прочее можно указать дополнительные поля, по которым можно будет установить блокировку:

Поля блокировки данных

Теперь можно устанавливать блокировку по полю артикул. Будут заблокированы все товары с указанным артикулом:

Стоит отметить, что теперь по полю артикул также будет выполняться неявная блокировка при записи в базу данных. Причем при изменении артикула блокировка будет установлена как по старому значению, так и по новому.

В качестве полей блокировки данных нельзя выбирать поля с типом:

  • Строка неограниченной длины
  • Хранилище значения
  • Тип значения плана видов характеристик

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

Регистр сведений и регистр накопления можно блокировать по периоду (только для периодического регистра сведений) и по измерениям:

Если указать пространство, но не указать поля, то будет заблокирован весь регистр:

Для регистра бухгалтерии помимо периода и измерений также можно указать поля:

  • ВидДвижения
  • Счет
  • Субконто
  • ВидСубконто

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

Эскалация блокировок

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

Однако и в клиент-серверном режиме иногда может быть заблокирована вся таблица. Такая ситуация называется эскалацией блокировок. Эскалация сработает если будет наложено более 100 000 элементов блокировок на одно пространство. Элементы блокировок складываются. Если сначала наложить 90 000 элементов, а потом еще 11 000, то сработает эскалация.

В версии платформы 8.2 эскалация выполнялась при достижении порога в 20 000 элементов блокировок на одно пространство.

Изменить пороговые значения нельзя.

Время ожидания на блокировке

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

Данное значение можно изменить. Для этого нужно в конфигураторе в верхнем меню выбрать Администрирование -> Параметры информационной базы:

Параметры информационной базы

В открывшемся окне в поле Время ожидания блокировки данных (в секундах) ввести нужное значение:

Время ожидания блокировки данных

Блокировки в запросе

При выполнении запроса не накладывается управляемая блокировка. Даже если запрос выполнить в транзакции. То же самое качается если от ссылки через точку получить значение реквизита или вызвать метод ПолучитьОбъект.

Иногда в запросах можно встретить ключевое слово ДЛЯ ИЗМЕНЕНИЯ:

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

Если в управляемом режиме блокировок выполнить запрос с ключевым словом ДЛЯ ИЗМЕНЕНИЯ, то никаких дополнительных блокировок не будет.


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok