Смекни!
smekni.com

Обработка ошибочных ситуаций во встроенном языке системы 1С:Предприятие 7.7 (стр. 2 из 2)

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

Спр = СоздатьОбъект("Справочник.Товары");

Спр.ВыбратьЭлементы();

Пока Спр.ПолучитьЭлемент() = 1 Цикл

Пока Спр. Спр.Блокировка(1) = 0 Цикл

Если Вопрос("Элемент справочника заблокирован! Повторить попытку?",

"Да+Нет") = "Нет" Тогда

Возврат;

КонецЕсли;

КонецЦикла;

// Модифицируем реквизиты элемента справочника

Спр.Записать(); // Записываем измененный элемент справочника

КонецЦикла;

Следует обратить внимание, что после записи модифицированного элемента справочника не производится снятия блокировки в явном виде. В этом нет необходимости, так как блокировка автоматически снимается при переходе к следующему элементу с помощью метода ПолучитьЭлемент().

Механизм "оптимистических" блокировок предназначен для обеспечения непротиворечивости модификации объектов базы данных. Работают "оптимистические" блокировки полностью автоматически. Отличие "оптимистических" блокировок от "пессимистических" можно пояснить на примере. Предположим имеется задача модификации справочника Товары (например, пересчет цен). Для выполнения этой задачи может использоваться одна из двух имеющихся специальных обработок. Каждая из них последовательно обходит элементы справочника и модифицирует их. Однако первая, подобно тому, как это было показано в приведенном выше примере перед модификацией блокирует элемент справочника, а вторая такой блокировки не производит.

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

Действия Экземпляра 1 Действия Экземпляра 2 Результат
ПолучитьЭлемент() ОК
ПолучитьЭлемент() ОК
Блокировка(1)
Записать() Ошибка!
Записать() ОК

Из приведенной таблицы видно, что Экземпляр 2 не смог произвести запись элемента справочника, заблокированного Экземпляром 1. Сработал механизм "пессимистической" блокировки. Аналогично, если бы оба экземпляра системы 1С:Предприятие пользовались первым вариантом обработки, то Экземпляр 2 не смог бы заблокировать элемент справочника.

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

Действия Экземпляра 1 Действия Экземпляра 2 Результат
ПолучитьЭлемент() ОК
ПолучитьЭлемент() ОК
Записать() Ошибка!
Записать() ОК

Ошибка, которая происходит при записи элемента справочника Экземпляром 2 и является следствием работы механизма "оптимистических" блокировок. Как было упомянуто выше, задачей механизма "оптимистических" блокировок является обеспечение непротиворечивости модификации объектов базы данных. В данном же случае имеет место следующее. Экземпляр 2 считал элемент справочника и приступил к его модификации. В это время Экземпляр 1 успел считать, модифицировать и записать этот же элемент справочника. Когда Экземпляр 2 приступил к выполнению операции записи, значения реквизитов элемента справочника уже отличались от тех, которые были считаны перед модификацией. И в данной ситуации запись элемента справочника может привести к некорректным результатам, так как в общем случае, модификация реквизитов может производиться исходя из их предшествующего состояния, которое оказалось изменившимся.

Таким образом, можно сформулировать различия в логике функционирования двух рассматриваемых механизмов блокировок. Логика механизма "оптимистических" блокировок исходит из предположения (оптимистического), что в промежутке между считыванием и записью измененного состояния объекта вероятность того, что этот же объект будет изменен кем-то другим невелика. Логика же механизма "пессимистических" блокировок в соответствии с их названием исходит из того, что случиться может всякое и лучше, если объект будет гарантированно защищен от посторонних изменений.