воскресенье, 14 января 2018 г.

Управление объектными блокировками

Механизм объектных блокировок обеспечивает конкурентный доступ пользователей к объектам базы, в терминах прикладного решения.
Различают два варианта объектных блокировок: оптимистический и пессимистический. Оптимистическая блокировка предполагает по сути проверку перед записью объекта, не изменился ли он за то время, что был открыт в данном сеансе; проверка основывается на сверке номера версии объекта в момент считывания, и номера версии объекта,хранящегося в базе данных. Если они различаются, то записать объект не получится, пользователь получит сообщение:
Пессимистическая блокировка выполняется целенаправленно, для запрета изменения данных в текущем или иных сеансах. Она гарантирует, что внесенные пользователем изменения запишутся в информационную базу. Есть два варианта установки пессимистической блокировки:
  • блокировка при редактировании в форме - это стандартная возможность расширения форм 1С:Предприятие. Пока форма открыта, попытка ее изменить в другом или этом сеансе будет неуспешна. Это справедливо не для всех реквизитов формы, а лишь для тех, что отмечены флажком Сохраняемые данные:
  • использование метода встроенного языка Заблокировать(). Метод существует у объектов ДокументОбъект, СправочникОбъект и т.д. Может использоваться при изменении объектов без открытия форм например. Попытка блокировки пессимистически заблокированного объекта вызовет исключение, которое может быть обработано конструкцией "Попытка... Исключение... КонецПопытки". Снимается блокировка объекта методом Разблокировать(), причем разблокироваться должен тот самый экземпляр объекта, что и блокировался. Сообщение пользователю при пессимистической блокировке:

***
Вопрос 06.52 экзамена 1С:Профессионал по платформе. Пессимистическая блокировка объекта (метод Заблокировать()):
  1. не позволяет интерактивно (в основной форме объекта) менять данные объекта
  2. позволяет интерактивно (в основной форме объекта) менять данные объекта, но только если он заблокирован через какую-либо другую форму
  3. блокировка объекта не мешает интерактивно (в основной форме объекта) менять данные объекта
Правильный ответ первый, разбор выше.

***
Вопрос 06.51 экзамена 1С:Профессионал по платформе. Пессимистическая блокировка объекта (метод Заблокировать()):
  1. не позволяет программно менять данные объекта
  2. позволяет программно менять данные объекта, но только если он заблокирован через ту же переменную, через которую и будет производиться изменение данных объекта
  3. блокировка объекта не мешает программно менять данные объекта
Правильный ответ третий - блокировка не мешает программно удалять или менять объект. Пользователь первого сеанса получит в результате сообщение как при оптимистической блокировке, "Операция не может быть выполнена из-за несоответствия версии...". Для гарантированной защиты, нужно проработать один из вариантов во втором сеансе:
  • изменению объекта должна также предшествовать попытка блокировки этого же объекта
  • нужно использовать метод Заблокирован() (но проверяет он заблокированность только внутри текущего сеанса, а не вообще)

9 комментариев:

  1. А в чем разница между этими вопросами?

    ОтветитьУдалить
    Ответы
    1. В одном из вопросов должна быть оптимистическая блокировка

      Удалить
    2. Нет, различия лишь в ответах.

      Удалить
  2. Чета ерунда какая-то в 06.51.
    Пишу код:
    НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
    НоменклатураОбъект.Заблокировать();
    НоменклатураОбъект.Наименование = НоменклатураОбъект.Наименование + "_1";
    НоменклатураОбъект.Записать();
    Ставлю точку останова на строке
    НоменклатураОбъект.Наименование = НоменклатураОбъект.Наименование + "_1"
    вызываю сессию 1 и останавливаюсь на точке останова
    Во второй сессии вызываю этот же код для той же номенеклатуры и получаю:
    "Не удалось заблокировать запись...". Вопрос, о каком программном изменении идет речь в третьем ответе?

    ОтветитьУдалить
    Ответы
    1. Согласен, я бы ответил что программно можно, но только через ту переменную, через которую заблокирован. По-моему 2.

      Удалить
    2. Так ты сделал то, что указано в конце поста. Если при программном изменение ты бы не накладывал блокировку - то и ограничений бы не было.

      Удалить
  3. В 6.52 неясность..
    Причём тут метод Заблокировать, если речь идёт об интерактивной работе?

    ОтветитьУдалить
  4. вопрос 6.52 поменялся:

    6.52 Если объект заблокирован (с помощью метода Заблокировать()), и система взаимодействия доступна, то в автоматически созданной платформой
    форме объекта
    1. нельзя изменять данные этого объекта
    2. можно изменять данные, но только если он заблокирован через какую-либо другую
    форму
    3. можно изменять данные, но при этом будут утеряны изменения сделанные другим
    пользователем
    4. можно, без каких-либо условий

    правильный ответ - вариант 3, проверено в официальном тренажере 1с.
    также вот ссылка на статью в итс: https://its.1c.ru/db/v8315doc#bookmark:dev:TI000000524 и скрин из статьи: https://prnt.sc/d2HfuoAu1EK3

    ОтветитьУдалить
  5. Для проверки заблокирован ли объект (пессимистическая блокировка) необходимо использовать метод:
    Заблокирован
    Заблокировать
    ЗаблокироватьДанныеФормыДляРедактирования
    Варианты 2 или 3

    Ответ - 4. Проверено 1с тренажер.

    ОтветитьУдалить